• ベストアンサー

VB6.0、スペース区切りでSplit関数。""

「kkk4 "バージョン 6" 23」 このような文字列(コマンドライン引数)をsplitで分割したいです。 ""で囲った部分は一続きとして配列に入れたいです。 なので期待としては ary(0)・・・kkk4 ary(1)・・・"バージョン 6" ary(2)・・・23 となってほしいですが、バージョンと6の間にスペースがあるので ary(0)・・・kkk4 ary(1)・・・"バージョン ary(2)・・・6" ary(3)・・・23 となってしまいます。 これを期待通りにするにはどうすればいいでしょうか? ""は実際には後で外そうと思っています。(「バージョン 6」という文字列が必要) ""が使えないかと思って一時的につけているのです。 大変恐れ入りますが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • t_hirai
  • ベストアンサー率28% (222/788)
回答No.1

2パターンSPLITすればいいのではないですか? 例えば、こんな感じ。 (VBで変数の定義を忘れたのでざっくりですが) 変数A = 元の値(kkk4 "バージョン 6" 23) 変数B = 元の値(kkk4 "バージョン 6" 23) 変数A を「"」でスプリットする(「バージョン 6」がとれる) 変数B を「半角スペース」でスプリットする ary(0)・・・kkk4 ary(1)・・・"バージョン ary(2)・・・6" ary(3)・・・23 が取れる。 あとは、変数Aでとれた必要な配列と、 変数BのSPLITでとれた必要な配列の箇所(ary(0), ary(3))を使用すればいいのではないですか?

noname#218001
質問者

お礼

その方法がありましたか。ありがとうございました

その他の回答 (4)

noname#208339
noname#208339
回答No.5

