PR

【VBA】コードを取得/削除/入力/置換する

これで楽に!?VBA活用
記事内に広告が含まれています。

こんにちは、Ryoです。
特殊な用途にはなりますが、VBAを使用して指定行のコードを取得、または削除や入力、置換を行うことができます。これらは同一モジュール内に限られますが、そのモジュール間であれば他プロシージャに対しても処理を行うことができますので有用な場面もあるかと思います。今回はその内容について書いていきます。

スポンサーリンク

1.コードの取得

以下のサンプルコード3-5行目を取得してメッセージボックスで表示します。

Sub Sample1()
'***指定行のコードを取得する***
MsgBox "↓3-5行目のコードを表示↓ : " & vbLf & vbLf _
& ThisWorkbook.VBProject _
.VBComponents("Module1").CodeModule.Lines(3, 3)

'「Module1」モジュールの3行目から3行分のコードを取得して
'メッセージボックスに表示する

End Sub

実行するとメッセージボックスで取得したコードを表示します。

このようにVBAを使用して指定行のコードを取得するにはLinesプロパティを使用します。

構文:オブジェクト.Lines(startline, count)As String

オブジェクトにはCodeModuleオブジェクトを指定します。そのオブジェクトに対してLinesプロパティは「引数startlineに指定した行から、引数countに指定した行数分のコードを取得」するものです。

サンプルコードでは「Module1」標準モジュールの3行目から3行分(.CodeModule.Lines(3, 3))のコードを取得してメッセージボックスに表示しています。

モジュールの指定はVBComponentsコレクションの引数に「Module1」を指定し、CodeModuleプロパティでCodeModuleオブジェクトを取得(.VBComponents(“Module1”).CodeModule)しています。

2.コードの削除

次のサンプルでは、指定した行のコードを削除します。

Sub Sample3()

'***指定行のコードを削除する***
MsgBox "↓この記述部分を削除します↓ : " & vbLf & vbLf _
& ThisWorkbook.VBProject _
.VBComponents("Module1").CodeModule.Lines(11, 1)

ThisWorkbook.VBProject _
.VBComponents("Module1").CodeModule.DeleteLines 11, 1

'***削除指定のModule1 11行目コメント部分***

End Sub

実行するとメッセージボックスに削除対象の行を取得して表示し、OKを押すと削除が実行されます。

≪実行前≫

≪実行後≫

コードを削除するにはDeleteLinesメソッドを使用します。サンプルでは11行目から1行の指定したコードを削除するものなので、予めコメントとして準備した11行目の「’***削除指定のModule1 11行目コメント部分***」部分を.DeleteLines 11, 1と指定することで削除しています。

3.コードの入力

次のサンプルは「指定した行」に「指定したコード」を入力しますので、Sub Sample5()~End Subの間(14行目)に指定したコードを追加するものです。

Sub Sample4()
'***指定行に指定したコードを入力する***

 '指定Module内に追加するコード(文字列)を定数で宣言
 Const str As String = "MsgBox ""サンプルコードで追加"""
 
 '14行目に「MsgBox ”サンプルコードで追加"」を入力
 ThisWorkbook.VBProject.VBComponents("Module1") _
 .CodeModule.InsertLines 14, str

End Sub

Sub Sample5()
End Sub

このコードを実行すると以下の通り指定したコード「MsgBox “サンプルコードで追加”」がSample5プロシージャ内に入力されます。

このようにVBAを使用してコードを入力するにはInsertLinesメソッドを利用します。

構文:オブジェクト.InsertLines(line, code)

InsertLinesメソッドは引数lineに指定した行に対し、引数codeで指定したコードを入力します。

サンプルでは指定行(14行目)に指定コード(MsgBox “サンプルコードで追加”)を入力することで、結果的にSample5プロシージャ内に挿入された形となります。

ちなみに上述のメッセージボックスを表示させるコードを実行側のプロシージャ(Sample4)10行目辺りに入力したとしても、その動作時点では有効にならずメッセージボックスは表示されませんので、ご参考までに。

4.コードの置換

次のサンプルでは「指定行のコード」と「指定したコード」を置き換えるものです。Sample7プロシージャの「’このコメントを置換します」をSample6プロシージャの「’コメント部分を置換しました」と言う文字列に置換します。

Sub Sample6()
'***指定行と指定したコードを置換する***

    '置換後の文字列を定数で宣言
    Const str As String = vbTab & "'コメント部分を置換しました"

    '14行目のコードを置換する
    ThisWorkbook.VBProject.VBComponents("Module1") _
    .CodeModule.ReplaceLine 14, str

End Sub

Sub Sample7()
    'このコメントを置換します
End Sub

このコードを実行すると以下の通り置換されます。

このようにVBAを使用してコードを置換するにはReplaceLineメソッドを利用します。

構文:オブジェクト.ReplaceLine(line, code)

ReplaceLineメソッドは、「引数lineに指定した行のコード」を「引数codeに指定したコード」で置き換えますので、サンプルコードを実行すると14行目のコメント部分が指定した文字列に置換されるということです。

5.まとめ

今回の内容はモジュールとプロシージャに関わる特殊な部分なので、通常の処理の範疇では用途がなかなかイメージしにくく利用機会も少ないだろうと思います。



私自身もそれほど処理中にコードを入力したり置換するようなことはあまり実行してこなかったのですが、このような処理ができるという前提で思い返してみると有効利用できそうなケースも頭に浮かんでくるので知っておくと幅が広がるのではないかと思います。

注意点としては気付かずに指定モジュールを誤って処理(特に削除)すると大変困ることになりますからお気を付けください。

以上、コードを取得/削除/入力/置換する方法についてでした!今回の記事が何かの参考になれば幸いです。

Ryo

タイトルとURLをコピーしました