Получить имена макросов Excel с описаниями - PullRequest
1 голос
/ 06 июля 2011

Я нашел много способов получения имен макросов из Excel с помощью автоматизации ( пример ).Они в основном одинаковы, и ни один из них не может 1) получить описания макросов (каждый записанный макрос может быть украшен описанием с использованием интерфейса Excel) или 2) отфильтровать обычные функции VBA (есть записанные макросы Excel и есть функции / макросы, которые выпиши сам).Кажется, что Excel хранит описания как комментарии в исходном коде, но также и в каком-то приватном месте.Если кто-то удаляет комментарии к коду, описание все еще отображается в Excel.

Мне нужно достичь как минимум 2) и, если возможно, 1) тоже.Я был бы признателен за решение C # или VBA, но на самом деле все подойдет.

Ответы [ 2 ]

2 голосов
/ 31 июля 2013

Я столкнулся с той же проблемой и решил ее с помощью веб-сайта, на котором можно прочитать макросы и функции Excel VBA с помощью csharp . Я внес некоторые изменения и нашел решение, которое можно увидеть ниже. Я получаю список с доступными макросами и описанием, которое они получили, когда они впервые были созданы. Я использую регулярное выражение для разбора описания. Может быть, лучшее решение для этого, но, по крайней мере, оно работает для моей цели.

    public List<Tuple<string,string>> GetAllMacrosInExcelFile(string fileName) {

        List<Tuple<string,string>> listOfMacros = new List<Tuple<string,string>>();

        var excel = new Excel.Application();
        var workbook = excel.Workbooks.Open(fileName, false, true, Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing, false, false, Type.Missing, false, true, Type.Missing);

        var project = workbook.VBProject;
        var projectName = project.Name;
        var procedureType = Microsoft.Vbe.Interop.vbext_ProcKind.vbext_pk_Proc;

        foreach (var component in project.VBComponents) {
            VBA.VBComponent vbComponent = component as VBA.VBComponent;
            if (vbComponent != null) {
                string componentName = vbComponent.Name;
                var componentCode = vbComponent.CodeModule;
                int componentCodeLines = componentCode.CountOfLines;

                int line = 1;
                while (line < componentCodeLines) {
                    string procedureName = componentCode.get_ProcOfLine(line, out procedureType);
                    if (procedureName != string.Empty) {
                        int procedureLines = componentCode.get_ProcCountLines(procedureName, procedureType);
                        int procedureStartLine = componentCode.get_ProcStartLine(procedureName, procedureType);
                        var allCodeLines = componentCode.get_Lines(procedureStartLine, procedureLines);

                        Regex regex = new Regex("Macro\r\n' (.*?)\r\n'\r\n\r\n'");
                        var v = regex.Match(allCodeLines);
                        string comments = v.Groups[1].ToString();

                        if (comments.IsEmpty()) { comments = "No comment is written for this Macro"; }

                        line += procedureLines - 1;
                        listOfMacros.Add(procedureName.Tuple(comments));
                    } 
                    line++;
                }
            }
        }
        excel.Quit();
        return listOfMacros;
    }
2 голосов
/ 07 июля 2011

Если вы записываете макрос в Excel, добавляете другой «рукописный» в тот же модуль, а затем экспортируете модуль в файл, вы увидите, что записанный макрос имеет дополнительные атрибуты, которые отсутствуют в руке-entered one.

Sub RecordedMacro()
Attribute RecordedMacro.VB_Description = "some description here"
Attribute RecordedMacro.VB_ProcData.VB_Invoke_Func = "g\n14"
'
' RecordedMacro Macro
' some description here
'
' Keyboard Shortcut: Ctrl+g
'
    Range("C8").Select
    ActiveCell.FormulaR1C1 = "sfhsf"

End Sub

Вы можете использовать код для экспорта модулей, чтобы вы могли анализировать экспортированные файлы в поисках этих атрибутов.

Это хороший ресурс для использования VBA для доступа к /манипулировать содержимым VBE: http://www.cpearson.com/excel/vbe.aspx

...