2017年12月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

« ◆Excel VBA(カスタムツールバーのボタンからマクロへ引数を渡す方法) | トップページ | ◆Excel VBA(ブックとマクロを分離する方法) »

2007年9月 5日 (水)

◆Excel VBA(マクロ側からVisual Basic Editorを操作する方法)

今回はマクロ側からVisual Basic Editorを操作する方法を書いてみたいと思います。

職場でVBAマクロのツールを作成していたりすると、始めは良いのですがそのうち機能追加や仕様変更などが発生して、マクロを修正することがあります。ブックにマクロを実装して複数の人に配布していると、下手をするとマクロの修正が発生するたびに、配布済みの大量のブックを直接修正する羽目になります。新しいブックを再配布して、利用者にシートを入れ替えてもらうといった手間を強いるケースも考えられます。
以上を考慮すると、予め複数の人が使用することが分かっている場合はブックとマクロを分離しておくことが望ましいです。分離する方法は次回述べますが、今回は既に多くの人に配布してしまったブックのマクロを置き換える方法をご紹介いたします。

■前提/作業の流れ
(1)まず、マクロが実装されているブックを多くの人が使用している職場を想定します。
(2)そのマクロにバグが発見されたり仕様変更で、マクロの修正が発生したとします。
(3)その配布済みの全てのブックのマクロを読み込みつつ、新しいマクロに置き換えていくというスペシャルマクロを作成する
(4)利用者には予め修正予定日時を周知し、その間は使用しない旨連絡し、スペシャルマクロを実行する。
完了したらその旨連絡して終了。

以下はスペシャルマクロのサンプルです。
長々と書きましたが、ここでようやく題名のVisual Vasic Editorを操作するロジックが必要になります。

Sub ModuleInportAll()
    Dim i As Integer
    Dim cPath
    Dim oVBC As VBComponent
    Dim cSavePath As String, cKaku As String, lFileName As String, lName As String
    Dim lFlg As Boolean
   
    If vbYes <> MsgBox("インポート対象のブックをアクティブにしてください。" & Chr(10) & _
            "VBAProjectにパスワードが設定されている場合は解除しておいてください。" & Chr(10) & _
            "実行しますか?", vbYesNo + vbQuestion, "実行確認") Then Exit Sub
   
    'ファイル指定&パス、拡張子取得
    cPath = Application.GetOpenFilename("*.*ファイル (*.*), *.*", MultiSelect:=True, Title:="★★★ ファイル選択 ★★★")
    If Not IsArray(cPath) Then Exit Sub
   
    For i = 1 To UBound(cPath)
        cSavePath = Left(cPath(i), InStrRev(cPath(i), "\"))
        cKaku = Mid(cPath(i), InStrRev(cPath(i), "."))
        lFlg = False
        For Each oVBC In ActiveWorkbook.VBProject.VBComponents
            lFileName = oVBC.Name & cKaku
            If Dir(cPath(i)) = lFileName Then
                lFlg = True
                lName = oVBC.Name
                Exit For
            End If
        Next oVBC
       
        'モジュールが存在したら入れ替え、存在しなかったら追加
        With ActiveWorkbook.VBProject
            If lFlg = True Then
                .VBComponents.Remove .VBComponents(lName)
                .VBComponents.Import (cPath(i))
            Else
                .VBComponents.Import (cPath(i))
            End If
        End With
    Next

    Set oVBC = Nothing
End Sub

解説すると、予め修正後のマクロをエクスポートしておき、上記のロジックで既存のマクロを置き換えていきます。
マクロを実行するには下記3点の注意が必要です。
・Microsoft Visual Basic for Application Extensibilityの参照設定が必要になります
・アクティブブックのVBAProjectにパスワードが設定されている場合は解除しておきます
・Excel2002からはセキュリティが強化されているらしく、「プログラミングによるVisual Basic プロジェクトへのアクセスは信頼性に欠けます」というエラーメッセージが表示されます。そのような場合は、Excelメニュー「ツール」→「マクロ」→「セキュリティ」→「信頼できる発行先」→「Visual Basicプロジェクトへのアクセスを信頼する」にチェックしてから実行するようにします

さて、ロジックの中身ですが、GetOpenFilenameで予めエクスポートしておいた.basファイルを読み込み、For i = 1 To UBound(cPath)でモジュール単位に処理を繰り返します。少し汎用的に、同じモジュールが存在したら入れ替え、存在しなかったら追加する作りにしています。
よかったらお試しください。

« ◆Excel VBA(カスタムツールバーのボタンからマクロへ引数を渡す方法) | トップページ | ◆Excel VBA(ブックとマクロを分離する方法) »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« ◆Excel VBA(カスタムツールバーのボタンからマクロへ引数を渡す方法) | トップページ | ◆Excel VBA(ブックとマクロを分離する方法) »