2011-07-06 15 views
1

オートメーションを使用してExcelからマクロ名を取得する方法が多数見つかりました(example)。それらはほとんど同じで、1)マクロ記述を取得することも(それぞれの記録されたマクロは、Excel UIを使用して説明を付けることもできます)、または2)通常のVBA関数をフィルタリングすることはできません(Excelで記録されたマクロがあります。自分で書く)。 Excelがソースコード内のコメントとして記述を保持しているように見えますが、私的な場所でもそうです。コードコメントを削除すると、その説明は引き続きExcelに表示されます。説明でExcelマクロ名を取得

少なくとも2)、可能な場合は1)も達成する必要があります。私はC#またはVBAソリューションに感謝したいと思いますが、実際には何もしません。

+1

「マクロの説明」とはどういう意味ですか?そして、 "通常のVBA関数を除外しますか?" –

+0

マクロを記録するときに、そのマクロに説明を割り当てることができます。通常の機能については、手作りのVBA機能を参照しています。私はこれらのマクロと記録されたマクロを区別する必要があります。 – wpfwannabe

+0

@Jean:投票に感謝します。遠隔地でも知り合いであれば、Excelマクロをプログラムで操作することは自明ではありません。あなたがExcelを知っているなら、マクロには説明があることも知っています。 「マクロ記述の入手方法」を聞くことにどれだけの努力を払う必要がありますか?私はあまりにも少ない単語を補うために事実を補うことはできません。あなたは私を悪く見せますが、それはあなたの権利です。 – wpfwannabe

答えて

2

エクセルでマクロを記録し、別の「手書き」のものを同じモジュールに追加してモジュールをファイルにエクスポートすると、記録されたマクロには手入力したもの。

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 

コードを使用してモジュールをエクスポートすることができます。エクスポートされたファイルを解析して、それらの属性を探し出すことができます。

これは操作/ VBEの内容にアクセスするVBAを使用するための優れたリソースです: http://www.cpearson.com/excel/vbe.aspx

2

私は同じ問題が発生した場所をread Excel VBA macros and functions through 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; 
    } 
関連する問題