Страницы: 1 2 След.
RSS
Парсинг VBA проекта. Как программно найти в коде что-либо, Parse VBA Project
 
Приветствую!
Чёт не могу нормальный мануал найти…

Реальная задача: проверить актуальность всех именованных диапазонов, используемых в VBA-проекте. То есть узнать, существует ли имя Range("данные") или [данные]
Сама проверка понятна, но нужно получить перечень используемых в коде именованных диапазонов.
Кроме парсинга проекта ничего не смог придумать, но и тут маловато информации.

Нужно найти их в первую очередь в стандартных модулях, неплохо бы - в модулях листов и книги ну и, если получится, то показать, как искать в формах, классах и что там ещё есть (этого в примере нет, т.к. там редко встречается, только модули).
В примере подключены библы для словарей (куда собирать имена) и работы с проектом
Файл
Кусок недокода
Может экспортировать весь проект в текстовый файл (подскажите как) и искать (уже гораздо проще) там?…
Изменено: Jack Famous - 30.06.2022 11:24:13
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
))
пора отдыхать, батенька!
Ctrl+F
в группе: Search
сменить выбор Current Module
на  Current Project
и не забыть нажать Enter или кнопку Find Next)
Изменено: Ігор Гончаренко - 30.06.2022 11:04:33
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко: Ctrl+F в группе: Search сменить выбор Current Module на  Current Project
а где это и как это поможет получить перечень?
Изменено: Jack Famous - 30.06.2022 11:23:29
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Ігор Гончаренко написал:
Ctrl+F
Наверное имеется ввиду поиск программно, а не в рукопашную?
 
Msi2102, вот и мне интересен столь очевидный метод, что батеньке пора отдыхать  :D
Тем более тут не "имеется в виду", а прямо написано аж в названии темы  :)

Всякое бывает — может реально как-то просто всё делается, но не думаю… Ждём ответа
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Вот ОТСЮДА, там есть ссылка на ОРИГИНАЛ
Поиск
Изменено: Msi2102 - 30.06.2022 11:43:03
 
Msi2102, вот это очень полезно — там и экспорт есть, и нужные элементы парсинга  :idea:
Спасибо — ушёл курить и тестить  ;)
Изменено: Jack Famous - 30.06.2022 11:44:26
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
нужно получить перечень используемых в коде именованных диапазонов.
а как мух вида range("a1") отделить от котлет Range("NamedCell")?
По вопросам из тем форума, личку не читаю.
 
БМВ, можно присвоить переменной имени, например, но этого не нужно — и то и то при проверке TypeOf Evaluate(txName) Is Range даёт True, а значит переименовывать именованный диапазон в коде не нужно.
Как всегда уходишь от темы))

Если совсем просто, то мне достаточно получить текст кода всего проекта, а уже из него я строковыми смогу повыбирать, что нужно и провести прочие проверки.
Изменено: Jack Famous - 30.06.2022 11:58:17
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Как всегда уходишь от темы))
нет, просто делаю её более целенаправленной. Ибо в теме у тебя однозначно одно, а по факту вроде просто как весь проект перебрать .

how to export vba project to text file
https://gist.github.com/steve-jansen/7589478
Изменено: БМВ - 30.06.2022 12:26:56
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: в теме у тебя однозначно одно, а по факту вроде просто как весь проект перебрать
А где у меня написано что-то противоречащее перебору всего проекта? Это и нужно, только способа минимум 2 - парсить сам код или вывести в txt и парсить уже оттуда. Оба варианта описаны в шапке. Если первый не получится, то попробую второй.
    Реальную проблему прикрепил в том числе и для вас с Игорем - вы ж не можете без этого никак  :)
    Получается, что нет реального применения - будем вместо решения вопроса его искать, а есть — то смысл, якобы, уже не тот. Забавно  :)

    А за ссылки по экспорту спасибо - пусть будет ещё вариант, кроме Cpearson  :idea:
Изменено: Jack Famous - 30.06.2022 13:32:10
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Ни хрена не поянтно по парсингу кода: Как (напрямую, без экспорта в текстовый файл и чтения из него) получить строку модуля или весь модуль в строковую переменную, например?…
Изменено: Jack Famous - 30.06.2022 13:33:18
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, Может из готовых ПЛЮШЕК, что-то посмотреть? Только они уж больно старые  :(
 
Msi2102, ещё раз спасибо за внимание и помощь  :)
Хочется всё-таки без сторонних программ понять, как без экспорта нормально парсить код…
К тому же, единственное, что в теории может в этом случае помочь из плюшек, это MZ-Tools, а он платный и никакой триал или, упаси боже, пиратку, на работе не поставят  :sceptic:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
существует ли имя
разве список имен нельзя получить?
 
Александр Моторин, нужен список имён из КОДА  :)
Иными словами, какие именованные диапазоны присутствуют в VBA.Project.

Главная задача темы - как парсить код, а уже одно из возможных её применений это указанный сбор и проверка имён.
Изменено: Jack Famous - 30.06.2022 14:24:46
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Как (напрямую, без экспорта в текстовый файл и чтения из него) получить строку модуля или весь модуль в строковую переменную, например?
Я не совсем понимаю, для чего это, но может так:
Код
Sub Текст_кода()
    Dim VBProj As VBIDE.VBProject, VBComp As VBIDE.VBComponent, CodeMod As VBIDE.CodeModule
    Dim ddd As String
    Set VBProj = ActiveWorkbook.VBProject
    Set VBComp = VBProj.VBComponents("Module1")
    Set CodeMod = VBComp.CodeModule
    With CodeMod
        ddd = .Lines(1, .CountOfLines)
    End With
    Debug.Print ddd
End Sub


Весь код в переменную и парсите его сколько угодно
Изменено: Msi2102 - 30.06.2022 15:25:51
 
Цитата
Jack Famous написал:
Как (напрямую, без экспорта в текстовый файл и чтения из него) получить строку модуля или весь модуль в строковую переменную, например?
ну как всегда, в общем-то можно, кустарно...Цикл по всем модулям, а там можно от первой строки и до последней просто считывать:
Код
Sub ParseModulesAndProcedures()
    Dim VBProj As Object, VBComp As Object, CodeMod As Object
    Dim lLineNum&, lNumOfLines&, ll&, llines_cnt&
    Dim ProcName$, sLine$, sToFindVal$
    
    sToFindVal = "what are we looking for?"
    Set VBProj = ActiveWorkbook.VBProject
    'цикл по модулям
    For Each VBComp In VBProj.VBComponents
        Set CodeMod = VBComp.CodeModule
        With CodeMod
            lLineNum = .CountOfDeclarationLines + 1
            llines_cnt = .CountOfLines
            'цикл по каждой строке модуля(кроме деклараций)
            For ll = lLineNum To llines_cnt
                sLine = .Lines(ll, 1)
                If InStr(1, sLine, sToFindVal, 1) > 0 Then
                    'выводим имя процедуры, в которой нашли значение
                    ProcName = .ProcOfLine(ll, 0)
                    Debug.Print "Module name: " & .Name & "; Proc name: " & ProcName
                End If
            Next
        End With
    Next
End Sub

процедурка выведет в дебаг имена всех модулей и процедур, в которых найдет значение, заданное переменной sToFindVal. Значения в комментариях так же учитываются, но это уже довольно легко обойти:
Код
Sub ParseModulesAndProcedures()
    Dim VBProj As Object, VBComp As Object, CodeMod As Object
    Dim lLineNum&, lNumOfLines&, ll&, llines_cnt&
    Dim ProcName$, sLine$, sToFindVal$
    
    sToFindVal = "Property Set"
    Set VBProj = ActiveWorkbook.VBProject
    'цикл по модулям
    For Each VBComp In VBProj.VBComponents
        Set CodeMod = VBComp.CodeModule
        With CodeMod
            lLineNum = .CountOfDeclarationLines + 1
            llines_cnt = .CountOfLines
            'цикл по каждой строке модуля(кроме деклараций)
            For ll = lLineNum To llines_cnt
                sLine = .Lines(ll, 1)
                sLine = Trim(sLine)
                If Left(sLine, 1) <> "'" Then
                    If InStr(1, sLine, sToFindVal, 1) > 0 Then
                        'выводим имя процедуры, в которой нашли значение
                        ProcName = .ProcOfLine(ll, 0)
                        Debug.Print "Module name: " & .Name & "; Proc name: " & ProcName
                    End If
                End If
            Next
        End With
    Next
