• 締切済み

csvファイルを列数ごとに分割するExcelマクロ

csvファイルを列数ごとに分割するExcelマクロが書けずに困っています。 これがないため作業が遅くなり困っています。 横に長い(列数が多い)csvファイルを指定した列数ごとに分割して複数のcsvファイルに分けたいのですができません。 行数ごとに分割して複数のcsvファイルに分けるExcelマクロは調べると複数出てくるのですが... 何かいい方法はないでしょうか? 以下がコードです。 https://yu-syan.sakura.ne.jp/?p=87 たぶんLine Input # ステートメントで行数ごとに読込している部分を列数ごとに読込すればできると思うのですがその動作をするステートメントが無いため困っています。 http://officetanaka.net/excel/vba/statement/LineInput.htm 以下がcsvファイルです。 https://drive.google.com/file/d/1W0O4R10ibNVRnzDzeZ9AKSRT9gueS3GZ/view?usp=drive_link #VBA #Excel #マクロ #csv #データ処理

みんなの回答

  • NuboChan
  • ベストアンサー率47% (785/1650)
回答No.8

確認してみましたが、 コードが希望の処理とは違いました。 コードを書き直しました。 参考にしてください。 Option Explicit Sub readCSV() Dim myFile As String, text As String, textline As String Dim dataArray() As String Dim i As Long, j As Long myFile = "C:\Users\TAC_\Desktop\test.csv" 'CSVファイルのパスを指定 Open myFile For Input As #1 Do Until EOF(1) Line Input #1, textline textline = textline & "," text = text & textline Loop Close #1 dataArray = Split(text, ",") 'カンマで分割して配列に格納 ' For i = LBound(dataArray) To UBound(dataArray) ' Debug.Print dataArray(i) '配列の中身を表示 ' Next i Dim numRows As Long, numCols As Long Dim colCounter As Long ' 列数を指定 numCols = 5 ' 行数を計算 numRows = WorksheetFunction.Ceiling(UBound(dataArray) / numCols, 1) 'シート初期化 Worksheets("Sheet1").Cells.Clear ' セルにデータを書き出す For i = 1 To numRows For j = 1 To numCols colCounter = colCounter + 1 If colCounter <= UBound(dataArray) Then Worksheets("Sheet1").Cells(i, j).Value = dataArray(colCounter - 1) End If Next j Next i '名前を付けて「CSV」で保存 Worksheets("Sheet1").Copy ActiveWorkbook.SaveAs "C:\Users\TAC_\Desktop\" & "New.csv", xlCSV ActiveWorkbook.Close 'ブックを閉じる End Sub

  • NuboChan
  • ベストアンサー率47% (785/1650)
回答No.7

1)CSVファイルを指定する列数(横方向のセルの個数)ごとに区切ってシートに書き出した後で 2)シート毎に別ファイルにカンマ区切りでCSV形式で保存すれば良いだけでは ? 1)は既に参考コードを添付しているので 2)は下記コードを改造して利用ください Sub SaveSheetsAsCSV() Dim WS As Worksheet Dim SaveToDirectory As String SaveToDirectory = "C:\CSVFiles\" '保存先のディレクトリを指定 For Each WS In ThisWorkbook.Worksheets WS.SaveAs SaveToDirectory & WS.Name & ".csv", xlCSV 'CSV形式で保存 Next End Sub

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.6

回答No.5の追加です。 CSVをSheet1に読み込む方法は以下のサイトを参考にしてください。 エクセルの神髄 CSVの読み込み方法 https://excel-ubara.com/excelvba5/EXCEL111.html

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.5

