Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/100: Рейтинг темы: голосов - 100, средняя оценка - 4.86
26 / 2 / 0
Регистрация: 04.04.2012
Сообщений: 34
1

Макрос для вставки макроса в Excel

10.07.2012, 13:07. Показов 20362. Ответов 17
Метки нет (Все метки)

Собственно, вопрос в названии. Можно ли написать макрос, который будет добавлять другой макрос в другой файл?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2012, 13:07
Ответы с готовыми решениями:

Макрос для автоматической вставки фото в лист Excel
Подскажите макрос вставить фото как фон к примечанию в Excel. Пример в файле. Фото в столбце 2.

Макрос вставки изображений в Excel
Добрый день, уважаемые форумчане. Помогите, пожалуйста, с написанием макроса. Задача: на рабочем...

Мне необходимо из макроса Excel запустить макрос Word.
Мне необходимо из макроса Excel запустить макрос Word. Вот описание макроса Word: Public Sub...

Как запустить из макроса Excel макрос в файле Visio
Есть задача запустить из макроса в Excel Visio, загрузить файл vsd и запустить макрос из файла vsd.

17
1300 / 402 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
10.07.2012, 13:37 2
Лучший ответ Сообщение было отмечено как решение

Решение

Код по вставке модуля в активную книгу. В примере модуль находится на Рабочем столе и представляет из себя файл с расширением bas. Файл с модулем можно получить так:
  1. перейдите в VBA;
  2. щ. по модулю, который надо сохранить в виде файла;
  3. File - Import File....
Visual Basic
1
2
3
4
5
6
7
8
9
Sub Procedure_1()
 
    'Здесь нужно указать, где находится файл с модулем.
    Const sFileName As String = "C:\Documents and Settings\Пользователь\Рабочий стол\Module2.bas"
 
    'Добавление модуля в активную книгу.
    ActiveWorkbook.VBProject.VBComponents.Import Filename:=sFileName
 
End Sub
5
здесь больше нет...
3357 / 1669 / 184
Регистрация: 03.02.2010
Сообщений: 1,219
10.07.2012, 13:49 3
Лучший ответ Сообщение было отмечено как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Const z As String = vbNewLine
 
Dim n As Integer: n = 20
 
' -------------------------------------------------------------------
' --- в модуль "ЭтаКнига" -------------------------------------------
Dim s As String
s = ""
s = s & "Option Explicit" & z & z
 
s = s & "Private Sub Workbook_Open()" & z & z
 
s = s & "    If Environ(""UserName"") = ""pupkin"" Then" & z
s = s & "        Cells(1, " & n & ").EntireColumn.Hidden = False" & z
s = s & "    End If" & z
s = s & "End Sub"
 
Dim vbComp As VBComponent
Set vbComp = ThisWorkbook.VBProject.VBComponents("ЭтаКнига")
 
With vbComp.CodeModule
    .InsertLines .CountOfLines + 1, s
End With
 
Set vbComp = Nothing
' --- в модуль "ЭтаКнига" -------------------------------------------
' -------------------------------------------------------------------
1
Эксперт WindowsАвтор FAQ
17800 / 7536 / 889
Регистрация: 25.12.2011
Сообщений: 11,291
Записей в блоге: 16
11.07.2012, 03:10 4
Лучший ответ Сообщение было отмечено как решение

Решение

1. Экспорт модуля проекта в файл
2. Импорт модуля проекта из файла
3. Импорт модуля через организатор(данный код только для Word приложения)
4. Вставка новых строк в модуль проекта

5. Удаление строк из модуля
6. Чтение строк из модуля
7. Определение количества строк в модуле
8. Переименование модулей проекта
9. Удаление модулей проекта
10. Определение количества модулей в проекте
11. Создание нового модуля проекта

Обработка модулей VBA программно


Под "ИмяПроекта" в программной конструкции подразумевается соответствующий объект. Для связи с книгой Excel предназначен объект - Workbooks("Имя книги"), а для связи с документом Word объект - Documents(“Имя документа”). Объект для связи с документом, который содержит общие макросы приложения Word, имеет имя: NormalTemplate, в Excel приложении данный объект записывается следующим образом: Workbooks("PERSONAL").

Экспорт модуля проекта в файл
Visual Basic
1
ИмяПроекта.VBProject.VBComponents.Item("Имя модуля").Export "Путь и ИмяФайла"
Импорт модуля проекта из файла
Visual Basic
1
ИмяПроекта.VBProject.VBComponents.Import  "Путь и ИмяФайла"
Импорт модуля через организатор(данный код только для Word приложения)
Visual Basic
1
2
3
Application.OrganizerCopy Source:= "Путь и имя проекта откуда берется модуль", Destination:= _
"Путь и имя проекта куда импортируется модуль", Name:="Имя модуля", Object _
:=wdOrganizerObjectProjectItems
Вставка новых строк в модуль проекта
Visual Basic
1
ИмяПроекта.VBProject.VBComponents.Item("Имя модуля").CodeModule.InsertLines  №, S
Где
№ - Номер строки в модуле с которой будут вставляться новые строки
S – Вставляемая строка символов

