• ベストアンサー

【Excel VBA】カンマ毎にデータを区切る

はじめて質問をさせて頂きます。 Excel VBAは初心者です。 仕事で必要なため、本を読みながら考えておりましたが、 手も足も出ない状態です。 【質問内容】 Excel VBAにて、ExcelファイルのA列のみに格納されているデータを カンマ「,」の位置毎に区切ります。 ※格納されているデータ例:A,B,C,D,E Excelの区切り位置にて、カンマで区切る処理と同じです。 A1から処理を開始し、A列のデータがなくなるまで 上記の処理を行います。 下記のプログラムを実行すると、1行目は正常にカンマ毎に 区切られますが、2行目以降はカンマ毎に区切られず、 そのままの状態です。 どこに問題があり、どのように修正すれば良いのでしょうか、 ご教示頂けると助かります。宜しくお願いします。 【プログラム】 Sub カンマ毎に区切る() Dim mydata As String Dim myArray() As String Dim i, j As Integer j = 0 Do While Cells(j + 1, "A").Value <> "" mydata = Cells(j + 1, 1) myArray() = Split(mydata, ",") For i = 0 To UBound(myArray) Cells(1, i + 1).Value = myArray(i) Next j = j + 1 Loop End Sub

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

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

>どこに問題があり、どのように修正すれば良いのでしょうか、 >Cells(1, i + 1).Value = myArray(i) ここです。Cells(1, i + 1)で常に1行目を指定していますから。 変数jを使えば良いです。 >j = 0 ここを 1 から始めて >Do While Cells(j + 1, "A").Value <> "" >  mydata = Cells(j + 1, 1) ここも j + 1 ではなく j に修正。 ついでに。 j = 1 Do While Cells(j, "A").Value <> ""   mydata = Cells(j, 1).Value   myArray() = Split(mydata, ",")   Cells(j, 1).Resize(, UBound(myArray) + 1).Value = myArray   j = j + 1 Loop 配列myArrayのサイズに合わせて書き込み先をResizeすればLoop不要です。 それよりも 『Excelの区切り位置にて、カンマで区切る処理と同じです。』 なのでTextToColumnsメソッドを使えば良いと思いますが。 [データ]-[区切り位置]をマクロ記録してみてください。

coltcolt
質問者

お礼

end-uさんのアドバイスにより、無事に解決しました。 早急で的確なアドバイス、有難う御座います。

その他の回答 (3)

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

参考に Dim c As Range, myArray As Variant For Each c In Range("A1", Cells(Rows.Count, "A").End(xlUp))   myArray = Split(c.Value, ",")   c.Resize(, UBound(myArray) + 1).Value = myArray Next

coltcolt
質問者

お礼

多くの方のアドバイスにより、無事に解決致しました。 watabe007さんのプログラムを試してみます。 アドバイス有難う御座います。

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

犯人はコレ→Cells(1, i + 1).Value = myArray(i) 処理するデータは行(j)で変わるのに、結果は常に1行目に出力されます。 Dim mydata As String Dim myArray As Variant '★Variantに変更 Dim myElement As Variant '★新規 Dim mySheet As WorkSheet '★新規 Dim i As Long, j As Long '★特に理由が無ければlongの方が良い j = 0 '★明示的にワークシートを指定すべき Set mySheet = ThisWorkbook.WorkSheets(1) Do     j = j + 1     mydata = mySheet.Cells(j, 1)     If mydata = "" Then Exit Do     myArray = Split(mydata, ",") '★()は不要     i = 0     For Each myElement In myArray         i = i + 1         Cells(j, i).Value = myElement     Loop Loop

coltcolt
質問者

お礼

nda23さんのアドバイス、判りやすくて参考になりました。 無事に解決致しました、有難う御座います。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

A列全体を選択して、 「データ」-「区切り位置」でカンマで区切ればいいのでは?

coltcolt
質問者

お礼

n-junさんのアドバイスはごもっともです。 実は諸事情により、VBAでカンマ区切りをする必要がありましたが、 多くの方のアドバイスにより、無事にVBAでカンマ区切りができました。 有難う御座います。

