none
VBE Module名をマクロで一括変更する RRS feed

  • 質問

  • Excel-VBE 最初に標準モジュールを挿入した時に付くObject名「Module1,Module2,Module3…」を、
    適当に付け直してあった名前を、適当な時期(ツール完成時)に、スッキリした名前にマクロで変更したいのですが?
    例えば、「接頭文字(指定)+連番」の名前にする方法「VBAコード」を教えて下さい。
    願わくば現在の名前で昇順になるように連番を付けたいのでが…
    ActiveBook内で→MyModule01,MyModule02,MyModule03,…
    宜しくお願いいたします。


    u793nabe

    2018年6月1日 9:23

回答

  • たとえばこんな感じでしょうか。

    処理を簡潔にするため、競合する名前が既に存在している場合のチェックや列挙順などは考慮していません。

    Option Explicit
    
    Public Sub RenameVBAModules(ByVal wb As Excel.Workbook, ByVal prefix As String)
        Dim proj As VBIDE.VBProject
        Set proj = wb.VBProject
        
        Dim n As Long, newName As String
        n = 1
        
        Dim component As VBIDE.VBComponent
        For Each component In proj.VBComponents
            If component.Type = vbext_ComponentType.vbext_ct_StdModule Then
                newName = prefix & CStr(n)
                n = n + 1
                Debug.Print component.Name; " => "; newName
                component.Name = newName
            End If
        Next
    
        MsgBox "done", vbInformation
    End Sub
    


    • 回答としてマーク u793nabe 2018年6月2日 15:31
    2018年6月1日 14:32

  • 魔界の仮面弁士さんこの度は大変お世話になりました…感謝。
    実行はイミディエイトウィンドウで「RenameVBAModules ActiveWorkbook, "MyModule"」…Enterですか!!…勉強になりました。
    今後は当該マクロを繰返し使用する事になると思います。
    それと「Set SB = ActiveWorkbook」をヒントに、ご提示いただいた基本コードを、下記の様に改良して活用しようと思っています。
    尚、運用は「PERSONAL.XLSB」に常駐させマクロの表示から実行する事にします。
    Public Sub RenameVBAModules2()
        Dim prefix As String: prefix = "MyModule"
        Dim newName As String
        Dim n As Long
        n = 1
        With ActiveWorkbook.VBProject
            Dim component As VBIDE.VBComponent
            For Each component In .VBComponents
                If component.Type = vbext_ComponentType.vbext_ct_StdModule Then
                   'newName = prefix & CStr(n)
                    newName = prefix & Right(String(10, "0") & n, 3)
                    n = n + 1
                    Debug.Print component.Name; " => "; newName
                    component.Name = newName
                End If
            Next
        End With
        MsgBox "done", vbInformation
    End Sub



    u793nabe

    • 回答としてマーク u793nabe 2018年6月2日 15:30
    2018年6月2日 15:29

すべての返信

  • たとえばこんな感じでしょうか。

    処理を簡潔にするため、競合する名前が既に存在している場合のチェックや列挙順などは考慮していません。

    Option Explicit
    
    Public Sub RenameVBAModules(ByVal wb As Excel.Workbook, ByVal prefix As String)
        Dim proj As VBIDE.VBProject
        Set proj = wb.VBProject
        
        Dim n As Long, newName As String
        n = 1
        
        Dim component As VBIDE.VBComponent
        For Each component In proj.VBComponents
            If component.Type = vbext_ComponentType.vbext_ct_StdModule Then
                newName = prefix & CStr(n)
                n = n + 1
                Debug.Print component.Name; " => "; newName
                component.Name = newName
            End If
        Next
    
        MsgBox "done", vbInformation
    End Sub
    


    • 回答としてマーク u793nabe 2018年6月2日 15:31
    2018年6月1日 14:32
  • 早速のご回答どうも有り難うございます。
    コピペして試行しようとしたのですがVBA実行エーが発生し非力にて次に進む事ができません…?
    お手数をお掛けして申し訳ないのですが、
    必要な「参照設定」と実行部分を教えて頂けませんか…よろしくお願いいたします。
    'Sub RenameVBAModules実行()
    '    Dim WB      As Excel.Workbook
    '    WB = ActiveWorkbook  '←"D:\Test2\Book001.xlsm"
    '    Call RenameVBAModules(WB, "MyModule")
    'End Sub

    u793nabe

    2018年6月2日 2:50
  • VBA実行エーが発生し非力にて次に進む事ができません…?

    それは失礼しました。VBE という用語をご存知のようだったので、細かい説明を端折ってしまいました。

    もしエラーが出るようならば、なんというエラーが発生するのか、正確なメッセージ内容を記載していただくと状況が把握しやすくなります。次回以降の質問時にご留意頂けると助かります。

    WB = ActiveWorkbook  '←"D:\Test2\Book001.xlsm"

    もしもこの構文にするのなら、「Set WB = ActiveWorkbook」にする必要がありますね。

    必要な「参照設定」と実行部分を教えて頂けませんか

    VBIDE ライブラリの参照設定は下記のとおりです。バージョンやパスは、適宜読み替えてください。

    • 参照名は『Microsoft Visual Basic for Applications Extensibility 5.3』
    • ファイルは『C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB』

    なお既定のセキュリティ設定では、VBE や VBProject プロパティの利用が禁止されています。そのため、このサンプルを動作させるには、事前に VBA プロジェクト オブジェクト モデルへのアクセスを信頼する の設定を ☑ にしておく必要があります。

    Sub RenameVBAModules実行()

    自分の場合は、VBA 画面で Ctrl+G を押したときに表示される イミディエイト に対して

    RenameVBAModules ActiveWorkbook, "MyModule"

    と入力して {Enter} して呼び出していましたが、繰り返し呼び出したい場合は、ご提示のように、引数無しで呼び出せるような Sub RenameVBAModules実行() などを用意しておいた方が楽かもしれませんね。

    なお、「ActiveWorkbook」を渡して処理させる場合には、先の VBA コードをリネームしたいワークブック自体に仕込む必要があります。もしも RenameVBAModules を記したワークブックと、標準モジュールをリネームしたいワークブックが異なる場合には、それぞれのブック名を明示して呼び出しましょう。

    Application.Run "Book1!RenameVBAModules", Application.Workbooks("Book2.xlsm"), "MyModule"

    2018年6月2日 8:20

  • 魔界の仮面弁士さんこの度は大変お世話になりました…感謝。
    実行はイミディエイトウィンドウで「RenameVBAModules ActiveWorkbook, "MyModule"」…Enterですか!!…勉強になりました。
    今後は当該マクロを繰返し使用する事になると思います。
    それと「Set SB = ActiveWorkbook」をヒントに、ご提示いただいた基本コードを、下記の様に改良して活用しようと思っています。
    尚、運用は「PERSONAL.XLSB」に常駐させマクロの表示から実行する事にします。
    Public Sub RenameVBAModules2()
        Dim prefix As String: prefix = "MyModule"
        Dim newName As String
        Dim n As Long
        n = 1
        With ActiveWorkbook.VBProject
            Dim component As VBIDE.VBComponent
            For Each component In .VBComponents
                If component.Type = vbext_ComponentType.vbext_ct_StdModule Then
                   'newName = prefix & CStr(n)
                    newName = prefix & Right(String(10, "0") & n, 3)
                    n = n + 1
                    Debug.Print component.Name; " => "; newName
                    component.Name = newName
                End If
            Next
        End With
        MsgBox "done", vbInformation
    End Sub



    u793nabe

    • 回答としてマーク u793nabe 2018年6月2日 15:30
    2018年6月2日 15:29