本来マクロ、VBAはExcelのブックファイルと強く結びついており疎結合感が全くない。
そのため、コードをエクスポートしてもなんか使い辛い。。。
外部からモジュールをインポートし実行することで実装のコードと実行環境であるExcelと分離が可能となる。この分離がもたらすメリットは大きい。
basファイルを愛用のテキストエディタで編集した後、Excel側でファイルの最新の状態を読み込み実行できるようになる。
強引な感じは否めないが。
①全てを標準モジュールに記述すると煩雑になるため、まず
モジュール、ファイルを操作するためのメソッドを提供するクラスモジュールを作成する。
クラス名はModuleImpoterとしました。
(PERSONAL.XLSBにモジュールを追加することを想定)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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 | |
②標準モジュールを作成し、同一のモジュールが存在すれば削除した後、ファイルを読み込むようにする。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
ざっとこんな感じかな。
注意点として、ファイルの読み込み関連で「microsoft visual basic for application extensibility」に依存があるので、予め参照設定する必要がある。
補完が効かなくても、どうしてもvimで書きたかった。。。
ただそれだけだった。。
でもgithubとかと連携させても面白いかも
以上!
0 件のコメント:
コメントを投稿