Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Получить список имен макросов Excel

Получить список имен макросов Excel
Я
   kiabs
 
22.11.17 - 12:16
Доброго дня.

Подключаюсь к существующей книге через. 
Excel = Новый COMОбъект("Excel.Application");

Подскажите пожалуйста, как получить список имен макросов из книги, для последующего их запуска (Run(ИмяМакроса)).

Гугл не помогает.
 
 
   Tatitutu
 
1 - 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
   kiabs
 
2 - 22.11.17 - 12:26
(1) Уже находил этот код, не могу понять как его запустить , хотя бы в Exel
   Tatitutu
 
3 - 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
   kiabs
 
4 - 22.11.17 - 15:02
(3) переменная nameaddin, что в нее передавать? это имя какого объекта?
   kiabs
 
5 - 22.11.17 - 15:13
(4) Разобрался
   Tatitutu
 
6 - 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

этот макрос читает программный код полностью построчно

Запусти его и увидишь результат

но ты же ПРОГРАММИСТ и дальше сможешь распознать и вычленить то что тебе нужно ???
   kiabs
 
7 - 22.11.17 - 15:16
(6) Спасибо дружище! Подсказка в (3) реально помогла! Осталось этот скрипт из 1С в экселе запустить!
   Tatitutu
 
8 - 22.11.17 - 15:19
(7) Ок. Я рад , что помог.
два вопроса осталось
- для чего тебе это нужно
- зачем в своей личке (рекламируешь то - чего нет)
   kiabs
 
9 - 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, подробнее в справке " + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Важное);    
        
    КонецПопытки;
   kiabs
 
10 - 24.11.17 - 12:03
(9) Хотелка от заказчика, после вставки данных в Книгу Экселя запуск макрос.
 
 Рекламное место пустует
   kiabs
 
11 - 24.11.17 - 12:11
(9) Это старый сайт бак клуба, в котором тусил.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует