2016年1月11日月曜日

VBAのファイルを外部から読み込み実行

VBAのファイル、つまりはbas形式のファイルを読み込み実行する方法の解説

本来マクロ、VBAはExcelのブックファイルと強く結びついており疎結合感が全くない。
そのため、コードをエクスポートしてもなんか使い辛い。。。

外部からモジュールをインポートし実行することで実装のコードと実行環境であるExcelと分離が可能となる。この分離がもたらすメリットは大きい。
basファイルを愛用のテキストエディタで編集した後、Excel側でファイルの最新の状態を読み込み実行できるようになる。
強引な感じは否めないが。



①全てを標準モジュールに記述すると煩雑になるため、まず
モジュール、ファイルを操作するためのメソッドを提供するクラスモジュールを作成する。
クラス名はModuleImpoterとしました。
(PERSONAL.XLSBにモジュールを追加することを想定)


'ModuleImpoter
'このクラスは、.basファイルをブックへインポートするためのメソッドを提供します。
Option Explicit
'絶対パスを受け取り拡張子を除いたファイル名を返します。
'
Public Function baseName(path As String) As String
Dim f As Object
Set f = CreateObject("Scripting.FileSystemObject")
baseName = f.getBaseName(path)
End Function
'指定したモジュールを開放します。
'
Public Function removeModule(moduleName As String)
Dim Obj As VBIDE.VBProject
Set Obj = ThisWorkbook.VBProject
Call Obj.VBComponents.Remove(Obj.VBComponents(moduleName))
Set Obj = Nothing
End Function
'指定したbasファイルを現在のブックへインポートします。
'
Public Function importBas(filePath As String)
Dim Obj As VBIDE.VBProject
Set Obj = ThisWorkbook.VBProject
Obj.VBComponents.Import filePath
Set Obj = Nothing
End Function
'指定したファイルのモジュールが存在するか判定します。
'
Public Function existsModule(impFilePath As String) As Boolean
existsModule = False
Dim fileBaseName As String
fileBaseName = baseName(impFilePath)
Dim Obj As VBIDE.VBProject
Set Obj = ThisWorkbook.VBProject
Dim CompCnt As Long
CompCnt = Obj.VBComponents.Count
Dim lp As Long
For lp = 1 To CompCnt
If Obj.VBComponents(lp).Name = fileBaseName Then
existsModule = True
GoTo END_JUDGE
End If
Next
END_JUDGE:
Set Obj = Nothing
End Function
view raw ModuleImporter hosted with ❤ by GitHub


②標準モジュールを作成し、同一のモジュールが存在すれば削除した後、ファイルを読み込むようにする。

Option Explicit
Sub import_macro()
Const impFile As String = "basファイルの絶対パス"
Dim importer As New ModuleImporter
With importer
If .existsModule(impFile) Then
.removeModule (.baseName(impFile))
.importBas (impFile)
Else
.importBas (impFile)
End If
End With
Set importer = Nothing
'読み込んだモジュール下記のように指定すると更新処理と同時に実行できる
'Application.Run "PERSONAL.XLSB!" & "モジュール名"
End Sub
view raw import_macro hosted with ❤ by GitHub


ざっとこんな感じかな。

注意点として、ファイルの読み込み関連で「microsoft visual basic for application extensibility」に依存があるので、予め参照設定する必要がある。

補完が効かなくても、どうしてもvimで書きたかった。。。
ただそれだけだった。。
でもgithubとかと連携させても面白いかも

以上!

0 件のコメント:

コメントを投稿