回答No.1の補足について > 上記の方法も検討しましたが分割する数が多いためExcelマクロを作成しようと考えた次第です。 既になにがしかのマクロを作成していて実績があるようでしたのでコードは記載していませんが、回答No.1はそのようなマクロを作ればいいのではないですかという提案です。 たとえば回答No.1のやりかたで3列ごとにCSVで保存するマクロの例です。CSVはあらかじめマクロ実行するブックのSheet1に読み込んでおいてください。Sheet2に必要なデータだけ代入してSheet2をCSVで保存を繰り返しています。 Sub Test() Dim i As Long, LastColumn As Long, LastRow As Long Dim Ws1 As Worksheet, Ws2 As Worksheet Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") LastColumn = Ws1.Cells(1, Ws1.Columns.Count).End(xlToLeft).Column LastRow = Ws1.Cells(Ws1.Rows.Count, 1).End(xlUp).Row For i = 1 To LastColumn Step 3 Ws2.Cells.Clear Ws2.Cells(1, 1).Resize(LastRow, 3).Value = Ws1.Cells(1, i).Resize(LastRow, 3).Value Ws2.Activate ActiveWorkbook.SaveAs ThisWorkbook.Path & "\TestCsv" & i, FileFormat:=xlCSV Next

  • NuboChan
  • ベストアンサー率47% (785/1650)
回答No.4

希望は、 指定のCSVファイルを開き、区切り記号(カンマ)で区切って各セルに読み込み、 指定列数に達すると、次の行に書き出し、指定行数に達すると、次のシートに書き出すとの事ですか ? このコードを使用する前に、myPath、myFileName、myDelimiter、myRowCount、myColCount、myMaxRows、 およびmyMaxColsを希望の値に設定してください。 検証していないのでミスしていたらごめんなさい。 Sub ImportCSV() Dim myFile As String, text As String, textline As String Dim i As Long, j As Long, k As Long, n As Long, m As Long Dim myArray() As String, myArray2() As String Dim ws As Worksheet Dim myPath As String Dim myFileName As String Dim myDelimiter As String Dim myRowCount As Long Dim myColCount As Long Dim myMaxRows As Long Dim myMaxCols As Long 'Set the path and file name myPath = "C:\MyFolder\" myFileName = "MyFile.csv" myDelimiter = "," myRowCount = 0 myColCount = 0 myMaxRows = 100 myMaxCols = 10 'Open the file Open myPath & myFileName For Input As #1 'Loop through the file Do Until EOF(1) Line Input #1, textline myArray = Split(textline, myDelimiter) myColCount = UBound(myArray) + 1 If myColCount > myMaxCols Then myColCount = myMaxCols End If For i = 0 To myColCount - 1 Cells(myRowCount + 1, i + 1) = myArray(i) Next i myRowCount = myRowCount + 1 If myRowCount > myMaxRows Then myRowCount = 0 myColCount = 0 m = m + 1 Set ws = ThisWorkbook.Sheets.Add(After:= _ ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) ws.Name = "Sheet" & m End If Loop 'Close the file Close #1 End Sub

homura100
質問者

補足

ご回答ありがとうございます。こちらのコードを実行させて頂き、VBA上でエラーが出ないことを確認しました。しかし、私の説明が足りない部分がありましたので返信・補足させて頂きます。 希望は、 指定のCSVファイルを開き、区切り記号(カンマ)で区切って各セルに読み込み、 指定列数に達すると、次の行に書き出し、指定行数に達すると、次のシートに書き出すとの事ですか? >希望としては、CSVファイルを指定する列数(横方向のセルの個数)ごとに区切って別のcsvファイルに分割して出力するということです。指定する列数は毎回変わるため具体的な列数ではなく「指定する列数」と表現しました。イメージとしては、1つのcsvファイルを縦方向に何個にも分割するというものです。 区切り記号(カンマ)で区切って各セルに読み込み、 >ここで言うカンマというのはcsvファイル内の1行目のセルの中にあるカンマを指すのでしょうか?例を挙げると、上記のcsvファイルの1行A列には「/LN1/d (VB=-1,temp=-53) X」という文字列がありますが、こちらの「VB=-1」と「temp=-53」の間のカンマを指すのでしょうか? このコードを使用する前に、myPath、myFileName、myDelimiter、myRowCount、myColCount、myMaxRows、およびmyMaxColsを希望の値に設定してください。 >以下の解釈で合っていますでしょうか? myMaxRows=指定行数 myRowCount=指定列数 myRowCount>myMaxRowsの時に次のシートに書き出す myColCount>myMaxColsの時に次の行に書き出す

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

