Excelで文字列を区切ってVBAで表示する方法についての質問

このQ&Aのポイント
  • ExcelのA列にスペース区切りのデータがありますが、それをC列とD列に分けて表示したいと思っています。しかし、A列のデータが不規則で個数もバラバラで空白も含んでいるため、うまく処理できません。C列以降は使用できる状態です。VBAのサンプルコードも提供されていますが、うまく動作しません。ExcelやVBAに詳しい方、助けてください。
  • Excelでスペース区切りの文字列をC列とD列に分割して表示する方法が知りたいです。A列には不規則なデータが入っており、個数もバラバラで空白もあります。C列以降は使用可能です。VBAのサンプルコードを試したのですが上手く動作しません。ExcelやVBAに詳しい方にアドバイスをいただきたいです。
  • ExcelのA列にスペース区切りのデータがあります。このデータをC列とD列に分割して表示したいと考えています。ただし、データの個数が不規則で空白も含まれるため、うまく処理できません。C列以降は使用可能です。VBAのサンプルコードも提供されていますが、動作しません。ExcelやVBAに詳しい方、助けてください。
回答を見る
  • ベストアンサー

Excel 文字列を区切る VBA 質問

A列にスペース区切りのデータがあります これをC列 D列 に分けて表示したいのですが A列のデータが不規則(個数がバラバラ 空白もある) と、なった場合 なかなか上手くいきません C列以降は使用可能です(空いてます) その道の方 お助けたください 元のVBAは Sub Sample3() Dim i As Long, tmp As Variant For i = 2 To 22 tmp = Split(Cells(i, 1), " ") Cells(i, 2) = tmp(0) Cells(i, 3) = tmp(1) Next i End Sub です お手数ですが宜しく お願いします

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

Sub Sample4()   Dim i As Long, tmp As Variant   For i = 2 To 22     If Cells(i, "A").Value <> "" Then       tmp = Split(Cells(i, "A").Value)       Cells(i, "B").Resize(, UBound(tmp) + 1).Value = tmp     End If   Next End Sub

19630827
質問者

お礼

上手くいきました ありがとうございました

その他の回答 (3)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

TextToColumnsメソッド([データ]-[区切り位置])を使うという選択肢もあります。 マクロ記録できますし、列一括処理も可能。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2012/5/9 ユーザー名 : end-u ' '   Range("A2:A22").TextToColumns Destination:=Range("C2"), DataType:=xlDelimited, _     TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _     Semicolon:=False, Comma:=False, Space:=True, Other:=False End Sub

19630827
質問者

お礼

区切り位置 気がつきませんでした ありがとうございました やってみます

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

Dim 正規表現 As Object Dim 項目集合 As Object Dim 項目個別 As Object Dim 行       As Long Dim 列       As Long '正規表現オブジェクトをインスタンス化する Set 正規表現 = CreateObject("VBScript.RegExp") '正規表現オブジェクトを設定する 正規表現.Global = True 正規表現.Pattern = "\S+" '行のループ For 行 = 2 To 22     'パターンに一致するものを収集する     Set 項目集合 = 正規表現.Execute(Cells(行, 1))     '列位置を初期化する     列 = 2     '収集した要素を一つずつ処理する     For Each 項目個別 In 項目集合         '列位置を更新する         列 = 列 + 1         '新しい列に項目をセットする         Cells(行, 列) = 項目個別.Value     Next Next 今回はSplitでもよいのですが、空白が2個以上あったり、 特殊な法則で区切る場合は使い難いため、正規表現を 使ってみました。 Globalプロパティは全ての一致する部分を処理させる ので、Trueを指定します。 Patternプロパティは「空白でない文字の連続」という 意味です。"\S"は非空白を示し、"+"は1文字以上の連続を 表します。 http://msdn.microsoft.com/ja-jp/library/cc392487.aspx 尚、Splitで作った配列を処理する時にもFor Eachは使えます。 Dim X As Variant For Each X In Temp Next

  • picknic
  • ベストアンサー率25% (33/132)
