■ VBAからVBEを操作しよう!3
前回に引き続き、VBAからVBEを操作する方法を解説します。
■CodeModuleオブジェクトを利用する
CodeModuleオブジェクトのメソッドを使用することで、外部のテキストファイルからコードを挿入したり、指定した行のコードを削除したりすることが可能になります。
・AddFromFileメソッドは指定したテキストファイルの内容をコードとしてモジュールに挿入します。AddFromStringメソッドは指定した文字列をコードとしてモジュールに挿入します。
[書式]
オブジェクト.AddFromFile ファイルパス
オブジェクト.AddFromString 文字列
オブジェクトにはCodeModuleオブジェクトを指定します。
ファイルパスには挿入したいコードのテキストファイルのパスを指定します。
文字列には挿入したいコードの文字列を指定します。
※挿入される場所は、CodeModuleオブジェクトで指定したモジュールの最初のプロシージャの直前になります。
・InsertLinesメソッドは指定した行に指定した文字列を挿入します。
[書式]
オブジェクト.InsertLines(指定行, 文字列)
オブジェクトにはCodeModuleオブジェクトを指定します。
指定行には挿入したい行位置を、文字列には挿入したい文字列を指定します。
・DeleteLinesメソッドは指定した行を削除します。
[書式]
オブジェクト.DeleteLines(開始行, 行数)
オブジェクトにはCodeModuleオブジェクトを指定します。
指定行には削除を開始する行位置を、行数には削除したい行数を指定します。
※行数を省略した場合、開始行が1行だけ削除されます。
・ReplaceLineメソッドは指定した行を指定した文字列で置換えます。
[書式]
オブジェクト.ReplaceLine(指定行, 文字列)
オブジェクトにはCodeModuleオブジェクトを指定します。
指定行には置換したい行位置を、文字列には置換したい文字列を指定します。
例:
Sub Test()
Dim MyProject As Object
Dim buf As String
Dim cnt As Long
Set MyProject = ThisWorkbook.VBProject
cnt = MyProject.VBComponents("Module1").CodeModule.CountOfLines
buf = MyProject.VBComponents("Module1").CodeModule.Lines(1, cnt)
MyProject.VBComponents.Add 1
MyProject.VBComponents(MyProject.VBComponents.Count).Name = "M2"
MyProject.VBComponents("M2").CodeModule.AddFromString buf
End Sub
この例では、プロシージャ"Test"が記述されているブックに"M2"というモジュール名の標準モジュールを挿入したあと、"Module1"モジュールにあるすべてのコードを"M2"モジュールにコピーします。 |
例:
Sub Test()
Dim MyProject As Object
Dim buf As String
Set MyProject = ThisWorkbook.VBProject
MyProject.VBComponents.Add 1
MyProject.VBComponents(MyProject.VBComponents.Count).Name = "M2"
MyProject.VBComponents("M2").CodeModule.AddFromfile _
ThisWorkbook.Path & "\test.txt"
End Sub
この例では、プロシージャ"Test"が記述されているブックに"M2"というモジュール名の標準モジュールを挿入したあと、ブックと同じフォルダにある"test.txt"テキストファイルの内容を"M2"モジュールに挿入します。 |
■VBAからプロジェクトのパスワードを設定する。解除する。
APIのkeybd_event関数を利用することで、VBA(マクロ)からVBAプロジェクト(VBAProject)の保護パスワードのロックを解除したり、設定したり、プロパティを変更することが可能になります。
例:
Public Declare Sub keybd_event Lib "user32" ( _
ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long _
)
Sub Test()
AppActivate "Microsoft Visual Basic"
Call SendKeybd_event(vbKeyMenu, vbKeyT)
Call SendKeybd_event(vbKeyE)
Call SendKeybd_event(vbKeyControl, vbKeyTab)
Call SendKeybd_event(vbKeySpace)
Call SendKeybd_event(vbKeyTab)
Call SendKeybd_event(vbKeyA)
Call SendKeybd_event(vbKeyTab)
Call SendKeybd_event(vbKeyA)
Call SendKeybd_event(vbKeyReturn)
End Sub
Public Sub SendKeybd_event(arg1 As Integer, Optional arg2 As Variant)
Select Case True
Case IsMissing(arg2)
Call keybd_event(CByte(arg1), 0, 0, 0)
Call keybd_event(CByte(arg1), 0, 2, 0)
Case Else
Call keybd_event(CByte(arg1), 0, 0, 0)
Call keybd_event(CByte(arg2), 0, 0, 0)
Call keybd_event(CByte(arg2), 0, 2, 0)
Call keybd_event(CByte(arg1), 0, 2, 0)
End Select
End Sub
この例では、プロシージャ"Test"が記述されているブックのプロジェクトのプロパティを開き、[プロジェクトのロック]、[プロジェクトを表示用にロックする]チェックボックスをオンにしたあと、[プロジェクトのプロパティ表示のためのパスワード]にアルファベットの"a"を設定します。
|
この逆を行えば、VBAからパスワードを入力し、プロジェクトの保護を解除することもできます。また、その他のVBEに対する操作をVBA(マクロ)から実行することが可能になります。
※パスワードがわからないときは、プロジェクトの保護(ロック)を解除することはできません。
以上、VBAからVBEを操作する様々なテクニックを紹介しました。
開発が大規模になるにつれ、プロジェクトの管理をVBAから行いたいケースが多々発生します。
今回ご紹介した内容をぜひ活用し、円滑なプロジェクト運営にお役立てください。
|