Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2636 / 13645 ツリー ←次へ | 前へ→

【66776】C言語のコメントを削除 相談者 10/10/5(火) 23:00 質問[未読]
【66780】Re:C言語のコメントを削除 Hirofumi 10/10/6(水) 8:24 回答[未読]
【66783】Re:C言語のコメントを削除 Hirofumi 10/10/6(水) 11:56 回答[未読]
【66800】Re:C言語のコメントを削除 相談者 10/10/6(水) 19:27 お礼[未読]

【66776】C言語のコメントを削除
質問  相談者  - 10/10/5(火) 23:00 -

引用なし
パスワード
   Cファイルのテキストファイルを1行ずつ読み込み格納した後に
"//"や"/* */"などでコメント化された文字列だけを削除するマクロを
作成しています。
// やセミコロン(;)で宣言された部分はSPLIT関数できますが、
/*○○○*/で改行されているコメントの削除がうまくいきません。
何か良い方法があれば助言願います。

【66780】Re:C言語のコメントを削除
回答  Hirofumi  - 10/10/6(水) 8:24 -

引用なし
パスワード
   ▼相談者 さん:
>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

【66783】Re:C言語のコメントを削除
回答  Hirofumi  - 10/10/6(水) 11:56 -

引用なし
パスワード
   後、CrLfが2個続く所が出てくるので以下を追加した方が善いかも

  DeleteData1 strBuff
  DeleteData2 strBuff
  strBuff = Replace(strBuff, vbCrLf & vbCrLf, vbCrLf) '★追加

【66800】Re:C言語のコメントを削除
お礼  相談者  - 10/10/6(水) 19:27 -

引用なし
パスワード
   ▼Hirofumi さん:

さっそくの回答ありがとうございます。
一部を引用させてもらい、無事解決しました。

2636 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free