'--------------------------------------------------
'プロシージャの概要:
'処理名:replaceColonSetAll
'概要:自身のブックを上書き保存後タイムスタンプ付きでバックアップし、
' VBEモジュール内の": Set "を一括で改行+インデント+"Set "に置換する処理。
' 本プロシージャ自身およびコメント行は置換対象から除外する。
'--------------------------------------------------
Public Sub replaceColonSetAll()
Dim strBackupPath As String
Dim strTimestamp As String
Dim strBaseName As String
Dim strExtension As String
Dim strFolderPath As String
Dim lngDotPos As Long
Dim objVBComp As Object
Dim objCodeModule As Object
Dim lngLine As Long
Dim strLine As String
Dim strTrimmedLine As String
Dim strIndent As String
Dim lngPos As Long
Dim lngCountReplace As Long
Dim lngProcStartLine As Long
Dim lngProcEndLine As Long
Const C_SELF_PROC_NAME As String = "replaceColonSetAll"
Const C_VBEXT_PK_PROC As Long = 0
'==============================================
' バックアップ処理
'==============================================
strFolderPath = ThisWorkbook.Path & "\"
strTimestamp = Format$(Now, "yyyyMMdd_HHmmss")
'ファイル名と拡張子を分離
lngDotPos = InStrRev(ThisWorkbook.Name, ".")
If lngDotPos > 0 Then
strBaseName = Left$(ThisWorkbook.Name, lngDotPos - 1)
strExtension = Mid$(ThisWorkbook.Name, lngDotPos)
Else
strBaseName = ThisWorkbook.Name
strExtension = ""
End If
strBackupPath = strFolderPath & strBaseName & "_backup_" & strTimestamp & strExtension
On Error GoTo ErrBackup
'現在の状態を上書き保存してからコピーを取得
ThisWorkbook.Save
ThisWorkbook.SaveCopyAs strBackupPath
On Error GoTo 0
'==============================================
' 一括置換処理
'==============================================
lngCountReplace = 0
For Each objVBComp In ThisWorkbook.VBProject.VBComponents
Set objCodeModule = objVBComp.CodeModule
'自プロシージャの行範囲を特定(存在しない場合は0)
lngProcStartLine = 0
lngProcEndLine = 0
On Error Resume Next
lngProcStartLine = objCodeModule.ProcStartLine(C_SELF_PROC_NAME, C_VBEXT_PK_PROC)
If lngProcStartLine > 0 Then
lngProcEndLine = lngProcStartLine _
+ objCodeModule.ProcCountLines(C_SELF_PROC_NAME, C_VBEXT_PK_PROC) - 1
End If
On Error GoTo 0
lngLine = 1
Do While lngLine <= objCodeModule.CountOfLines
'自プロシージャの範囲内はスキップ
If lngProcStartLine > 0 Then
If lngLine >= lngProcStartLine And lngLine <= lngProcEndLine Then
lngLine = lngLine + 1
GoTo NextLine
End If
End If
strLine = objCodeModule.Lines(lngLine, 1)
'コメント行はスキップ
strTrimmedLine = LTrim$(strLine)
If Left$(strTrimmedLine, 1) = "'" Then
lngLine = lngLine + 1
GoTo NextLine
End If
lngPos = InStr(strLine, ": Set ")
If lngPos > 0 Then
'現在行のインデントを取得
strIndent = Space$(Len(strLine) - Len(LTrim$(strLine)))
'": Set "の前後で分割し、2行に置換
objCodeModule.ReplaceLine lngLine, Left$(strLine, lngPos - 1)
objCodeModule.InsertLines lngLine + 1, strIndent & "Set " & Mid$(strLine, lngPos + 6)
lngCountReplace = lngCountReplace + 1
lngLine = lngLine + 1
Else
lngLine = lngLine + 1
End If
NextLine:
Loop
Next objVBComp
MsgBox "置換が完了しました。" & vbCrLf _
& "置換: " & lngCountReplace & " 件" & vbCrLf _
& vbCrLf _
& "バックアップ:" & vbCrLf _
& strBackupPath, _
vbInformation, "完了"
Exit Sub
ErrBackup:
MsgBox "バックアップの保存に失敗しました。" & vbCrLf _
& "置換処理は実行しません。" & vbCrLf _
& vbCrLf _
& "エラー: " & Err.Description, _
vbCritical, "エラー"
End Sub