列指定は1つずつでよいのか、複数列分を1タイルにすることがあるのか。 一般に、プログラムを考えるとき、1つか、複数(連続か飛び飛び)か、飛び飛びか、は難しさを左右するので、意識して(設問に)説明すること。 元データの画像も(質問に挙げることは)大切だが、アウトプットのfデータ例も、より重要と思はないですか。 ーー VBAのLine Inputで、そのCSVファイル(の1レコードを)を変数に読み込み、VBAのSplit関数で、カンマごとに分割して、配列に入るので、インデックスを指定すればの望みの列データだけ取り出せる。 レコード全体の処理を繰り返し、配列の指定インデックスのデータに変数にカンマを加えて、変数に蓄積し、レコードが終われば、ファイルにどのように書きだすか。最後だけはカンマを添えないようにする。 あるいは1列1レコードにするのか? どちらにしても、SPLITで配列化できるので、本件はやさしい問題(VBA経験の早いうちに出くわす)ではないかな。 WEB記事も沢山ある。調べてみたのかな。

homura100
質問者

補足

ご回答ありがとうございます。 列指定は1つずつでよいのか、複数列分を1タイルにすることがあるのか。 一般に、プログラムを考えるとき、1つか、複数(連続か飛び飛び)か、飛び飛びか、は難しさを左右するので、意識して(設問に)説明すること。 >列指定について、1種類の数値だけを指定する方向で考えています。また、隣り合った連続した列を指定の列数ごとに分割しそれを新しくcsvファイルとして出力する(複数列分を1タイルにする)ものを考えています。 元データの画像も(質問に挙げることは)大切だが、アウトプットのfデータ例も、より重要と思はないですか。 >アウトプットのデータ例も重要であると思います。補足にて新しく画像の添付ができないため、文章で補足させて頂きます。アウトプットのデータとしては、隣り合った連続した列を指定の列数ごとに分割しそれが新しくcsvファイルとして出力されたものを考えています。 レコード全体の処理を繰り返し、配列の指定インデックスのデータに変数にカンマを加えて、変数に蓄積し、レコードが終われば、ファイルにどのように書きだすか。最後だけはカンマを添えないようにする。 あるいは1列1レコードにするのか? >レコードとは行のことでしょうか。そうであると仮定する場合、書き出されるファイルと理想形しては、元データと同じ数の行と実行時に指定した列を持つcsvファイルということになります。1行1列ごとのcsvファイルではありません。 WEB記事も沢山ある。調べてみたのかな。 >調べてみたのですが、指定した行ごとに分割するExcelマクロの記事しか見つからなかったため、質問させて頂きました。その中ではこちらが一番完成イメージに近いマクロでした。https://yu-syan.sakura.ne.jp/?p=87

回答No.2

私の場合、マクロ記録機能を使って、その記録内容をひたすら関数化していったぞ。その関数が溜まってくると、エクセルの操作をマクロ記録機能使わないで、呼び出せる。 今回もそれで行ける。例えば、 新規ファイル作成 任意の列指定 任意の列コピー 任意にシート切り替え 任意に列貼り付け 任意の名前を付けて保存 これらを1つにまとめると、次回も中身を重複して作ることになる。 だからわざわざ6つに別けるんだよ。以降それらの中から必要な関数だけ取り出して・無ければ足りない物だけ作って、使える。

homura100
質問者

補足

ご回答ありがとうございます。 マクロの記録で操作ごとにマクロを作成していくという手法は思いつきませんでした。 勉強になりました。ありがとうございます。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.1

コードもファイルも見ていませんが もとのCSVをエクセルで読み込んで列数ごとに別シートに分割コピーしてからシート毎にCSVファイルとして保存すればいかがですか。

homura100
質問者

補足

ご回答ありがとうございます。 上記の方法も検討しましたが分割する数が多いためExcelマクロを作成しようと考えた次第です。

関連するQ&A