関連するQ&A

  • エクセル2007 VBA シート内のデータを項目名で検索し、その列を新

    エクセル2007 VBA シート内のデータを項目名で検索し、その列を新規シートにコピーする方法についてです。 VBAについては初心者で、グーグルで調べながら作ったのですが、コピー後のペーストが上手く出来ません。どうすれば最後まで処理できるのかを教えて下さい。 それと、全体的に書き方がおかしいところがありましたら指摘・改善方法を教えて下さい。 よろしくお願いします。 Sub 配列並べ替え() Dim myArray As Variant '1項目名希望順配列格納 Dim strArray As Variant '2検索用1の配列格納 Dim LastCol1 As Long '3最終列数格納 Dim LastCol2 As Long '4新規シートの最終列数格納 Dim DefSheetname As Variant '5初期のシート名取得 Dim i As Long Dim j As Long '初期シート名を取得。 DefSheetname = ActiveSheet.Name '初期シートの最終列数取得。 LastCol1 = Worksheets(DefSheetname).Range("A1").End(xlToRight).Column 'シート名:レポートの新規シート追加。 Worksheets.Add.Name = "レポート" '初期シートを選択。 Worksheets(DefSheetname).Select '項目名希望順配列格納。 myArray = Array("得意先C", "取引先名1", "製番", "相手管理NO", "品目C", _ "製品名1", "受注数", "受注残数", "納期", "受注単価", _ "受注金額", "出荷数", "出荷金額", "出荷先名1", "郵便番号", "住所1", "TEL", "FAX") '配列要素数分繰り返し処理。 For i = LBound(myArray) To UBound(myArray) '検索用の配列(項目名)格納。 strArray = myArray(i) 'A1:LastCol1範囲で配列(項目名)検索し、番号で返す。 j = WorksheetFunction.Match(strArray, Worksheets(DefSheetname).Range(Cells(1, 1), Cells(1, LastCol1)), 0) 'シート名:レポートに変数jの列数目の値を入力。 Columns(j).Copy 'シート名:レポートの最終列数取得。 LastCol2 = Worksheets("レポート").Range("A1").End(xlToRight).Column 'シート名:レポートを選択。 Worksheets("レポート").Select Range(Cells(1, 1), Cells(1, "LastCol2")).Past Next i End Sub

  • 【Excel VBA】ファイルにヘッダーを挿入

    Excel VBAが初心者です、よろしくお願いします。 仕事で必要なため本を読みながら挑戦しております。 アドバイスをいただけると助かります。 【実現したいこと】 あるフォルダ内に格納された多くのファイルに、ヘッダーを挿入します。ヘッダー挿入後のファイルは、新ファイルで保存をします。 詳細は下記のとおりです。また、作りかけのプログラムも以下のとおりです。 【詳細】 ・あるフォルダ:0001tokyou、0002tokyou・・・1000tokyou・・・(数字4桁は固定+tokyou)というファイルが格納されております。ファイル数はそのときによって異なります。これらは拡張子が無いファイルですが、メモ帳で開くことができます。VBAではフォルダを選択できることとします。 ・ヘッダー:ヘッダーは1種類ですが、項目は10個あります。 ・新ファイル保存:ヘッダー挿入前のファイル「0001tokyou」にヘッダーを挿入したら、「0001kantou」という新しいファイルで保存します。従って、0001tokyouファイルは存在したままです。 【作りかけのプログラム】 Sub ヘッダ挿入と別名保存() Dim myFile As String Dim mydata As String Dim myArray() As String Dim fileName As String Dim folderName As String Dim i, j As Integer Dim header As Variant header = Array("氏名", "性別", "年齢", "生年月日", "住所", "マンション名", "備考1", "備考2", "備考3", "備考4") '挿入するヘッダーを定義する。 If Application.FileDialog(msoFileDialogFolderPicker).Show Then folderName = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1) End If '加工するファイルが格納されているフォルダを指定する。 If folderName = "" Then MsgBox "フォルダが指定されませんでした。処理を終了します。", vbOKOnly Exit Sub End If '加工するファイルが格納されているフォルダが指定されなかった場合の処理です。 fileName = Dir(folderName & "\*") Do While fileName <> "" myFile = Workbooks.Open fileName:=folderName & "\" & fileName For i = 0 To 8 'ヘッダーを新ファイルに挿入する。 Cells(1, i + 1).Value = header(i + 1) Next i fileName = Dir() Loop End Sub アドバイスをいただけると助かります。 よろしくお願いします。

  • VBA でコンマ区切りのデータを取り込む方法

    こんにちは、VBAでお聞きします。 DIM Data as String で Data=12,45,3,68,5となっているとき コンマ区切りで仕切られた値を一つずつ 取り出して、MsgBox関数で、それぞれの 値を表示したいのです。 そのためには、それぞれの値と、値が いくつあるかを知る必要があります。 その方法を教えて下さい

  • データ検索ネスト Excel VBA

    excel2003でデータ検索の処理をするというマクロをVBAで作成したいのですが、うまく動作しません。自作のVBAを記載してみましたので何が原因なのか教えてください。初心者です、よろしくお願いします。 Sub データ検索() Dim i As Integer, j As Integer, k As Integer, l As Integer Dim myRange As Range Dim IngLastrow As Long IngLastrow = Range("A65536").End(xlUp).Row For i = 3 To IngLastrow For j = 3 To 25 For k = 8 To 53 For l = 3 To 9 Set myRange = Worksheets("データベース").Cells(i, "o").Find(what:=Worksheets("コード").Cells(j, "o").Value, _ LookIn:=xlValues) If Not myRange Is Nothing Then Worksheets("予定").Cells(k, l).Value = myRange.Offset(, -12).Value End If Next l Next k Next j Next i End Sub

  • エクセルのマクロで複数セル指定は?

    以前(7月22日 質問No.936181)の質問でご回答を頂いたマクロなんですが、 Private Sub Worksheet_Change(ByVal Target As Range) Dim MyData As String Dim i As Integer Dim ImaNanji As String Dim SakkiNanji As String Dim ImaNanpun As String Dim SakkiNanpun As String SakkiNanpun = Cells(2, 3).Value ImaNanji = Cells(1, 3).Value ImaNanpun = Mid(ImaNanji, Len(ImaNanji) - 4, 2) If ImaNanpun <> SakkiNanpun Then Application.EnableEvents = False For i = 10 To 2 Step -1 MyData = Cells(i - 1, 2).Value Cells(i, 2).Value = MyData Next i MyData = Cells(1, 1).Value Cells(1, 2).Value = MyData Cells(2, 3).Value = ImaNanpun Application.EnableEvents = True End If End Sub A1のデータをB1からB10に一分おきにつぎつぎに書き込むというものなんですが、ひとつのセルではなく複数のセル(例えばA1からA30の30個のセル)をいっぺんに書き込むようにしたいのですが可能でしょうか? よろしくお願いします。

  • Excel VBA: Inputステートメントで読み込むと、データ中のカンマで切れてしまう。

    いつも皆様ありがとうございます。 ExcelのVBAで、以下の仕様のテキスト・ファイルを1行ずつ読み込もうとしています。 【仕様】 ・1行は1つ以上のスペースで区切られた複数の値から成る。 ・値中に、半角カンマが含まれる場合がある。 値中にカンマが存在しない場合は、問題なく改行まで読み込まれるのですが、カンマがあるとそのカンマ以降のデータが読み込まれません。 Dim intFF As Integer 'FreeFile値 Dim strFileName As String 'ファイル名 Dim strRec As String '1行の読み込み内容 strFileName = "TEST.txt" intFF = FreeFile Open strFileName for Input As #intFF Do Until EOF(intFF) Input #intFF, strREC ' ※1 ・・・(省略) 上記※1のコード実行後にstrRECの中を見ると、カンマ以降の文字列が読み込まれていません。 例えば「A BB CCC DDDD」というデータの場合は問題なくそのままの値がstrRECの中に入っていますが、「A BB CC,C DDDD」というデータだと「A BB CC」というようになってしまいます。 Inputステートメントについて調べましたが、区切り文字に関する記述がなかったので困っています。 もし原因をご存知の方がいらっしゃいましたらお教えいただけないでしょうか。 よろしくお願いいたします。

  • Excel2010VBAの検索の高速化

    Excel2010VBAで、シート1のデータから変数「日時(a)」、「 データ1(a)」、「データ2(a)」、「データ3(a)」、「データ4(a)」、「データ5(a)」に格納し、変数「日時(a)」とシート2の「日時」の行に一致するセルに変数「 データ1(a)」、「データ2(a)」、「データ3(a)」、「データ4(a)」、「データ5(a)」を入力するというプログラムです。 ここで、検索を高速化する方法はあるでしょうか?(セルに関数は使用していません。) A   B   C  D     E         F       年   月  日  時刻  日時       データ1   2011  1  2   23:01  2011.1.2 23:01 1       ~ ~ G     H      I     J データ2  データ3 データ4 データ5 2      3     4     24 ~ ~ Dim a As Long Dim 年(1 To 9999999) As Integer Dim 月(1 To 9999999) As Integer Dim 日(1 To 9999999) As Integer Dim 時刻(1 To 9999999) As Date Dim データ1(1 To 9999999) Dim データ2(1 To 9999999) Dim データ3(1 To 9999999) Dim データ4(1 To 9999999) Dim データ5(1 To 9999999) As Integer Dim 日時(1 To 999999) As String, 範囲 As Range, 範囲文字列 As String, 縦位置 As Long a = 1 With Workbooks("ブック.xlsm").Worksheets("シート1") Do 日時(a) = .Cells(a + 1, 5) データ1(a) = .Cells(a + 1, 6) データ2(a) = .Cells(a + 1, 7) データ3(a) = .Cells(a + 1, 8) データ4(a) = .Cells(a + 1, 9) If .Cells(a + 1, 10) <> "" Then データ5(a) = .Cells(a + 1, 10) End If a = a + 1 Loop Until .Cells(a + 1, 1) = "" End With a = 1 With Workbooks("ブック.xlsm").Worksheets("シート2") Do Set 範囲 = .Range(Cells(2, 5), Cells(Rows.Count, 5)).Find(What:=日時(a), LookIn:=xlValues, lookat:=xlWhole) If Not 範囲 Is Nothing Then 範囲文字列 = 範囲.Address(ReferenceStyle:=xlR1C1) 縦位置 = Mid(範囲文字列, 2, InStr(2, 範囲文字列, "C") - 2) .Cells(縦位置, 6) = データ1(a) .Cells(縦位置, 7) = データ2(a) .Cells(縦位置, 8) = データ3(a) .Cells(縦位置, 9) = データ4(a) If データ5(a) <> 0 Then .Cells(縦位置, 10) = データ5(a) End If End If a = a + 1 Loop Until 日時(a) = "" End With 回答よろしくお願いします。

  • 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を使わない別の方法があればそれでも結構です   とにかく困っています

  • VBAで、ExcelシートにCSVファイルのデータを取り込みたいのです

    VBAで、ExcelシートにCSVファイルのデータを取り込みたいのですが、 1行目しか取り込めません。 取り込む項目数は32個です。 以下のコードでは、Excelシートの1行目のみ取り込みができますが、 1行目32列目のセルには、2行目のA列に表示されるべきデータも表示されます。 2行目以下は取り込みできていません。 Sub CSV取込() Dim OpenFileName As String Dim MyString As String Dim MyVar As Variant Dim i As Long, j As Long OpenFileName = Application.GetOpenFilename("CSVファイル,*.csv") If OpenFileName = "False" Then MsgBox "キャンセルされました。" Else Open OpenFileName For Input Access Read As #1 i = 1 While Not EOF(1) Line Input #1, MyString MyVar = Split(MyString, ",") If MyVar(0) <> "" Then For j = 0 To 31 ThisWorkbook.ActiveSheet.Cells(i + 10, j + 1) = MyVar(j) Next j i = i + 1 End If Wend Close #1 End If End Sub おそらく、改行が判別できないためかと思いますが、 どこが間違っているのかがわかりません。 アドバイスをよろしくお願いします。

  • Excel_VBAで検索してデータ反映ができない

    Excel関数(vlookup)ではなく、VBAで以下内容のことを作成してみたのですが、うまく動きませんでした。 どこが問題なのか調べられないため、問題個所を教えていただけます様、お願いいたします。 ※Excel関数(vlookup)を使用しない理由は、検索行数が膨大で関数だと動きが重たくなるため。 お手数おかけしますが、ご教示のほど、お願いいたします。 【内容】 sheet2のB列の値をsheet1のC列へ反映したい。 なお、sheet1のA列には空白があっても空白行は飛ばして、次の行を検索・反映させる。 <sheet1> <sheet2>   A   B   C         A   B    1 AAA  3/2          1 AAA  大阪 2 BBB  6/7           2 BBB  兵庫 3 CCC  5/31          3 CCC  奈良 4 DDD 7/28          4 DDD  和歌山 5                5 EEE  京都 6 FFF  12/2         6 FFF  滋賀 【作成したVBA】 Sub kensaku() Dim search As String Dim i As Long Dim j As Long For j = 3 To 10 'jが3からSTEPしないのはなぜか? search = Cells(j, 2) For i = 2 To 11 For k = 3 To 12     If search = Worksheets("sheet2").Cells(i, 1) Then     Cells(k, 3) = Worksheets("sheet2").Cells(i, 2) End If Next Next Next End Sub

専門家に質問してみよう