|
▼相談者 さん:
>Cファイルのテキストファイルを1行ずつ読み込み格納した後に
>"//"や"/* */"などでコメント化された文字列だけを削除するマクロを
>作成しています。
>// やセミコロン(;)で宣言された部分はSPLIT関数できますが、
>/*○○○*/で改行されているコメントの削除がうまくいきません。
>何か良い方法があれば助言願います。
ファイルを1変数に全て読み込んで処理します
因って、大きすぎるデータだと無理があるかも?
尚、Cは良く解りませんので、「//」は、//〜改行コードまでの1行の削除でしたっけ?
Option Explicit
Public Sub Sample_1()
Dim i As Long
Dim dfn As Integer
Dim vntFileName As Variant
Dim strBuff As String
Dim bytBuff() As Byte
Dim strResult() As String
vntFileName = Application.GetOpenFilename("全て (*.*),*.*")
If VarType(vntFileName) = vbBoolean Then
Exit Sub
End If
dfn = FreeFile
Open vntFileName For Binary As dfn
ReDim bytBuff(1 To LOF(dfn))
Get #dfn, , bytBuff
Close #dfn
vntFileName = Application.GetSaveAsFilename(, "全て (*.*),*.*")
If VarType(vntFileName) = vbBoolean Then
Exit Sub
End If
strBuff = StrConv(bytBuff, vbUnicode)
Erase bytBuff
DeleteData1 strBuff
DeleteData2 strBuff
dfn = FreeFile
Open vntFileName For Output As dfn
Print #dfn, strBuff
Close #dfn
MsgBox "処理が完了しました", vbInformation
End Sub
Private Sub DeleteData1(strData As String)
' 1. //で始まる対象行(//〜改行コードまでの1行)
Const cstrFind As String = "//"
Dim i As Long
Dim lngPos1 As Long
Dim lngPos2 As Long
lngPos1 = InStr(1, strData, cstrFind, vbBinaryCompare)
Do Until lngPos1 = 0
lngPos2 = InStr(lngPos1 + 1, strData, vbCrLf, vbBinaryCompare)
If lngPos2 = 0 Then
Exit Do
End If
strData = Left(strData, lngPos1 - 1) & Mid(strData, lngPos2)
lngPos1 = InStr(1, strData, cstrFind, vbBinaryCompare)
Loop
End Sub
Private Sub DeleteData2(strData As String)
' 2. /* 〜 */の間 (複数行に跨ぐ場合あり)
Const cstrFind1 As String = "/*"
Const cstrFind2 As String = "*/"
Dim i As Long
Dim lngPos1 As Long
Dim lngPos2 As Long
lngPos1 = InStr(1, strData, cstrFind1, vbBinaryCompare)
Do Until lngPos1 = 0
lngPos2 = InStr(lngPos1 + 1, strData, cstrFind2, vbBinaryCompare)
If lngPos2 = 0 Then
Exit Do
End If
strData = Left(strData, lngPos1 - 1) & Mid(strData, lngPos2 + 2)
lngPos1 = InStr(1, strData, cstrFind1, vbBinaryCompare)
Loop
End Sub
|
|