回答No.1

Dim i, j As Long Dim tmp() As String For i = 2 To 22 tmp = Split(Cells(i, 1), " ") For Each a In tmp Cells(i, j + 2) = a j = j + 1 Next Next i

関連するQ&A

  • Excel VBAで文字列の部分一致の文字列を表示

    以前、こちらで頭5文字までの一致で文字列を表示するVBAを教えて頂きました。今回はFINDなどの部分一致での文字列を表示することをしたいのですが、ご教示いただけますと幸いです。 下記はSheet1のA3に文字を5文字以内いれるとSheet2のC列からピックアップしてSheet1のA列に文字列を表示する及びSheet2のB列のデータをSheet1のC列に表示させるVBAです。 Sub Test2() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim SData As String, i As Long, VRet As Variant Dim c As Range, LastRow As Long Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") SData = CStr(Ws1.Range("A3").Value) If SData = "" Then Exit Sub i = 5 LastRow = Ws1.Cells(Rows.Count, "A").End(xlUp).Row If LastRow < i Then LastRow = i End If Ws1.Range(Ws1.Cells(i, "A"), Ws1.Cells(LastRow, "C")).ClearContents With Ws2 For Each c In .Range(.Cells(1, "C"), .Cells(Rows.Count, "C").End(xlUp)) VRet = InStr(1, CStr(c.Value), SData, vbTextCompare) If VRet = 1 And Len(c.Value) >= 10 Then Ws1.Cells(i, "A").Resize(1, 2).Value = c.Resize(1, 2).Value 'とりあえずSheet2のB列のデータ(C列のデータに同期したデータ)をSheet1のC列に Ws1.Cells(i, "C").Value = .Cells(c.Row, "B").Value i = i + 1 End If Next End With End Sub 宜しくお願い致します。

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • エクセルVBA:日付データの変換がうまくいかない

    久しぶりにVBAプログラムでハマってしまったので、教えてほしいです。 (1)エクセルシート上のボタンを押す (2)セルの内容を読み込む (3)CSVファイルに出力する というプログラムを組んでいるのですが、variant型で作った 日付のデータの形が変になってしまいます。 入力時は yyyy/mm/dd なのですが、出力されたCSVファイルを見ると、 mm/dd/yyyy と勝手に変換されていました。 何とか修正しようと試みたのですがうまくいきません。 ソースを書き込みます。 Dim data_input(11) As Variant '項目数11項目 Dim i As Integer Dim j As Integer Dim mydir As String Dim conv_data As Variant 'データ変換用 Dim rng As Variant Dim input_date As Date '入力日付(日付型) Dim conv_date As Variant '変換後の日付(ヴァリアント型) i = 0 For i = 0 To 8 data_input(i) = Worksheets("画面").Cells(4 + i, 3) Next i 'A列の一番下のセルを検索する e = Worksheets("local_data").Cells(1, 1).End(xlDown).Row '終端検索(空白のセルまで検索) '日付のデータはそのままCSV化するとおかしな表示となってしまうので、テキスト文字列に変換する 'For Each rng In Range("A1:A10") 'テキスト文字列に変更します。 ' rng.Value = "'" & rng.Text←何故か上手くいかなかった 'Next rng e = e + 1 '最終行+1 For i = 0 To 8 '申込日の時は文字化する為、別処理にする If (i = 0) Then input_date = data_input(i) tmp = CVar(input_date) 'Date型からVariant型に変換し、文字データとして書き込む 'tmpのデータを解体して組み替える 'split? Dim MyStr() As String 'この地点では月/日/年 MyStr() = Split(tmp, "/") '年/月/日に戻す MyStr (0) '月 MyStr (1) '日 MyStr (2) '年 '再結合する tmp = MyStr(2) & "/" & MyStr(0) & "/" & MyStr(1) Worksheets("local_data").Cells(i, i + 1) = tmp 'Worksheets("local_data").Cells(e, 1) = tmp Else Worksheets("local_data").Cells(e, i + 1) = data_input(i) '上部で入力したデータを書き込む End If Next i どうにかyyyy/mm/ddの形で日付が表示されるようにしたいのですが・・・・・ どなたか助言をお願いします。

  • VBA文字抽出について

    添付ファイルのような青文字だけを抽出したいです。作成したVBAでは添付ファイルの6、8行目「0」が消えてしまいます。どなたかアドバイスお願いします。また他に方法があれば教示いただければ幸いです。 Sub test() Dim j As Long, tmp As Variant For j = 1 To Cells(Rows.Count, 1).End(xlUp).Row tmp = Split(Cells(j, 1), "/") Cells(j, 2) = tmp(1) tmp = Split(Cells(j, 2), "-") Cells(j, 3) = tmp(0) Cells(j, 4) = tmp(1) Cells(j, 5) = Cells(j, 3) & "-" & Cells(j, 4) Next j End Sub

  • vbaで配列に値を格納する場合

    vbaで配列に値を格納する場合 変数の宣言はどちらを使った方が良いのでしょうか? Sub Sample1() Dim i As Long Dim myStr As String Dim tmp() As String myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub か Sub Sample1() Dim i As Long Dim myStr As String Dim tmp As Variant myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub でも問題なく動くのですが、 Variant型での宣言はあまりしない方が良いですか? あと Dim tmp() As String ならエラーにならないのですが Dim tmp As String だとエラーになってしまう理由がよくわからないので教えて頂けますか?

  • (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

  • EXCEL VBA: 次の処理のマクロボタン作成

    ConvertシートのA列にあるフルパス付きファイル名を B列から右方向に最大L列までパス区切り文字(\)で分割済みです。 (但し、1行目は見出し行) 列方向(横方向)の分割部分を、横_縦シートの5行目から行方向(下方向)にそのままの順番で配置換え テスト目的で以下のコードを考えて、1行分(i=2)は配置換え出来るのを確認しています。 ここから横_縦シートのどこかにマクロボタンを配置して クリックすると以下を処理したいです。 1)range(”A5”)以下の書き出し分を削除 > 次の書き出しに備える 2)i=3 として 次の書き出しを行う イメージとしては、1行分は配置換えして確認して、ボタンクリックで次を表示して確認を繰り返す ボタンに登録するコードを教えてください。 可能なら、前を表示や処理停止のボタンも作成したいと思っていますのでご指導下さい。 Sub フルパス分割() Dim tmp As Variant Dim Ln As Long, i As Long, ii As Long Dim ws1 As Worksheet, ws3 As Worksheet Set ws1 = Worksheets("Everything") Set ws3 = Worksheets("Convert") Ln = ws1.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To Ln ws3.Cells(i, 1) = ws1.Cells(i, 1) tmp = Split(ws3.Cells(i, 1), "\") For ii = LBound(tmp) To UBound(tmp) ws3.Cells(i, ii + 2) = tmp(ii) Next Next End Sub Sub 並べ替え() Dim Ln As Long, i As Long Dim Worksheet, ws3 As Worksheet, ws4 As Worksheet Dim tmp As Variant Set ws3 = Worksheets("Convert") Set ws4 = Worksheets("横_縦") Ln = ws3.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To Ln tmp = Split(ws3.Cells(i, 1), "\") ws3.Range(Cells(i, 2), Cells(i, UBound(tmp) + 2)).Copy ws4.Cells(i + 3, 1).PasteSpecial Transpose:=True Stop Next End Sub

  • vba split関数 コンマ区切り

    エクセル・vbaに不慣れなためわかりづらかったら申し訳ありません。 コンマ区切りの数字をsplit関数で分割して指定セルに表示したいと考えており、以前質問し回答をいただいた内容でやりたいことが出来るようになりました。 ただし、若干出力場所等の変更を行いたいのですが、変更することが出来ません。 以前はA~C列にあるものをE~H列・J~M列・O~R列に表示する。 その際、A~C列にあるコンマ区切りの数字は3つのものと4つのものがあります。画像の上段部分をご確認ください。 その際のマクロは下記のとおりです。 Sub Test() Dim i As Long, j As Long, k As Long Dim tmp As Variant For i = 1 To 3 For j = 3 To 11 tmp = Split(Cells(j, i).Value, ",") For k = 0 To UBound(tmp) If k < 4 Then Cells(j, i).Offset(0, i * 4 + k).Value = tmp(k) End If Next Next Next End Sub 変更したいのは、AC8~AE16にコンマ区切りの数字があります。 AC列にある数字はAI8~AL16にAD列にある数字はAS8~AV16に AE列にある数字はBC8~BF16に表示したいと考えています。 コンマ区切りの数字は3つのものと4つのものがあります。 (画像の下段部分をご確認ください。) 上記のマクロでは下記の部分を変更する必要なのかと考えていますが、変更方法がわかりません。 お分かりの方教えていただけたら幸いです。 どうぞよろしくお願いいたします。 For k = 0 To UBound(tmp) If k < 4 Then Cells(j, i).Offset(0, i * 4 + k).Value = tmp(k)

  • ExcelのVBAで質問です。

    以下のようなシートがあります。 A列  B列  C列  D列  E列  F列  G列  H列 NO  名前  確認 日付1 日付2  確認 日付1 日付2 6行目からデータを入れる予定です。 C列には○印を入力します。 C列~E列までデータが入った行は、 F列~H列まで同じ処理をします。 (セルの背景色を変えます。) 以後同じことを列方向で繰り返します。 以下のようなVBAを組みましたが、 ○の個数を数える部分でエラーがでます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim staff As String Dim kakunin As String Dim date1 As Date Dim date2 As Date Dim i As Long Dim j As Long Dim cnt As Long '100件分ループ For i = 6 To 105 '○の数をカウント cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(i, 2), Cells(i, 256)), "○") 'jとは確認の列番号のこと j = 3 * cnt staff = Cells(i, 2) kakunin = Cells(i, j) date1 = Cells(i, j + 1) date2 = Cells(i, j + 2) 'スタッフ名が入力されたら If staff = "" Then Range(Cells(i, j), Cells(i, j + 50)).Interior.ColorIndex = 15 Else Cells(i, j).Interior.ColorIndex = xlNone '○が入力されたら If kakunin = "○" Then Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = xlNone Else Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = 15 End If If Cells(i, j + 1) <> "" And Cells(i, j + 2) <> "" Then Cells(i, j + 3).Interior.ColorIndex = xlNone End If End If Next i End Sub ご教授いただけたら、幸いです。 よろしくお願いいたします。

  • VBAでSplitエラーです

    環境:Excel2002です   Cells(1, 1)に(1)~(10),(13),(20)~(28)のような値があります   Cells(1, 1)の値は別のプロシージャ求めていてその都度変わります   Cells(j, 4)をスタート位置にして   Cells(j, 4)に(1)~(10)   Cells(j+1, 4)に(13)   Cells(j+2, 4)に(20)~(28)を表示したいので   以下のプロシージャにしました Dim Str As String Str = ActiveSheet.Cells(1, 1).Value Dim i As Integer Dim j As Integer '◆カンマで区切った文字列をD列に格納 Dim tmp As Variant tmp = Split(Str, ",") j = 1 For i = 0 To UBound(tmp) ActiveSheet.Cells(j, 4) = tmp(i) j = j + 1 Next i   あるブックでは正常に動作するのですが   別のブックでは以下のエラーメッセージがでて動作しません   【モジュールではなく、変数またはプロシージャを指定してください】   何が原因なのでしょうか?ご教示願います   Splitを使わない別の方法があればそれでも結構です   とにかく困っています

専門家に質問してみよう