Примечание:
В переменной S могут содержаться коды символов конца строк , которые можно получить следующей функцией со следующим аргументом: CHR(13). Таким образом, переменная S может содержать в себе сразу несколько строк:
Visual Basic
1
S = "Первая строка"+ chr(13)+ "Вторая строка" + chr(13)+ "Третья строка"  'и т.д.
Удаление строк из модуля
Visual Basic
1
ИмяПроекта.VBProject.VBComponents.Item("Имя модуля").CodeModule.DeleteLines(№,Количество)
Где
№ - Номер строки в модуле с которой будут удаляться строки
Количество – количество удаляемых строк

Чтение строк из модуля
Visual Basic
1
ИмяПроекта.VBProject.VBComponents.Item("Имя модуля").CodeModule.Lines(№,Количество)
Где
№ - Номер строки в модуле с которой будут начинаться чтение строк
Количество – количество читаемых строк

Определение количества строк в модуле
Visual Basic
1
ИмяПроекта.VBProject.VBComponents.Item("Имя модуля").CodeModule.CountOfLines
Переименование модулей проекта
Visual Basic
1
ИмяПроекта.VBProject.VBComponents.Item("ИмяМодуля").Name ="Новое имя модуля"
Удаление модулей проекта
Visual Basic
1
2
ИмяПроекта.VBProject.VBComponents.Remove  _
ИмяПроекта.VBProject.VBComponents.Item("ИмяМодуля")
Определение количества модулей в проекте
Visual Basic
1
ИмяПроекта.VBProject.VBComponents.Count
Создание нового модуля проекта
Visual Basic
1
2
3
4
5
6
'Создаем новый модуль макросов и подпрограмм
ИмяПроекта.VBProject.VBComponents.Add vbext_ct_StdModule
'Определяем индекс созданного модуля
k = ИмяПроекта.VBProject.VBComponents.Count
'даем свое имя модулю
ИмяПроекта.VBProject.VBComponents.Item(k).Name = "Новое имя модуля"
Добавлено через 9 часов 25 минут

Смотрю кое-кому понравилось . Тогда добавлю:
Много расширенных примеров есть на Cpearson

При объявлении переменных будет ругаться на неизвестный тип данных:
- подключаем Microsoft Visual Basic For Applications Extensibility library (Tools -> Preferences).
Отсюда беруться и некоторые константы.

Также потребуется
открыть доверенный программный доступ к VBE:

2007-2010: 1) Файл -> Параметры -> Центр управления безопасностью -> Параметры центра управления безопасностью -> Доверять доступ к объектной модели проектов VBA.
Альтернативно:
2а) Кнопка "Office" (файл) -> Параметры –> (меню "Основные" -> поле "Основные параметры работы с Excel") Настройка ленты -> галочка "Показывать вкладку "Разработчик" на ленте (в правом окне).
2б) Панель "Разработчик" -> группа "Код" -> Безопасность макросов -> меню "Параметры макросов" -> поле "Параметры макросов для разработчика" -> Доверять доступ к объектной модели проектов VBA.
2003: Сервис > Макрос > Безопасность... > Надежные издатели (вкладка) > Доверять досутуп к Visual Basic Project.

Либо твик:
Visual Basic
1
2
3
4
5
6
Sub Enable_AccessVBOM() ' включает программный доступ к объектной модели проекта VBA
    On Error Resume Next
     Key$ = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & _
            "\Excel\Security\AccessVBOM"
     CreateObject("WScript.Shell").RegWrite Key$, 1, "REG_DWORD"
End Sub
15
foo();
885 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
09.07.2013, 16:38 5
Dragokas,
Visual Basic
1
2
3
4
5
6
Sub AddMacro()
With ThisWorkbook.VBProject.VBComponents
    .Import ThisWorkbook.Path \ Module1.bas
    .Import ThisWorkbook.Path \ mw2.frm
End With
End Sub
выдает ошибку "object required"(выделяет 3-ю строку), и книга, и модуль, и форма находятся на рабочем столе. ThisWorkbook.Path работает правильно. В чем может быть ошибка???
1
6861 / 2795 / 530
Регистрация: 19.10.2012
Сообщений: 8,530
09.07.2013, 16:43 6
Visual Basic
1
.Import ThisWorkbook.Path & "\Module1.bas"
1
foo();
885 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
09.07.2013, 16:45 7
Hugo121, спасибо огромное, долго же я голову ломал
0
6861 / 2795 / 530
Регистрация: 19.10.2012
Сообщений: 8,530
09.07.2013, 17:04 8
Лучший ответ Сообщение было отмечено как решение

