|
Получить список имен макросов Excel | ☑ | ||
---|---|---|---|---|
0
kiabs
22.11.17
✎
12:16
|
Доброго дня.
Подключаюсь к существующей книге через. Excel = Новый COMОбъект("Excel.Application"); Подскажите пожалуйста, как получить список имен макросов из книги, для последующего их запуска (Run(ИмяМакроса)). Гугл не помогает. |
|||
1
Tatitutu
22.11.17
✎
12:21
|
Private Sub ListUsersProc(Optional mdlname As String)
Dim obj As Object Dim i As Long, Y As Long, x As Long Dim strTemp As String, strTemp1 As String, strTemp2 As String On Error GoTo 999 'при первом вызове перебираем модули и если имя модуля nameusermdl+... то вновь вызываем процедуру 'с передачей найденного имени модуля If Len(mdlname) = 0 Then Me.ListBox2.Clear: Me.ListBox6.Clear For i = 1 To Application.VBE.VBProjects(nameaddin).VBComponents.Count strTemp = Application.VBE.VBProjects(nameaddin).VBComponents(i).Name If InStr(strTemp, nameusermdl) = 1 Then Call ListUsersProc(strTemp) Next i Exit Sub End If 'читаем содержимое модуля - составляем список процедур Set obj = Application.VBE.VBProjects(nameaddin).VBComponents(mdlname).CodeModule With obj For i = .CountOfDeclarationLines + 1 To .CountOfLines strTemp = Left(Trim(.Lines(i, 1)), 11) If InStr(strTemp, 'Public Sub ') = 1 Or InStr(strTemp, 'Sub ') = 1 Then Y = InStr(strTemp, 'Sub') strTemp = Trim(.Lines(i, 1)) strTemp = Right(strTemp, Len(strTemp) - Y - 3) Y = InStr(strTemp, '(') If Y <> 0 Then strTemp = Trim(Left(strTemp, Y - 1)): strTemp1 = '' If Left(Trim(.Lines(i - 1, 1)), 1) = ''' Then strTemp1 = Replace(Trim(.Lines(i - 1, 1)), ''', '') With Me.ListBox2 .AddItem: .List(.ListCount - 1, 0) = strTemp: .List(.ListCount - 1, 1) = strTemp1 End With With Me.ListBox6 .AddItem: .List(.ListCount - 1, 0) = strTemp: .List(.ListCount - 1, 1) = strTemp1 End With End If End If Next i End With 999: If Err Then MsgBox 'Ошибка в процедуре чтения кода модуля' & Chr(13) & Chr(10) & _ 'ListUsersProc (' & mdlname & ')' & Chr(13) & Chr(10) & Err.Description Err.Clear End Sub |
|||
2
kiabs
22.11.17
✎
12:26
|
(1) Уже находил этот код, не могу понять как его запустить , хотя бы в Exel
|
|||
3
Tatitutu
22.11.17
✎
13:47
|
EXCEL - ALT+f11 (откроется редактор макросов)
чтобы запустить эту процедуру Sub Макрос1() Call ListUsersProc("") End Sub этот код (из интернета) приведен для формы пользователя Me.ListBox2.Clear: Me.ListBox6.Clear - удалить (Ме - это объект формы) и еще подсказка : For i = 1 To ThisWorkbook.VBProject.VBComponents.Count strTemp = ThisWorkbook.VBProject.VBComponents(i).Name msgbox strTemp Next i |
|||
4
kiabs
22.11.17
✎
15:02
|
(3) переменная nameaddin, что в нее передавать? это имя какого объекта?
|
|||
5
kiabs
22.11.17
✎
15:13
|
(4) Разобрался
|
|||
6
Tatitutu
22.11.17
✎
15:14
|
создай книгу новую
Разработчик - Запись макроса - Остановить макрос ALT+F11 вставь чтобы получилось вот так Sub Макрос1() obj = Application.VBE.VBProjects("VBAProject").VBComponents("Module1").CodeModule Set obj = Application.VBE.VBProjects("VBAProject").VBComponents("Module1").CodeModule With obj For i = .CountOfDeclarationLines + 1 To .CountOfLines strTemp = Trim(.Lines(i, 1)) MsgBox strTemp Next i End With End Sub этот макрос читает программный код полностью построчно Запусти его и увидишь результат но ты же ПРОГРАММИСТ и дальше сможешь распознать и вычленить то что тебе нужно ??? |
|||
7
kiabs
22.11.17
✎
15:16
|
(6) Спасибо дружище! Подсказка в (3) реально помогла! Осталось этот скрипт из 1С в экселе запустить!
|
|||
8
Tatitutu
22.11.17
✎
15:19
|
(7) Ок. Я рад , что помог.
два вопроса осталось - для чего тебе это нужно - зачем в своей личке (рекламируешь то - чего нет) |
|||
9
kiabs
24.11.17
✎
12:02
|
Вот решение
//Получим список макросов книги Попытка МодулиVBA = Новый Массив; Для i = 1 По Книга.VBProject.VBComponents.Count Цикл ИмяМодуля = Книга.VBProject.VBComponents(i).Name; МодулиVBA.Добавить(ИмяМодуля); КонецЦикла; Для Каждого ИмяМодуляVBA Из МодулиVBA Цикл КодМодуляVBA = Книга.VBProject.VBComponents(ИмяМодуляVBA).CodeModule; Для i = КодМодуляVBA.CountOfDeclarationLines + 1 По КодМодуляVBA.CountOfLines Цикл СтрокаVBA = КодМодуляVBA.Lines(i, 1); Если СтрНайти(СтрокаVBA, "Public Sub ")<>0 ИЛИ СтрНайти(СтрокаVBA, "Sub ")<>0 тогда Если СтрНайти(СтрокаVBA, "Public Sub ")<>0 тогда СмещениеСимволов = 11; Иначе СмещениеСимволов = 4; КонецЕсли; НачСимвол = (СтрНайти(СтрокаVBA, "Sub") + СмещениеСимволов); КонСимвол = (СтрНайти(СтрокаVBA, "(")); Если КонСимвол = 0 тогда ИмяМакроса = СокрЛП(Сред(СтрокаVBA, НачСимвол)); Иначе ИмяМакроса = СокрЛП(Сред(СтрокаVBA, НачСимвол, КонСимвол-НачСимвол)); КонецЕсли; ФайлСодержитМакросы = Истина; Элементы.МакросДляЗапуска.СписокВыбора.Добавить(ИмяМакроса); КонецЕсли; КонецЦикла; КонецЦикла; Исключение Сообщить("Не удалось получить список макросов из файла, возможно отключен доступ к объектам VBA, подробнее в справке " + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Важное); КонецПопытки; |
|||
10
kiabs
24.11.17
✎
12:03
|
(9) Хотелка от заказчика, после вставки данных в Книгу Экселя запуск макрос.
|
|||
11
kiabs
24.11.17
✎
12:11
|
(9) Это старый сайт бак клуба, в котором тусил.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |