アプリ版:「スタンプのみでお礼する」機能のリリースについて

csvファイルを列数ごとに分割するExcelマクロが書けずに困っています。
これがないため作業が遅くなり困っています。
横に長い(列数が多い)csvファイルを指定した列数ごとに分割して複数のcsvファイルに分けたいのですができません。
行数ごとに分割して複数のcsvファイルに分けるExcelマクロは調べると複数出てくるのですが...
何かいい方法はないでしょうか?

以下がコードです。

https://yu-syan.sakura.ne.jp/?p=87

たぶんLine Input # ステートメントで行数ごとに読込している部分を列数ごとに読込すればできると思うのですがその動作をするステートメントが無いため困っています。

http://officetanaka.net/excel/vba/statement/Line …

以下がcsvファイルです。

https://drive.google.com/file/d/1W0O4R10ibNVRnzD …

#VBA
#Excel
#マクロ
#csv
#データ処理

「csvファイルを列数ごとに分割するExc」の質問画像

質問者からの補足コメント

  • うれしい

    ご返答ありがとうございます。

    Excelのマクロでお考えなら、(中略)何らかの工夫が必要になってきますけれど。
    >その通りだと考えられます。そのため、シート上のデータを指定した列数ごとに分割するExcelマクロを作りたいと考えています。

    CSVは行単位で記述されているので、(中略)クォーテーション内のカンマは除かねばならないので、面倒になります。
    >確認したところ、今回使用しているcsvファイル内にはセパレータ(,)はありましたがダブルクォーテーション(“)はありませんでした。

    また、出力ファイルをひとつづつ順に処理してゆく方法だと、(中略)1回の読み込みでも済みますけれど・・・
    >その通りだと考えられます。しかし、マクロの動作速度はそこまで気にしていないので最低限所望の動作を達成できるマクロを作ることができれば良いと考えています。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/10/15 12:19
  • ご返答ありがとうございます。

    上記の問題をクリアした解決方法の提示は、可能ですが、その際、下記の仕様で作成しますが、よろしいでしょうか。
    >よろしくお願いします。仕様3.4.5.は問題ありません。仕様1.2.については以下の仕様で作成して頂けるとより所望の仕様に近いです。

    1.分割したファイルは、指定したフォルダに作成される。
    2.分割したファイル名は、以下のようになります。
    元のファイルをsample.csvとすると
    sample_LN1.csv
    sample_LN2.csv
    ・・・・
    sample_RP4.csv
    のような名前になります。つまり、csvファイルの1行目のセルの1コ目と2コ目のスラッシュ(/)の間の文字が元のファイル名以降に追加されます。
    例)/LN1/d (VB=-1,temp=-53) X → LN1

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/10/15 13:33
  • うれしい

    ご返答ありがとうございます。

    No.2の回答の補足コメントの補足コメントです。
    No.2.3.4.5のコメント拝見しました。

    この機能が欲しいのでよろしくお願いします。
    シートのレイアウトはNo.4のものが良いです。

    この機能があればさらに便利です。つまり、現在のところの最低限の所望の機能は分割前のファイルの選択時に分割する列数の長さの指定を変えることができる機能ですが、この機能(分割後のファイルごとに分割する列数の長さの指定を変えることができる機能)があればさらに便利です。

    No.4の回答に寄せられた補足コメントです。 補足日時:2023/10/15 14:01
  • ご返答ありがとうございます。

    先の質問でも気になりましたが。(中略)あとは連続するのか飛び飛びなのかかな。
    >指定した列数というのは、ファイル毎に変化し、一定の列数であり、連続した(隣り合う)列を分割するときのものを想定しています。
    Excelマクロの動作イメージとしては、こちらのサイトに記載されているものが一番近いです。 https://yu-syan.sakura.ne.jp/?p=87

    No.6の回答に寄せられた補足コメントです。 補足日時:2023/10/15 14:09
  • 所望のExcelマクロの動作イメージとしては、こちらのサイトに記載されているものが一番近いです。 https://yu-syan.sakura.ne.jp/?p=87

      補足日時:2023/10/15 14:11
  • ご返答ありがとうございます。

    //の文字は以下のようになっています。(中略)それとも、分割列数は114列固定で分割して良いのでしょうか。
    >分割列数(分割後の列群内の列の個数)は可変として毎回指定できるようにし、名前の追加部分には分割後の列群ごとに最初の列から抽出したものを採用します。なぜなら、そうすることで毎回変わる分割列数に対応できるからです。名前の問題に関しては、適切な分割列数を指定すれば適切な名前が割り当てられるので問題ありません。マクロ全体の動作イメージを添付画像を用いて説明すると、マクロのxlsmファイルの”input”シートのB列に入力した分割列数を上から順に読込し、入力csvファイルのA列から最終列まで、読込した分割列数の分進みながら分割する形です。

    「csvファイルを列数ごとに分割するExc」の補足画像6
    No.7の回答に寄せられた補足コメントです。 補足日時:2023/10/16 16:24
  • No4の機能を希望されるとのことですが、(中略)複数のパターンの場合は、1案か2案のどちらかを決めてください。
    >抽出列番号を指定するパターンは1つで考えています。シート名は、”input”で考えています。添付画像を用いて説明すると、A列に入力csvファイル名、B列に出力ファイルごとの分割列数を入力し、C列に出力csvファイル名(”入力ファイル名”+”_”+”文字列”(LN1等))が出力される形を想定しています。

    「csvファイルを列数ごとに分割するExc」の補足画像7
    No.8の回答に寄せられた補足コメントです。 補足日時:2023/10/16 16:29
  • //の文字は以下のようになっています。(中略)それとも、分割列数は114列固定で分割して良いのでしょうか。
    >出力csvファイル名の指定について、より汎用性の高い別の方法を思いついたので、そちらでも問題ありません。添付画像を用いて説明すると、A列に入力csvファイル名、B列に出力列数、C列に追加文字列を入力すると、A列に入力したファイルが読込対象となり、B列に入力した値が出力列数となり、C列に入力した文字列が出力ファイル名の追加部分となります。

    「csvファイルを列数ごとに分割するExc」の補足画像8
    No.7の回答に寄せられた補足コメントです。 補足日時:2023/10/16 16:31

A 回答 (8件)

No4です。


No4の機能を希望されるとのことですが、その場合、
抽出列番号を指定されるパターンは1つのみでしょうか。
それともいくつかのパターンがあるのでしょうか。
1つのパターンのみであれば、シート名を固定にして、そのシートのみを参照するようにします。(その方が間違いを防げるため)
複数のパターンがある場合、複数のシートに記述することになりますが、
その場合、どうやってシート名をマクロに指定するかが問題になります。
1案:シート名を入力して、そのシートを使用する。
2案:処理対象となるシートを画面に表示して、アクティブシートに対してマクロが動作するようにする。
が考えられます。

1つのパターンなのか
複数のパターンなのか、どちらでしょうか。
1つのパターンの場合は、シート名を決めてください。
複数のパターンの場合は、1案か2案のどちらかを決めてください。
この回答への補足あり
    • good
    • 0

No2です。


No2の補足の件ですが、
>1.分割したファイルは、指定したフォルダに作成される。
了解しました。出力先のフォルダを指定するようにします。

>2.分割したファイル名は、以下のようになります。
>元のファイルをsample.csvとすると
>sample_LN1.csv
>sample_LN2.csv
>・・・・
>sample_RP4.csv
>のような名前になります。つまり、csvファイルの1行目のセルの1コ目と2コ目のスラッシュ(/)の間の文字が元のファイル名以降に追加されます。
>例)/LN1/d (VB=-1,temp=-53) X → LN1


//の文字は以下のようになっています。

 1列~114列 LN1
115列~228列 LN2
229列~342列 LN3
343列~456列 LN4
457列~570列 LP1
・・省略・・
1711列~1824列 RP4

分割列数で114を指定した場合は、あなたが希望する名前になりますが、
分割列数で例えば10を指定すると同じ名前のファイルがたくさん作られることになります。
その場合は、どうするのでしょうか。
分割列数=10の場合、
sample_LN1.csv(1~10列)
sample_LN1.csv(11~20列)
sample_LN1.csv(21~30列)
・・・
sample_LN1.csv(110-120列)(一部LN2もあるので最初の列を採用するならLN1となる)
のような名前になってしまいます。

それとも、分割列数は114列固定で分割して良いのでしょうか。
この回答への補足あり
    • good
    • 0

先の質問でも気になりましたが。


結局どれだけの列数を1つのファイルに入れたいのか?と言う疑問があります。

>指定した列数

