Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2019)
CSVの1行毎のデータを別シートに読み込む方法
投稿日時: 22/08/16 13:07:16
投稿者: cherry747

CSV(LFコード)の1行毎のデータを同一ブック内の別々のシートに読み込ませる方法がわかりません。
同じシートに全行を読み込ませることはできるのですが、シートを分けるにはどのようなプロシージャにすればよいでしょうか?
 
もう少し具体的には、
1.ブックのsheet1にcsvインポートのボタンを設置して、クリックするとcsvファイルの選択ができる。
2.選択したcsvファイルを読み込ませる。
3.sheet2にフォーマットが決まったテンプレートが作ってある。
4.テンプレートをコピーして新しいsheetを作り、そのsheetにcsvデータの1行目だけを読み込ませる。
5.2行目以降も同様に別シートに書き出す。
(1〜3は、既に出来上がっています)
 
データ例
csv側
氏名1,郵便番号1,住所1,電話番号1
氏名2,郵便番号2,住所2,電話番号2
氏名3,郵便番号3,住所3,電話番号3
 
Excel側
sheet2のテンプレートをコピーして、sheet3を作り、名前を氏名1に変更する。
セルA8に氏名1 セルA10に郵便番号1 セルB11に住所1 セルA12に電話番号1
上記をシート毎に作る。
 
csvデータの行数は、都度、異なります。
 
VBA始めたばかりで勉強不足ですが、どなたかご教授のほど、
よろしくお願いいたします。m(_ _)m

回答
投稿日時: 22/08/16 14:57:08
投稿者: taitani
投稿者のウェブサイトに移動

VBA はどの辺まで作成されたのでしょうか。
2.4.5. 途中まででもよいので、提示された方が回答されやすいかと。
※ 何もないと「作ってください!」と思われてしまいます。
 
以下ページを参考に、できるとこまで作成してみましょう。
https://www.moug.net/tech/exvba/0060086.html
 

回答
投稿日時: 22/08/16 14:58:16
投稿者: WinArrow
投稿者のウェブサイトに移動

考え方として
CSV全件をSeet2に読み込んでおいて
Sheet2の各行に対応したシートに複写(又は移動)するという方法もあります。
 
もう一つに方法は、
Csv全件をメモリ(配列;:縦方向が行、横方向が項目))に読み込んでおいて
配列の1次元目をシートに出力する。
 
処理速度でいったら、後者の方がよいかも?・・・
 
ところで、1行=1シートにしなえればいけないのですか?
データ件数分のシートが作成されることになるが、
扱うのに不便ではないのですか?

回答
投稿日時: 22/08/16 15:05:07
投稿者: WinArrow
投稿者のウェブサイトに移動

よく見ると
データ1件を1行に格納するのではないですね・・・
 
ラベル印刷を想定しているのでしょうか?
 
もし、ラベル印刷を想定しているのでしたら、
1件=1行のデータのシートと
印刷用のシートを別にします。
1行を印刷用シートに複写して印刷
をデータ件数分繰り返エスような処理を考えましょう。

投稿日時: 22/08/16 16:54:05
投稿者: cherry747

taitani さんの引用:
VBA はどの辺まで作成されたのでしょうか。
2.4.5. 途中まででもよいので、提示された方が回答されやすいかと。
※ 何もないと「作ってください!」と思われてしまいます。
 
以下ページを参考に、できるとこまで作成してみましょう。
https://www.moug.net/tech/exvba/0060086.html
 

 
taitani様
 
コメントありがとうございます。
以下の感じで作っています。
が、これだと1行目だけ別シートができて、2行目以降は書き出されません。
行毎にシートを生成させるループが必要だとは思っているのですが。。。
 
Sub CSVインポート()
    Dim varFileName As Variant
    Dim intFree As Integer
    Dim strRec As String
    Dim strSplit() As String
    Dim i As Long, j As Long

    varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _
                                                Title:="CSVファイルの選択")
    If varFileName = False Then
       Exit Sub
    End If

    intFree = FreeFile
    Open varFileName For Input As #intFree
  
  Do Until EOF(1)
  Line Input #1, tmp
  hairetsu = Split(tmp, ",")

  Worksheets("申込書").Copy After:=Worksheets(Worksheets.Count)
  ActiveSheet.Name = hairetsu(3) + " " + hairetsu(4)
  
  Worksheets(Worksheets.Count).Cells(7, 9).Value = hairetsu(0)
  Worksheets(Worksheets.Count).Cells(7, 11).Value = hairetsu(1)
  Worksheets(Worksheets.Count).Cells(7, 13).Value = hairetsu(2)
  Worksheets(Worksheets.Count).Cells(8, 4).Value = hairetsu(5)
  Worksheets(Worksheets.Count).Cells(8, 9).Value = hairetsu(6)
  Worksheets(Worksheets.Count).Cells(9, 4).Value = hairetsu(3)
  Worksheets(Worksheets.Count).Cells(9, 9).Value = hairetsu(4)
  Loop
  Close #1

End Sub

投稿日時: 22/08/16 16:58:47
投稿者: cherry747

WinArrow さんの引用:
考え方として
CSV全件をSeet2に読み込んでおいて
Sheet2の各行に対応したシートに複写(又は移動)するという方法もあります。
 
もう一つに方法は、
Csv全件をメモリ(配列;:縦方向が行、横方向が項目))に読み込んでおいて
配列の1次元目をシートに出力する。
 
処理速度でいったら、後者の方がよいかも?・・・
 
ところで、1行=1シートにしなえればいけないのですか?
データ件数分のシートが作成されることになるが、
扱うのに不便ではないのですか?

 
WinArrow様
コメントありがとうございます。
なるほど! 先に全データをsheetに読み込ませておけば、行を指定できますね。
ちょっといろいろイジってみます。
 
で、そうなんです。例えば1000行とかあったら、とんでもないですよね。
その辺も考えてみます。

投稿日時: 22/08/16 17:04:43
投稿者: cherry747

WinArrow さんの引用:
よく見ると
データ1件を1行に格納するのではないですね・・・
 
ラベル印刷を想定しているのでしょうか?
 
もし、ラベル印刷を想定しているのでしたら、
1件=1行のデータのシートと
印刷用のシートを別にします。
1行を印刷用シートに複写して印刷
をデータ件数分繰り返エスような処理を考えましょう。

 
WinArrow様
 
ウェブのメールフォームから社員採用の申し込みを行い、
その入力データ(csvファイル)をExcelに取り込んで、
一人ひとりの申し込み書(履歴書みたいなもの)を別シートで作りたいのです。

回答
投稿日時: 22/08/16 17:12:40
投稿者: taitani
投稿者のウェブサイトに移動

ご回答ありがとうございます。
申し込み書を作成するのであれば、WinArrow さんの言っている通り、別シートに一括で貼り付けた方がいいと思います。
 
sheet1:セッティングシート
sheet2:名簿シート
sheet3:印刷用シート
あとは、名簿にインデックスつけるなどして、印刷を行うことを繰り返す VBA を作成してみましょう。
 
あと、CSV のファイル読み込みは、VBA で行うより、PowerQuery を利用したほうが私は好きです。
 
<参考>
https://www.kurumico.com/excel-powerquery-importcsv/4245/

回答
投稿日時: 22/08/16 17:16:16
投稿者: taitani
投稿者のウェブサイトに移動

あ、印刷じゃなかったですね。。。すみません。
人数がいっぱいいるなら、VBA を組み込んだファイルと同じフォルダとかに、1名:1ファイルで保存していくとか。
※ 一度作ったファイル?を上書きしないように設定が必要ですね。

回答
投稿日時: 22/08/16 17:24:54
投稿者: simple

横から失礼しますね。
改行にLFコードを使ったCSVファイルということですか?
それだと、一行読んだつもりが、まとめてすべてが読み込まれますよ。
CR+LFに改行コードを変更しておくのが吉かと思います。
それが不可なら、LFでSPLITして各行に分離、そのうえでさらにカンマでSPLITということになるでしょう。

回答
投稿日時: 22/08/16 18:55:16
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

一人ひとりの申し込み書(履歴書みたいなもの)を別シートで作りたいのです。

 
社員が1000人ならば1000シートになることは
誰でもわかりますが、
問題は、例えば、特定の一人を検索するとして、どのよに検索しますか?
 
私ならば、100件でも「ゾッと」しますがね・・・
 
