• ベストアンサー

エクセル マクロ一覧

開いているブックにあるマクロの一覧を作れないものでしょうか? モジュール、シート、ユーザーフォーム内にあるマクロすべてです。 VBAのチェックシートとして使いたいのですが エクセルバージョンは2003です

質問者が選んだベストアンサー

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.3

NO.2 具体的にどこに出力するかが指示がなかったのでヒントでしたが…。 シートを追加して"A"列に一覧を出力しました。 ご確認ください。 Sub Proc一覧処理()  Sheets.Add  For Each ブック In Workbooks   行 = 行 + 1: Cells(行, "A") = "ブック名=" & ブック.Name   For I = 1 To ブック.VBProject.VBComponents.Count    行 = 行 + 1: Cells(行, "A") = " コンポート名=" & ブック.VBProject.VBComponents(I).Name    With ブック.VBProject.VBComponents(I).CodeModule     proc = ""     For J = 1 To .CountOfLines      If proc <> .ProcOfLine(J, 0) Then       proc = .ProcOfLine(J, 0)       行 = 行 + 1: Cells(行, "A") = "  " & proc      End If     Next J    End With   Next I  Next  Cells.EntireColumn.AutoFit End Sub

sadacchi12
質問者

お礼

完璧ですね。すばらしいの一言です。 重ねがさねのすばやい回答に感謝です

その他の回答 (2)

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.2

sadacchi12さん こんにちは。 以下の処理でできるかと思います。 注)・変数宣言は省略しています。   ・マクロのセキュリティー設定で    「Visual Basic プロジェクトへのアクセスを信頼する」にチェックをしてください。   Sub Proc一覧処理()  For Each ブック In Workbooks   モジュール一覧 = モジュール一覧 & "ブック名=" & ブック.Name & vbCrLf   For I = 1 To ブック.VBProject.VBComponents.Count    モジュール一覧 = モジュール一覧 & " コンポート名=" & ブック.VBProject.VBComponents(I).Name & vbCrLf    With ブック.VBProject.VBComponents(I).CodeModule     proc = ""     For J = 1 To .CountOfLines      If proc <> .ProcOfLine(J, 0) Then       proc = .ProcOfLine(J, 0)       モジュール一覧 = モジュール一覧 & "  " & proc & vbCrLf      End If     Next J    End With   Next I  Next  MsgBox モジュール一覧 End Sub

sadacchi12
質問者

お礼

jcctaira さんもいち早い回答ありがとうございました きれいな形で一覧が作成されましたが 作成されたのは普通のエクセルシートではないですよね? 初めて見る形式です また縦長の表示で全体が見えません 作成された一覧をどのように扱えばいいのかわかりません 「一覧が作成されたなあ」と感心するだけで、これをチェックシートに使うには どうしたらいいのか皆目見当がつきません 教えていただけませんか

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

#[Visual Basic プロジェクトへのアクセスを信頼する]必要があります。 'ActiveWorkbookのプロシージャリスト列挙 'TEST中、何度かExcelが落ちたのでステップ実行は危険。 Sub GetProcLst()   Const vbext_ct_StdModule = 1  '標準Module   Const vbext_ct_ClassModule = 2 'ClassModule   Const vbext_ct_MSForm = 3   'FormClassModule   Const vbext_ct_Document = 100 'Book|SheetModule   Const vbext_pk_Proc = 0    'Sub|Function プロシージャ   Dim vbc As Object       'VBIDE.VBComponent   Dim tmp As String   Dim cnt As Long   Dim mx As Long   Dim i  As Long   Dim j  As Long   Dim k  As Long   Dim v   Dim ret(0 To 1000, 1 To 5) As String   On Error GoTo extLine   For Each v In Array("Book", "Module", "Type", "Procedure", "Arg")     i = i + 1     ret(0, i) = v   Next   cnt = 1   With ActiveWorkbook     For Each vbc In .VBProject.VBComponents       'Select Case vbc.Type       'Case vbext_ct_StdModule, vbext_ct_Document         ret(cnt, 1) = .Name         ret(cnt, 2) = vbc.Name         ret(cnt, 3) = vbc.Type         With vbc.CodeModule           mx = .CountOfLines           i = 1           Do Until i > mx             tmp = .ProcOfLine(i, vbext_pk_Proc)             If tmp = "" Then               i = i + 1             Else               j = .ProcBodyLine(tmp, vbext_pk_Proc)               ret(cnt, 4) = tmp               ret(cnt, 5) = .Lines(j, 1)               k = j               Do Until Right$(ret(cnt, 5), 2) <> " _"                 k = k + 1                 ret(cnt, 5) = ret(cnt, 5) & vbLf & .Lines(k, 1)               Loop               i = j + .ProcCountLines(tmp, vbext_pk_Proc)               cnt = cnt + 1             End If           Loop         End With       'End Select     Next   End With   '新規Bookに列挙   With Workbooks.Add(xlWBATWorksheet).Sheets(1).Range("A1").Resize(cnt, 5)     .Value = ret     .Columns.AutoFit     .Rows.AutoFit   End With extLine:   Set vbc = Nothing   With Err()     If .Number <> 0 Then       MsgBox .Number & "::" & .Description     End If   End With End Sub 他、参考情報。 『[XL97] モジュール、プロシージャの情報取得および操作方法』 http://support.microsoft.com/kb/410621/ja 『Visual Basic 6.0 を使用して Excel ブックに格納されているマクロの名前を取得する方法』 http://support.microsoft.com/kb/315731/ja 『Excel 2003 および Excel 2007 で Visual Basic プロジェクトへのアクセスをプログラミングにより許可すると実行時エラーが表示される場合がある』 http://support.microsoft.com/kb/813969/ja

sadacchi12
質問者

お礼

早速の回答ありがとうございました おかげで、一覧が作成されました ただ、私にとっては非常に敷居の高い処理です 奥が深いことを痛感しました 作成されたSheetに表示された「Type」は何を現しているのでしょうか? 教えてください

関連するQ&A