ファイル毎に変化するのか、一定ではない列数なのか(最初は4、次が6・4・8・・・とか)などですね。
あとは連続するのか飛び飛びなのかかな。
この回答への補足あり
    • good
    • 1

No4です。


シートのレイアウトはこちらの方が判りやすいかもしれません。
あなたの好みの方を選んでください。
「csvファイルを列数ごとに分割するExc」の回答画像5
    • good
    • 1

よく考えてみると、あなたが本当に欲しい機能は、


CSVファイルから任意の列(複数可)を抜き出して、それをCSVファイルとして出力する機能ではないかという気がします。
添付図のように
B2に入力CSVファイル名
C2に出力CSVファイル名
A2~A8に出力列番号(何列でも指定可能)
を記入します。この出力列番号順にCSVの列からデータを抜き出し、出力CSVファイルに出力します。
出力列番号は昇順である必要はありません。任意の順番を指定できます。
(添付図の黄色のセルがマクロが参照するセルです)

この機能が欲しい場合は、その旨返信ください。
「csvファイルを列数ごとに分割するExc」の回答画像4
この回答への補足あり
    • good
    • 1

No2です。


仕様の追加です。
6.指定可能な分割列数は1~999とします。
    • good
    • 1

提示されたCSVファイルを見てみました。


問題点としては、以下の点があります。
1.改行コードがCRLF(0D0A)でなく、LFになっている。
(linuxの改行コード)
その為、Line input #ステートメントでは1行単位で読み込むことはできません。(テキストストリームのreadlineなら読み込み可能)
2.1行目(見出し)は、各項目は、ダブルクオートでくくられており、
その中に、カンマが存在します。
従って、単純にカンマで分割することはできません。
見出し行のみ、特殊な分割方法が必要になります。
"/RP4/d (VB=1,temp=117) X","/RP4/d (VB=1,temp=117) Y"
のようなデータは、本来、2項目ですが、単純にカンマで分割すると
4項目になります。
データは、単純にカンマで分割しても問題ありません。

上記の問題をクリアした解決方法の提示は、可能ですが、その際、
下記の仕様で作成しますが、よろしいでしょうか。
1.分割したファイルは、元のファイルと同じフォルダに作成される。
2.分割したファイル名は、以下のようになります。
元のファイルをsample.csvとすると
sample_0001.csv
sample_0002.csv
・・・・
sample_9999.csv
のような名前になります。
1824項目なので、最大4桁の連番で可能と判断しています。
3.分割したファイルの改行コードはCRLF(windows形式)となります。
4.ファイルの拡張子は、.csvとし、.csv以外のファイルは受け付けない。
5.分割したファイルの1行目は、元のファイルと同じようにダブルクオートでくくった形式で1項目が構成される。
"/RP4/d (VB=1,temp=117) X","/RP4/d (VB=1,temp=117) Y"
のようなファイルになります。
従って、このファイルをLine input #で読み込みは可能ですが、
単純にカンマで分割することはできません。
上記で宜しいでしょうか。
特に問題となると考えられるのは、項番4と項番5です。
項番4は、問題がある場合、どのような場合に問題があるか、述べてください。
項番5は、出力時に、ダブルクオートの内のカンマを特殊文字(例えば@等)に置き換えることで、カンマでの分割が可能になります。
"/RP4/d (VB=1,temp=117) X","/RP4/d (VB=1,temp=117) Y"

"/RP4/d (VB=@temp=117) X","/RP4/d (VB=1@temp=117) Y"
のようにして出力します。
この回答への補足あり
    • good
    • 1

こんにちは



Excelのマクロでお考えなら、一旦、全データをシートに読み込んでしまい、好きな列数で分割すれば良いだけでは?
1シートに入らないような大量のデータの場合は、何らかの工夫が必要になってきますけれど。

>たぶんLine Input # ステートメントで行数ごとに読込している部分を
>列数ごとに読込すればできると思うのですが~
CSVは行単位で記述されているので、セパレータ(,)で分割(=Split)すれば列単位(=セル単位)に分割できます。
https://learn.microsoft.com/ja-jp/office/vba/lan …
ただし、データがクォーテーションを含む場合は、クォーテーション内のカンマは除かねばならないので、面倒になります。

また、出力ファイルをひとつづつ順に処理してゆく方法だと、何度も読み込み作業を行う必要が出るため非効率的です。
同時並行で複数ファイルに出力してゆくようにすれば、1回の読み込みでも済みますけれど・・・
この回答への補足あり
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A