配列の要素の先頭文字が「"」ならば末尾文字が「"」の要素が見つかるまで繋げていく、 という方法もあると思います。   Dim a As Variant   Dim IsJoin As Boolean '繋げるかどうかのフラグ。   a = Split(" kkk4 ""バージ ョン 6 "" 23", " ")   c = 0 '次に入れる場所。   For i = 0 To UBound(a)     If Not IsJoin Then '普通のとき。       a(c) = a(i)       c = c + 1       If Left(a(i), 1) = """" Then '先頭文字が「"」のとき。         IsJoin = True         c = c - 1       End If     Else '繋げるとき。       a(c) = a(c) & " " & a(i)       If Right(a(i), 1) = """" Then '末尾文字が「"」のとき。         IsJoin = False         c = c + 1       End If     End If   Next i   ReDim Preserve a(c - 1) As String '余分な部分をカットする。

noname#218001
質問者

お礼

参考にさせていただきます。ありがとうございました

回答No.4

こんにちは。 簡単に片付けられるものであるならば、それに越したことはないと思いますが、 ある程度汎用性を持たせようとするとスッキリした方法が思い浮かびません。 区切り文字としてのスペースだけを RegExp.Replaceを使って、 一旦、他の区切り文字(例ではvbCr)に置換してから、Split関数に掛ける、 といった愚直な処理内容です。 とりあえず、Function に纏めてみましたが、適当に書き換えてください。 回答の要点としてはRegExpのパターンと置換パターンぐらいで、他はどうにでも、、、。 ByRef渡しのString型配列変数を用意してください。 関数の戻り値自体は、RegExpが正しく実行されたかどうかを返すBoolean型です。 暫定的な区切り文字として、vbCr を指定していますが、適宜変更してください。 名前付き引数[DQ]はオプショナルですが、False を指定するとDQを削除します。 以下、インデント表示用に用いた全角スペースを半角*2に置換してから Sub testを動かしてみて下さい。 (vb6環境では試せていないので、もし齟齬があればスミマセン) ' ' /// Option Explicit ' ' /// 宣言部 /// Private oRegExp As Object 'Private oRegExp As VBScript_RegExp_55.RegExp ' [Microsoft VBScript Regular Expressions 5.5] Private Const S_PATTERN As String = "(^| )(""[^""]+""|[^ ]+)" Private Const S_DLM As String = vbCr Private Const S_REPLACE As String = S_DLM & "$2" ' ' /// メインの関数 /// 8974835w Public Function EspSplit(ByVal Source As String, _           ByRef Ary() As String, _           Optional ByVal DQ As Boolean = True _         ) As Boolean   Dim sBuf As String On Error GoTo SetRE_   sBuf = oRegExp.Replace(Source, S_REPLACE) On Error GoTo 0   If Not DQ Then sBuf = Replace(sBuf, """", "")   Ary() = Split(Mid$(sBuf, 2), S_DLM)   EspSplit = True   Exit Function SetRE_:   If Err = 91 Then     Set oRegExp = CreateObject("VBScript.RegExp") '    Set oRegExp = New RegExp ' [Microsoft VBScript Regular Expressions 5.5]     oRegExp.Global = True     oRegExp.Pattern = S_PATTERN     Resume   End If End Function ' ' /// お試し用 /// Sub test() Dim strS As String Dim Ary() As String ' テスト1   strS = "kkk4 ""バージョン 6"" 23"   If EspSplit(strS, Ary()) = True Then     Debug.Print Join(Ary(), "▲")   End If ' テスト2   strS = """バージョン 1"" kkk4 23 ""バージョン 6"" yyy7 88 ""バージョン 9"""   If EspSplit(strS, Ary()) = True Then     Debug.Print Join(Ary(), "▲")   End If ' テスト3(DQトル)   If EspSplit(strS, Ary(), False) = True Then     Debug.Print Join(Ary(), "▲")   End If   Set oRegExp = Nothing End Sub ' ' ///

noname#218001
質問者

お礼

参考にさせていただきます。ありがとうございました

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

もう少し状況を詳しく説明しないと、正確に回答できないと思う。 例外的で該当レコードが少数なら、人力で修正するほうが簡単な場合もあると思う。 私の推測した範囲での1例。 ”と次に出現する”の間のスペースを一時的に他の文字列に置き換えることが、メインテーマとしたもの。 ーー エクセルVBA(VB6と互換であるため)でテストした。 シートのA列の各行にデータを入れるとする。ここではA1:A3に kkk4 "バージョン 6" 23 kkssk4 "バージョン 4" 24 ccs45 "バージョン 12" 2895 ーー コード 標準モジュールに Sub test1() For r = 1 To 3 '例が3行なので 'MsgBox Chr(22) a = Range("A" & r) 'MsgBox a p1 = InStr(a, """") p2 = InStr(p1 + 1, a, """") b = Mid(a, p1, p2 - p1 + 1) 'MsgBox b c = Replace(b, " ", "###") 'MsgBox b d = Replace(a, b, c) MsgBox d e = Split(d, " ") For i = 0 To UBound(e) MsgBox e(i) e(i) = Replace(e(i), "###", " ") Cells(r, i + 2) = e(i) Next Next r End Sub ーー 結果 B,C,D列 kkk4 "バージョン 6" 23 kkssk4 "バージョン 4" 24 ccs45 "バージョン 12" 2895 C列の「”」の対がないほうがよければ、Replace関数で省けばよい。 「###」は、地の語句では出現しないと、小生が勝手に、見つくろったもので、意味なし。状況をわかっている質問者が、適当な文字列を使ってください。 ーー 参考 ダブルコーテーション Sub test02() a = "a""sss""ccc" MsgBox a b = Replace(a, """", "") MsgBox b End Sub http://officetanaka.net/excel/vba/tips/tips90.htm

noname#218001
質問者

お礼

参考にさせていただきます。ありがとうございました

  • dogs_cats
  • ベストアンサー率38% (278/717)
回答No.2

バージョン 6に""を挿入出来るのでしたら、前後の文字にも””挿入し、splitを""で行う。 Sub test() Dim ary As Variant Dim mystr As String mystr = "kkk4 " & """バージョン 6""" & " 23" ary = Split(mystr, """") End Sub

noname#218001
質問者

お礼

参考にさせていただきます。ありがとうございました

関連するQ&A