- ベストアンサー
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」という文字列が必要) ""が使えないかと思って一時的につけているのです。 大変恐れ入りますが、よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
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))を使用すればいいのではないですか?
その他の回答 (4)
配列の要素の先頭文字が「"」ならば末尾文字が「"」の要素が見つかるまで繋げていく、 という方法もあると思います。 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 '余分な部分をカットする。
お礼
参考にさせていただきます。ありがとうございました
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。 簡単に片付けられるものであるならば、それに越したことはないと思いますが、 ある程度汎用性を持たせようとするとスッキリした方法が思い浮かびません。 区切り文字としてのスペースだけを 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 ' ' ///
お礼
参考にさせていただきます。ありがとうございました
- imogasi
- ベストアンサー率27% (4737/17069)
もう少し状況を詳しく説明しないと、正確に回答できないと思う。 例外的で該当レコードが少数なら、人力で修正するほうが簡単な場合もあると思う。 私の推測した範囲での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
お礼
参考にさせていただきます。ありがとうございました
- dogs_cats
- ベストアンサー率38% (278/717)
バージョン 6に""を挿入出来るのでしたら、前後の文字にも””挿入し、splitを""で行う。 Sub test() Dim ary As Variant Dim mystr As String mystr = "kkk4 " & """バージョン 6""" & " 23" ary = Split(mystr, """") End Sub
お礼
参考にさせていただきます。ありがとうございました
お礼
その方法がありましたか。ありがとうございました