End Sub
Изменено: Дмитрий(The_Prist) Щербаков - 30.06.2022 15:24:21
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Msi2102: ddd = .Lines(1, .CountOfLines)
храни тебя Господь, добрый человек  :idea:
Столько перебрал, а это, оказывается, ещё в недокоде было (только поиск не нужен)  :D
Поднял, обнял, заплакал, опустил  :) … и ушёл довольный дальше кодить

Дмитрий(The_Prist) Щербаков, спасибо большое - как раз сейчас всё пригодится: и модули, и процедуры  :idea:

Как напишу функцию, выложу сюда))
Изменено: Jack Famous - 30.06.2022 15:41:32
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Дмитрий(The_Prist) Щербаков, У меня не совсем корректно отработал Ваш макрос  :(
Объединил два макроса с того же ресурса из сообщения №6
Код
Изменено: Msi2102 - 01.07.2022 08:22:56
 
Цитата
Msi2102 написал:
У меня не совсем корректно отработал Ваш макрос
не очень комильфо говорить "не корректно отработал" и не приводить пример того, где и как :) Код писался на скорую руку, но даже так не совсем похоже на то, что там много ошибок.
На вскидку, проблема может крыться только в этой строке:
Код
.ProcOfLine(ll, 0)

т.к. я взял тип процедуры за 0, хотя по хорошему надо бы её определять. Не думаю, что это самая большая проблема во всем алгоритме.
Изменено: Дмитрий(The_Prist) Щербаков - 30.06.2022 17:28:16
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков: Не думаю, что это самая большая проблема во всем алгоритме
мне всё понравилось  :)
Я не запускал, а пустил на запчасти))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
не очень комильфо говорить "не корректно отработал" и не приводить пример того, где и как  Код писался на скорую руку,
Извиняюсь, не хотел ни кого обидеть, я не с укором это писал. Просто он не всё нашёл, а файл я приложил, там Ваш макрос на первом месте идёт и в Модуле2 их сразу два. Вот ещё скрин.
 
Цитата
Msi2102 написал:
он не всё нашёл, а файл я приложил
посмотрел файл. И где он не все нашел? Где еще в файле хоть в одной процедуре есть текст "what are we looking for?"? Я все просмотрел и нашел исключительно в двух процедурах: "Module1 - ParseModulesAndProcedures_3" и "Module2 - ParseModulesAndProcedures". Где по Вашему мнению код отработал неверно? В каких еще процедурах есть указанный текст для поиска? Даже стандартный поиск VBE ничего более не находит.
Может Вы что-то другое ищете?
Изменено: Дмитрий(The_Prist) Щербаков - 30.06.2022 22:39:12
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Может Вы что-то другое ищете?
Ага, я действительно тупанул. Я почему-то решил, что собираются наименования процедур. И главное смотрю и не пойму в чем дело :D  :D  :D
 
Off
Цитата
Msi2102 написал:
У меня не совсем корректно отработал Ваш макрос
Может это мое субъективное мнение, но код или работает корректно, или нет. Не совсем верный - это результат, а код в этом случае не работает. Хотя в данном случае, как это выяснилось, код рабочий, а вот тест не очень :-)
По вопросам из тем форума, личку не читаю.
 
А медведь с каждым годом все нуднее и нуднее становится  :D :D  :D
Скажи мне, кудесник, любимец ба’гов...

 
Цитата
_Boroda_ написал:
все нуднее и нуднее
Должность обязывает  :D  :D  :D
 
Не нудный, а предельно точный в терминах (выборочно)  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Кто бесхвостого будет обижать - расцарапаю.
А самый зануда - это я!
Страницы: 1 2 След.
Читают тему (гостей: 1)
Наверх