dポイントプレゼントキャンペーン実施中!

ExcelVBAで正規表現を使って置換したいのですが、以下のような条件の場合、どの様なマッチパターンにしたらいいのでしょうか

条件
スペース(半角)を,(コンマ)に置換する。ただし"(ダブルコーティション)で囲まれた部分のスペースは置換しない。

よろしくお願いします。

質問者からの補足コメント

  • 回答有難うございます。

    置換するのはエクセルのセルに入力された文字列です。
    CSVではありません。

    >ダブルクォーテーションの中にエスケープされたダブルクォーテーションが来る場合
    これはありません。

    例として
    aaa bbb "aaa bbb" ccc "ddd eee" これを aaa,bbb,"aaa bbb",ccc,"ddd,eee"
    このように置換したいと言うことです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/10/17 18:18
  • 前回の補足の例ですが、最後の""の中のコンマは間違いです。

      補足日時:2017/10/17 19:41
  • 再びの回答ありがとうございます。

    無事にうまくいきました。

    有難うございます。

    No.3の回答に寄せられた補足コメントです。 補足日時:2017/10/17 19:49

A 回答 (3件)

こんにちは。



条件
>スペース(半角)を,(コンマ)に置換する。
>ただし"(ダブルコーティション)で囲まれた部分のスペースは置換しない。

私は、CSVを意識していたものだと思ったら違うようですね。
一応組み込みするために、ユーザー定義関数にしてしまいました。(現在は、RegExp オブジェクトは、中に入れたままですが、本来は、外に出して使うつもりでした)

>aaa bbb "aaa bbb" ccc "ddd eee" これを aaa,bbb,"aaa bbb",ccc,"ddd,eee"
でも、これだったら、違ってしまいましたね。(^^;

私のは、こうなります。
aaa,bbb,"aaa bbb",ccc,"ddd eee" 最後が違います。

目視では、とても不可能なものでも、こうなります。
12"3" "1" "5 6" " B45"7 89a ->,12"3","1","5 6"," B45"7,89a


'//
Function RegReplace(ByVal inText As String)
 Dim RegEx As Object
 Dim Ms, m, i As Long
 Dim buf As String
 Set RegEx = CreateObject("VBScript.RegExp")
 With RegEx
  .Global = True: .IgnoreCase = True
  .Pattern = "(""[^""]+!?"")"
 End With
 buf = inText
 buf = Replace(buf, Space(1), Space(1), , , vbTextCompare)
 Set Ms = RegEx.Execute(inText)
 For i = 0 To Ms.Count - 1
  buf = Replace(buf, Ms(i), "#" & i, , 1, vbBinaryCompare)
 Next
 buf = Replace(buf, Space(1), ",", , , vbBinaryCompare)
 For i = 0 To Ms.Count - 1
  buf = Replace(buf, "#" & i, Ms(i), , 1, vbBinaryCompare)
 Next
 RegReplace = buf
End Function
この回答への補足あり
    • good
    • 0

>aaa bbb "aaa bbb" ccc "ddd eee" これを aaa,bbb,"aaa bbb",ccc,"ddd,eee"



aaa,bbb,"aaa bbb",ccc,"ddd eee"
じゃないの?
    • good
    • 0

おそらく全てのパターンをチェックするのは困難です


ダブルクォーテーションの中にエスケープされたダブルクォーテーションが来る場合だってあるでしょう
またCSVの場合ダブルクォーテーションを二重につかって文字列と認識させたり色々あります
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!