Решение

Ну конечно - это не просто, разделить ThisWorkbook.Path на Module1.bas, да ещё без остатка
3
11271 / 3630 / 650
Регистрация: 13.02.2009
Сообщений: 10,837
10.07.2013, 01:04 9
Angrynik,
Собственно ответ на вопрос: (никто до сих пор не ответил!)
Да! Можно написать макрос, который будет добавлять другой макрос в другой файл
Ещё есть вопросы?
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 7
02.03.2014, 12:11 10
Чтобы не плодить лишнего из-за простых вопросов, спрошу здесь.
Как проверить наличие модуля в шаблоне Normal.dot чтобы вернулось True или False
Пробовал
Visual Basic
1
NormalTemplate.VBProject.VBComponents.Item("Module1") = True
Не работает
0
3209 / 959 / 222
Регистрация: 29.05.2010
Сообщений: 2,076
02.03.2014, 12:27 11
Попробуй проверить через возникновения ошибки:
Visual Basic
1
2
3
4
5
function IsModuleW(NameModule) as boolen
On error resume next
set PrMod=NormalTemplate.VBProject.VBComponents.Item(NameModule)
If err=0 then IsModulesW=true: else: IsModulesW=false:
end function
1
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 7
02.03.2014, 12:44 12
Упс нашел,
Visual Basic
1
2
3
4
5
6
on error resume next
if NormalTemplate.VBProject.VBComponents.Item("Module1") Is Nothing then
   'если работает
else
   'если не работает
end if
toiai, спасибо.
0
11271 / 3630 / 650
Регистрация: 13.02.2009
Сообщений: 10,837
02.03.2014, 13:50 13
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub QWERT()
Debug.Print IsModul("Module1")
End Sub
Function IsModul(N)
Dim Q
IsModul = False
On Error GoTo 1
Set Q = NormalTemplate.VBProject.VBComponents.Item(N)
IsModul = True
1
End Function
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 7
02.03.2014, 22:59 14
Как работает код toiai вроде понятно. Alex77755 объясните если не трудно, как работает функция и зачем вы объявляете переменные, тем более в коде я не увидел где она используется и зачем в 10 строке кода прописана единица.
0
11271 / 3630 / 650
Регистрация: 13.02.2009
Сообщений: 10,837
02.03.2014, 23:15 15
зачем вы объявляете переменные
Считаю правилом хорощего тона!
Option Explicit у меня то же всегда присутствует!
Если вниметельно присмотрется, то в строке 8 всё-таки можно заметить намёк на использование переменной.
А в 10 строке прописана 1 для того, что бы условный переход в строке 7 в случае ошибки "знал" куда переходить!
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 7
02.03.2014, 23:37 16
Цитата Сообщение от Alex77755 Посмотреть сообщение
Если вниметельно присмотрется
из танка плохо видно Вот что смог понять:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Function IsModul(N)
'объявляем переменную
Dim Q
IsModul = False
'если модуля нет сразу переходим к выполнению функции со строки с единицей
On Error GoTo 1
'объявляем значение переменной
Set Q = NormalTemplate.VBProject.VBComponents.Item(N)
IsModul = True
1
End Function
0
11271 / 3630 / 650
Регистрация: 13.02.2009
Сообщений: 10,837
03.03.2014, 00:02 17
У меня другая интерпритация:
Visual Basic
1
2
3
4
5
6
7
8
 Function IsModul(N)
Dim Q 'объявляем переменную
IsModul = False ' назначаем значение функции на случай ошибки
On Error GoTo 1 ' говорим компилятору что делать в случае возникновения ошибки
Set Q = NormalTemplate.VBProject.VBComponents.Item(N) ' пытаемся назначить переменной модуль
IsModul = True ' если получилось значение функции "ДА"
1 ' если назначить не получилось из-за отсутствия компилятор перходит из строки с ошибкой сюда пропуская назначение "Да"
End Function
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 7
03.03.2014, 00:10 18
Вот спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2014, 00:10

Определите макрос SQR с формальными параметрами для вычисления x2, макрос-константу SIZE для задания размера массива и протестируйте работу макроса
Определите макрос SQR с формальными параметрами для вычисления x2, макрос-константу SIZE для...

Запустить макрос в активной книге Excel из макроса в personal.xlsb
Есть некоторый макрос запускающийся из personal.xlsb Макрос добавляет в активную книгу макрос...

Макрос для вставки символов юникода
Помогите. Нужно сделать макрос на вставку символа юникода по тиму Chrw(8292) чтоб он отображался в...

Макрос для вставки словосочетания в ячейки
Добрый день, дорогие программисты! Прошу сделать макрос для эксель, который вставлял бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru