• ベストアンサー

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
  • ベストアンサー率27% (173/627)
回答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/17068)
回答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

  • VB6とACCESS2000のSplit関数の違い

    VB6とACCESS2000で同じプログラム開発をしております。 同じコーディングをしているのに結果が違っている為困っています。 [環境] ACCESS 2000 SP3 VisualBasic6.0 SP5 [内容] ある文字列をカンマ(「,」半角)で分割しています。 ACCESSプログラムでは対象文字列に全角カンマ「,」が存在するとその部分でも分割してしまいVB6と結果が違います。 分割の際split関数を使用していますが、第4引数は既定値がバイナリモードなはずなので省略しています。 第4引数を「vbBinaryCompare」と明記すれば同じ結果になるのですが、私の認識不足かもしれませんが、腑に落ちません。 [コーディング] Dim s1, s2() As String s1 = "A,B,C" s2 = Split(s1, ",") ACCESS・・・分割数1 VB6・・・分割数2 上記内容の違いの理由等ご存知の方ご教授お願いいたします。

  • splitでの文字列分割

    文字列中の「,」で分割をしたいのですが 「\,」では分割したくありません このような場合、どのような正規表現をかけばいいのでしょうか? <?php $str = "asd,fgh,qwge\,zxc"; $ary_ary = split("[^\],",$str); print_r($ary_ary); ?> ------結果------ Array ( [0] => as [1] => fg [2] => qwge\,zxc ) いろいろ考えてみましたが 上のようにうまくいきませんでした ご教示おねがいします

    • ベストアンサー
    • PHP
  • VBA  改行でsplitしたい

    現在ウェブページから取得した文字列を改行部分でsplitして配列にしたいと考えています。 ob10-6<br /> this is test data ↑このような文字列を取得し、<br />部分で分割したいのですが、 この文字列がtmpという変数に入っているので、 x = split( tmp,"<br />") により、配列xの中に入れようとしたところ、どうも<br />部分で分割されていないようなのです。 vbCrLfなどを代わりに使用してみましたが分割できません。。 なぜ分割できないか、また、分割の仕方を教えていただけると幸いです。 よろしくお願いいたします。

  • 任意の区切り文字でsplitする方法

    VBAで任意の区切り文字でsplitする方法を教えてください。 例えば 123 456 789 333 3444 66 65 22 といようなスペースあるいはタブで区切られたテキストデータがあるとします。 これを配列に格納したいのですが、 この区切りがタブ一つとか、スペース一つとか決まっていれば split関数で簡単に配列に格納することができますが、 タブかも知れないし、スペースがかも知れないし その数も未定の場合にはどうしたら良いですか? replace関数を使って、まず全てのタブをスペースに変換し その後に、複数のスペースを一つのスペースに変換し 最後にsplit関数を使うという方法しかないでしょうか? もっとスマートな方法があれば教えてください。

  • splitを使ってスペース位置で文字列を区切りたい

    splitを使ってスペース位置で文字列を区切りたいのですが、 String[] word = str.split(" ",0);  //半角空白 のように書くと、全角スペースは区切りとしてみなされず、 String[] word = str.split(" ",0);  //全角空白 のように書くと、半角スペースは区切りとしてみなしてくれません。 全角スペースでも半角スペースでも、スペース位置で文字列を区切りたいのですが、どのように書けばよいのでしょうか?

    • ベストアンサー
    • Java
  • split() 正規表現

    正規表現で / (スラッシュ) .(ドット)にマッチ 正規表現により文字列を分割し、配列に格納する split("[/\.]" $v)としていましたが split関数が使えなくなるので、変わりの方法を考えていますが preg_split()などではうまくいきませんでした。 何か方法を教えて下さい。

    • ベストアンサー
    • PHP
  • splitしない文字列について

    split("\t",$moji) で$mojiを分割しているのですが、タブ区切りなのに分割しない文字列があります。 企業秘密な所もあり、問題の文字列そのままを報告できないのですが、分割をキャンセルするような文字コードってあるのでしょうか? その文字コードであやしい物は 「 」:スペース 「!」、「♪」 などが含まれています。 通常であれば10個に分割される文字列がまったく分割されなく分割数は1と出ます。もちろんタブ区切りになっています。 1つの文字列だけの事なのです。原因はまったく不明。よろしくお願いします。

    • ベストアンサー
    • PHP
  • splitの逆関数

    $textに"A,B,C,D"という文字列があったとして、 次に配列@eigoに @eigo=split(/,/, $text)という操作をすると[A B C D]という4つの要素の配列になりますよね。 では、逆に、@eigo_2という[E F G H]という要素4つの配列があったとして、 それを要素ごとに「,」で区切った文字列$text_2="E,F,G,H"に変えることは可能でしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI
  • (VBA)Split関数を使った文字列の区切りについて教えて頂けますでしょうか?

    VBA初心者でSplit関数を使った文字列の区切りがどうしてもうまくいかず非常に困っております。 アドバイス頂けますでしょうか。宜しくお願い致します。 詳細を説明させて頂くと、 (1)エクセルシートのA2セルからA??までの各セルにスペースを含んだ文字列がそれぞれ入力されており、そのそれぞれのセルをスペースで区切ってまず表示させる。 ※データは常にシートのA2からはじまりA3, A4,・・・と不特定に数十行あります (具体例は添付ファイルをご覧頂けますと幸いです。※画像が多少見づらいのですが、画面上のほうがもともとの表で、下の方が完成させたいイメージです。) そして、実際にトライしてみたVBAのソース・・・(本当お恥ずかしいというか 情けないですが。。) Sub data_split() Dim buf As String, tmp, cnt As Long, I As Long cnt = 2 buf = ThisWorksheet.Cells(cnt, 1).Value 'ループ処理(1)(2行目からセルが空になるまで行う処理) Do Until Cells(cnt, 1) = "" cnt = cnt + 1 tmp = split(buf, "") ' データ(文字列)をスペースで区切って出力。 For I = 0 To UBound(tmp) Cells(cnt, I + 1) = tmp(I) Next I Loop End Sub (2)A列からD列までの文字列はそのままで、E列以降(F,G、H・・・)に入った文字列はすべてまとめてE列の各セルに入力させたい。 'AからDまでのセルに入ったセルはそのままでよい。 'E以降の区切られたデータは全部Hセルに入力する VBA初心者なのですが、仕事上、取り急ぎこのようなイメージのVBAを作成しないといけないのですが、本やサイトを見ていろいろと試みているのですがどうしてもうまくいかず非常に困っております。。どうぞ宜しくお願い致します。 参考にしたサイト:http://officetanaka.net/excel/vba/tips/tips62.htm

  • 文字列を任意の場所で分割(split)したい

    CでCGIを書く上で、perlのsplit命令の代替になるようなライブラリを探しています。 www=xxx&yyy=zzz という引数をchar型の配列に入れ、それを & で分割し、次に = で分割して query[0].name = www; query[0].value = xxx query[1].name = yyy; query[1].value = zzz などと、perlと同等のことをさせたいのですが、文字列をその都度走査していたのでは処理が莫大になりそうなので、もしご存知であれば教えていただければと思います。