EXCEL VBA モジュールの更新・書き換え・自動更新・プログラムの修正・訂正(テクニック)
EXCEL VBA モジュールの更新・書き換え・自動更新・プログラムの修正・訂正(テクニック)
今回説明するのは、EXCELマクロ(モジュール)入りのプログラムを更新・書き換えを行うサンプルプログラムです。複数のユーザーに、EXCELマクロ(モジュール)入りのプログラムを配布した場合、修正・訂正があった場合、再度、EXCELマクロ(ファイル)を再配布する必要がありますが、これから説明する下記のサンプルプログラムでは、事前に、モジュールを更新(書き換え)プログラム入りのEXCELマクロ(モジュール)を配布する事で、ファイル配布後でも、バグ・修正・更新(追加)が有った場合は、EXCELマクロ(モジュール)入りのプログラムを更新・書き換えを簡単に行う事が出来ます。それでは、順番にサンプルプログラムを交えて説明いたします。
●事前設定(重要)
EXCELマクロ(モジュール)入りのプログラムを更新・書き換え用プログラムも実行するためには、下記の設定が必須になります。配布するPCにも同様のEXCEL設定が必要になります。
下記の設定を行わないと、実行時に下記のエラーメッセージが表示されます。
【実行時エラー’1004’ プログラミングによるVisual Basicプロジェクトへのアクセスには信頼性に欠けます。】
EXCEL VBA モジュール(プログラム)の更新・書き換え(手動更新)
下記のサンプルプログラムは、手動にてEXCELファイルのモジュール(プログラム)を更新・書き換えを行うサンプルプログラムです。今回のサンプルプログラムでは、Nomalファイルは、各ユーザーに配布したEXCELファイルとします。Masterファイルは、更新先のファイルとして、修正済みのモジュール(プログラム)が登録されています。
【プログラムの説明】
● Nomalファイル・・・更新元・更新したい書き換えたいモジュール(バグ・プログラム)が登録されています。
● Masterファイル・・・更新先のモジュール(修正済みのプログラム)が登録されている。(配布したいプログラム)
【プログラムの構造説明①】:モジュール管理
【Nomalファイル】
● Nomalファイルは、各ユーザーに配布するファイルです。このファイルには、【標準モジュール】が2つ登録されています。
①「Exchange」・・・は、「Module1」を更新・書き換えを実行するプログラムが登録されています。「Exchange」は、普段利用しているマクロプログラム「Module1」に修正等があった場合は、Module1に対して、MasterファイルのModule1から更新(書き換え)を行います。
②「Module1」・・・は、普段利用するプログラムが登録されています。
【Masterファイル】
● Masterファイルは、各ユーザーに配布したNomalファイルに、Module1(プログラム)のバグや修正が有った場合に、Module1の書き換え対象のファイルとなります。配布元のファイルが「Masterファイル」になります。
【プログラムの構造説明②】:運用管理
● 下図の様に、Nomalファイルは、各ユーザーに配布されています。Masterファイルにつきましは、各ユーザーからアクセスできる。ファイルサーバーなどの環境に保管してれば、ネットワーク経由で、モジュール(Module1)を更新・書き換えをする事ができます。社内にファイルサーバーが有る場合は、そのように保管していれは、ファイルを管理する管理者、Masterファイルに対してのモジュール(Module1)を更新修正するだけで、各ユーザーに最新のモジュール(プログラム)が提供する事ができます。
【プログラムの流れ】
① Module1の参照先(C:¥Master¥Master.xlsm)を読み取り専用で起動します。
② 読み取り専用で起動した「Master.xlsm」ファイルのModule1(プログラム)一時保管
③ Nomalファイル(このブック)のModule1を全て消します。
④ 一時保管した「Master.xlsm」ファイルのModule1(プログラム)を貼り付けます。(書き換え)
⑤ 参照先の「Master.xlsmファイルを閉じます。
⑥ NomalファイルのModule1(プログラム)が更新(書き換え)したので、ファイルを上書き保存します。
⑦ 【最新のモジュールに更新しました】のメッセージを表示して、終了。
【プログラム実行条件】
●事前設定(重要)を行う(上記参照)
●Masterファイルを【C:¥Master¥Master.xlsm】保管します。
●今回のプログラムでは、「Masterファイル」をPCのCドライブに保管しましたが、通常の使い方では、ファイルサーバーに保管して利用した方が本来の利用方法で活用できます。社内に、共有フォルダー等が有る場合は、その場所に「Masterファイル」を保存して利用する事をお勧めします。
【参照:VBComponents】
https://docs.microsoft.com/ja-jp/office/vba/language/reference/visual-basic-add-in-model/properties-visual-basic-add-in-model#vbcomponents
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 32 33 34 35 36 37 38 |
' ' ' Sub ModuleExchange() 'モジュール更新(別ブックより) Dim AllLine As Long Dim Code As String Dim Wbook As Workbook Set Wbook = Workbooks.Open("C:\Master\Master.xlsm", ReadOnly:=True) '更新元のブックを指定します。(読み取り専用) With Wbook.VBProject.VBComponents("Module1").CodeModule Code = .Lines(1, .CountOfLines) '全てのモジュールを代入(Code) End With With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule AllLine = .CountOfLines 'モジュール1の行数を取得 .DeleteLines 1, AllLine 'モジュールを削除 .AddFromString Code '別ブックのモジュールを貼り付ける End With Wbook.Close '別ブック(Master)を閉じる Application.DisplayAlerts = False 'アラートメッセージを非表示(↓保存する際のメッセージを非表示) ThisWorkbook.Save 'このブックを保存する。 Application.DisplayAlerts = True 'アラートメッセージを表示 MsgBox "最新のモジュールに更新しました。" End Sub ' ' |
(画面クリックして拡大)
EXCEL VBA モジュールの更新・書き換え(起動時に更新するか判断・メッセージボックス)
下記のサンプルプログラムは、サンプルプログラム①の応用になります。イベントプロシージャを利用して、起動時にモジュール(プログラム)を更新するか、判断します。ブック起動時に更新メッセージを表示させます。「はい」・・で更新実行。「いいえ」・・でキャンセル(何もしない)
【プログラムの説明】
今回のプログラムは、上記サンプル①の応用になります。ブック起動時に更新メッセージを表示させますので、下図の処理を追加します。
ここでは、イベントプロシージャのプログラム追加方法を説明いたします。
① Nomalファイルの「ThisBook」を選択します。
② WorkBook Openを選択します。
③ フック起動時に、モジュールを更新するかのプログラム(モジュール)を登録します。
(※プログラム:下記参照)
【プログラムの流れ】
① ブック起動時にモジュール更新のメッセージを表示します。
② 「はい」・・・③のプログラムを実行 「いいえ」・・・何もしない(そのままブック起動)
ーーーーーーーーー以下(サンプル①と同じ)ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
③ Module1の参照先(C:¥Master¥Master.xlsm)を読み取り専用で起動します。
④ 読み取り専用で起動した「Master.xlsm」ファイルのModule1(プログラム)一時保管
⑤ Nomalファイル(このブック)のModule1を全て消します。
⑥ 一時保管した「Master.xlsm」ファイルのModule1(プログラム)を貼り付けます。(書き換え)
⑦ 参照先の「Master.xlsmファイルを閉じます。
⑧ NomalファイルのModule1(プログラム)が更新(書き換え)したので、ファイルを上書き保存します。
⑨ 【最新のモジュールに更新しました】のメッセージを表示して、終了。
【プログラム実行条件】
●事前設定(重要)を行う(上記参照)
下記のプログラムをイベントプロシージャ部分しか掲載(追加部分)していませんので、サンプル①のプログラムに追加して利用して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
' ' ' Private Sub Workbook_Open() Dim rc As Integer rc = MsgBox("Module1を更新しますか?", vbYesNo + vbQuestion, "確認") 'メッセージボックスで「更新のはい・いいえ」を表示 If rc = vbYes Then '「はい」を選択 Call ModuleExchange 'Module更新プログラム実行 Else '「いいえ」を選択 MsgBox "更新を中断します" End If End Sub ' |
(画面クリックして拡大)
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。