Имя: Пароль:
1C
1С v8
Получить список имен макросов 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) Это старый сайт бак клуба, в котором тусил.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс