あん
2023/06/09 (金) 15:28:43
927ea@06086
Private Sub 実行ボタン_Click()
Dim vbcmp As VBComponent
Dim Code As String 'モジュールのコードの文字列
Dim CodeLine As String '置換したモジュールのコードを1行単位にした文字列
Dim RowCount As Long 'モジュールの行数
Dim i As Integer
Dim j As Integer '置換モジュールの文字列の改行の開始位置
Dim k As Integer '置換モジュールの文字列の改行の終了位置
For Each vbcmp In Application.VBE.ActiveVBProject.VBComponents '全てのモジュールを1つ1つ処理
Code = vbcmp.CodeModule.Lines(1, vbcmp.CodeModule.CountOfLines) 'モジュールのコードを文字列変数に代入
Code = Replace(Code, Me.対象文字列, Me.置換文字列) 'モジュールのコードを置換した文字列を変数に代入
RowCount = (Len(Code) - Len(Replace(Code, Chr13 & Chr10, ""))) / 2 + 1 '置換モジュールの行数
vbcmp.CodeModule.DeleteLines 1, vbcmp.CodeModule.CountOfLines 'モジュールの全削除
For i = 1 To RowCount '置換モジュールを1行1行モジュールに追加
If i = 1 Then
j = 0
Else
j = Min3(InStr(k + 1, Code, Chr13 & Chr10), InStr(k + 1, Code, Chr10), InStr(k + 1, Code, Chr13))
End If
k = Min3(InStr(j + 1, Code, Chr13 & Chr10), InStr(j + 1, Code, Chr10), InStr(j + 1, Code, Chr13))
If k = 0 Then
k = Len(Code) + 1
End If
CodeLine = Mid(Code, j + 1, k - j - 1)
vbcmp.CodeModule.InsertLines i, CodeLine
Next i
Next vbcmp
End Sub
Min3に関しては、3つの数値の中で最小値が何かを算出する関数(ただし、0は除く)
Private Function Min3(a As Long, b As Long, c As Long) As Long
If a <= b Then
Min3 = a
If Min3 = 0 Then
Min3 = b
End If
Else
Min3 = b
If Min3 = 0 Then
Min3 = a
End If
End If
If c < Min3 And c > 0 Then
Min3 = c
End If
End Function
まだ、モジュール2つに対してのみ実行しただけなので、不完全でありますので、もっとテストしてみます。
ただ、hiroton様、hatena様の助言をいただきまして、実行するかよく考えなおしてみます。
通報 ...