1シートに1000件ならば、それほど検索には困らないでしょう。
氏名でも、社員番号でも、入社日でも、生年月日でも
指定が可能です。
 
しかし、シート名を何にするのか・・・・
氏名をシート名にしたら、どのようにして検索するのか?
 
要は、データを格納することだけではなく、利用(検索)を優先して検討すべきです。
それから、データの持ち方を考えても遅くありません。

投稿日時: 22/08/17 08:43:23
投稿者: cherry747

taitani様、simple様、WinArrow様
 
皆様、コメントありがとうございます。
WinArrowさんのシートに一括で貼り付ける方向で再度、検討したいと思います。
運用についても担当部署と再度、調整します。
 
なんか、仕様があいまいで、システム開発あるあるみたいになってしまって、
すみません。
 
要件を固めた上で、再検討してみます。それで、不明点等があったら
また、みなさんのご意見をお聞かせ願いたいと思います。

回答
投稿日時: 22/08/17 09:34:11
投稿者: Suzu

引用:
ウェブのメールフォームから社員採用の申し込みを行い、
その入力データ(csvファイル)をExcelに取り込んで、
一人ひとりの申し込み書(履歴書みたいなもの)を別シートで作りたいのです。

 
引用:
シートに一括で貼り付ける方向で再度、検討したいと思います。
運用についても担当部署と再度、調整します。

 
 
「一人ひとりの 申し込み履歴 が 最終的なアウトプット が欲しい」と、見えます。
そうなのであれば、
 
1. CSVファイルを、Excel(データベース)に 累積で取り込む
   案)
    新規CSVファイルデータを、Excel上に展開
    新規CSV ファイル のデータは 既に ブック上に取り込んでいるか確認
    取り込んでいないなら、蓄積用のシートに追加する
 
2. 必要な 一人ひとり の固有番号等を指定し、
   一人ひとりの 申し込み履歴 を 都度 画面上に 表示する
 
   案1)固有番号から、INDEXや MACH関数 を使い 複数データを表示用シートに表示
 
   案2)固有番号から、蓄積用のシートにフィルター適用
      抽出されたデータを 表示用シートに表示

投稿日時: 22/08/18 14:42:32
投稿者: cherry747

simple さんの引用:
横から失礼しますね。
改行にLFコードを使ったCSVファイルということですか?
それだと、一行読んだつもりが、まとめてすべてが読み込まれますよ。
CR+LFに改行コードを変更しておくのが吉かと思います。
それが不可なら、LFでSPLITして各行に分離、そのうえでさらにカンマでSPLITということになるでしょう。

 
simple様
 
ありがとうございます。
WinArrowさんの案で、CSVをExcelに読み込んでしまう方法で解決しました。

投稿日時: 22/08/18 14:45:10
投稿者: cherry747

Suzu さんの引用:
引用:
ウェブのメールフォームから社員採用の申し込みを行い、
その入力データ(csvファイル)をExcelに取り込んで、
一人ひとりの申し込み書(履歴書みたいなもの)を別シートで作りたいのです。

 
引用:
シートに一括で貼り付ける方向で再度、検討したいと思います。
運用についても担当部署と再度、調整します。

 
 
「一人ひとりの 申し込み履歴 が 最終的なアウトプット が欲しい」と、見えます。
そうなのであれば、
 
1. CSVファイルを、Excel(データベース)に 累積で取り込む
   案)
    新規CSVファイルデータを、Excel上に展開
    新規CSV ファイル のデータは 既に ブック上に取り込んでいるか確認
    取り込んでいないなら、蓄積用のシートに追加する
 
2. 必要な 一人ひとり の固有番号等を指定し、
   一人ひとりの 申し込み履歴 を 都度 画面上に 表示する
 
   案1)固有番号から、INDEXや MACH関数 を使い 複数データを表示用シートに表示
 
   案2)固有番号から、蓄積用のシートにフィルター適用
      抽出されたデータを 表示用シートに表示

 
Suzu様
 
コメントありがとうございます。
おっしゃる方法で再検討しています。
ありがとうございました!

投稿日時: 22/08/18 14:46:53
投稿者: cherry747

コメントしていただいた皆様。
本当にありがとうございました。
 
また壁にぶつかったら書き込みますので、
その時はご指導くださいませ。