エクセルVBAで複数のCSVファイルからデータを取得する方法とは?

このQ&Aのポイント
  • エクセルVBAを使用して、指定シートに複数のCSVファイルからデータを取得する方法を教えてください。
  • 指定されたセルからデータを取得し、エクセルの表に転送する方法を考えていますが、うまくいきません。
  • CSVファイルのデータを指定シートに貼り付けるための効果的な方法を教えてください。
回答を見る
  • ベストアンサー

複数のCSVファイルからのデータ取得(VBA)

エクセルVBAで、エクセルの指定シートに複数のCSVファイルからデータを取得する方法を ご教授お願います。 エクセルの指定シートの指定されたセルに、複数のCSVファイルから指定箇所のデータを 取得し転送する方法を考えていますが、どうもうまくいきません。 たとえば、 CSVファイル(1) A5(A)           A10(B) CSVファイル(2) A5(C)           A10(D)      CSVファイル(3) A5(E)           A10(F)         ・      ・      ・ と、指定されたセルからデータを取得し、 エクセルの指定シートの表に                    CSVファイル                                 (1)  (2)  (3) ・ ・ ・ ------------------------------------------- A5から取得したデータ    A   C   E ・ ・ ・ A10から取得したデータ    B   D   F ・ ・ ・ ------------------------------------------- と、いうように転送して貼り付けていきたいです。 いろいろ調べてみたのですが、このような方法が見つけられませんでした。 ぜひ、皆様のお知恵をお貸しください。 宜しくお願い致します。

  • na714
  • お礼率52% (43/82)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

>読み込むCSVファイルは毎回ファイル名が変わる為、マクロでファイルを選択し、選択したファイルからそれぞれデータを取得したいのですが、変数への置き換え方が分かりません。 私は、基本的にはまったく知らない方には、ブラックボックスとして使っていただくように考えています。 ファイル名が決まっているような質問の内容でしたから、そういうコードにしたまででしたが、すでに、#2のコードを書く時に、以下のように考えていました。 試してみてください。書き換えは、必要に応じて「パスを登録」の部分だけです。 また、なくても、可能です。 ファイルの選択は、Ctrl キーを押しながらファイルを一つずつ選ぶか、シフトキーを押しながら範囲を選ぶかしてください。選択した順序どおりに処理されます。 '// Sub TestMacro1R()  Dim sh As Worksheet  Dim Files As Variant  Dim i As Long, j As Long, k As Long  Dim oPath As String  Dim sPath As String  oPath = ThisWorkbook.Path  sPath = ThisWorkbook.Path & "\MyFolder\" 'パスを登録  Set sh = ThisWorkbook.ActiveSheet '書きだすシート  ChDir sPath  Files = Application.GetOpenFilename("Text(*.csv),*.csv", , "ファイル選択", , True)  If VarType(Files) = vbBoolean Then Exit Sub  k = 1 '書き出し列  j = 1 '書き出し行  For i = UBound(Files) To 1 Step -1   If k > Columns.Count Then MsgBox "列の制限より終了します。", 48: Exit For    Application.ScreenUpdating = False    With Workbooks.Open(Files(i))     sh.Cells(j, k).Value = .ActiveSheet.Range("A5").Value     sh.Cells(j + 1, k).Value = .ActiveSheet.Range("A10").Value     .Close False    End With    k = k + 1   Application.ScreenUpdating = True  Next  Set sh = Nothing  ChDir oPath  Beep End Sub

na714
質問者

お礼

詳しい説明ありがとうございました。 早速試してみたいと思います。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

>いろいろ調べてみたのですが、このような方法が見つけられませんでした。 基本的に、横にデータを伸ばしていくスタイルのものは、VBAなどでは書かないことが多いです。 ある程度、マクロが分かるレベルでしたら、ご自身で書き換えられるはずです。 Sub TestMacro1()  Dim sh As Worksheet  Dim Files(5) As String  Dim i As Long, j As Long, k As Long  Dim sPath As String  sPath = ThisWorkbook.Path & "\MyFolder\" 'パスを登録  Set sh = ThisWorkbook.ActiveSheet '書きだすシート  'k は書き出し列, j 書き出し行  'ファイル名が以下よりも多くあるなら、↑Dim Files(数)を増やして書き加える)  Files(1) = "Test1.csv"  Files(2) = "Test2.csv"  Files(3) = "Test3.csv"  Files(4) = "Test4.csv"  Files(5) = "Test5.csv"  k = 1 '書き出し列  For i = 1 To UBound(Files)   If Dir(sPath & Files(i)) <> "" Then   If k > Columns.Count Then MsgBox "列の制限より終了します。", 48: Exit For    Application.ScreenUpdating = False    With Workbooks.Open(sPath & Files(i))     j = 1 '書き出し行     sh.Cells(j, k).Value = .ActiveSheet.Range("A5").Value     sh.Cells(j + 1, k).Value = .ActiveSheet.Range("A10").Value     .Close False    End With    k = k + 1   End If   Application.ScreenUpdating = True  Next  Set sh = Nothing End Sub 'k と i は別々にするのは、必ずしも、A1 から書きだすとは限らないからです。

na714
質問者

補足

ご返答ありがとうございます。 詳しい説明ありがとうございます。 読み込むCSVファイルは毎回ファイル名が変わる為、マクロでファイルを選択し、選択したファイルからそれぞれ データを取得したいのですが、変数への置き換え方が分かりません。 別の回答にも書き込みましたが、ほぼ初心者に近い状態です。 お手数ですが、解説つきにしてもらえると大変助かります。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

指定のシート↓     A     B     C 1  (A)    (C)    (E) 2  (B)    (D)    (F) のようにしたいのでしょうか? Range("A1").Value=CSVファイル(1).Range("A5").Value Range("A2").Value=CSVファイル(1).Range("A10").Value Range("B1").Value=CSVファイル(2).Range("A5").Value Range("B2").Value=CSVファイル(2).Range("A10").Value Range("C1").Value=CSVファイル(3).Range("A5").Value Range("C2").Value=CSVファイル(3).Range("A10").Value とか For i=1 to X For j=1 to 2 Cells(j, i).Value=CSVファイル(i).Cells(j*5,1).Value Next Next こんな感じでしょうか

na714
質問者

補足

ご返答ありがとうございます。 返事遅くなりすいません。 説明が不足でしたが、書き込むシートは毎回同じなのですが、CSVファイルは毎回ファイル名が変わるため、 このファイルを選択してファイル内のデータを取得したいのですが、このCSVファイルの置き換え方が分かりません。 入門本を呼んで簡単なマクロしか組んだことが無いほぼ初心者に近い状態なので、ご迷惑をおかけしますが内容を詳し く説明していただけると助かります。 宜しくお願い致します。

関連するQ&A

  • 複数のcsvファイルをマクロ(VBA)で取り込みたい

    複数のcsvファイルをマクロ(VBA)で取り込みたい csvファイルの中身が、 20090507 120508 osaka 項目1,項目2,項目3,・・・・・,項目10 a1,a2,a3,・・・・・,a10 b1,b2,b3,・・・・・,b10 c1,c2,c3,・・・・・,c10 や 20090507 132529 hokkaido 項目1,項目2,項目3,・・・・・,項目10 d1,d2,d3,・・・・・,d10 e1,e2,e3,・・・・・,e10 f1,f2,f3,・・・・・,f10 となっているcsvファイルが特定のフォルダの中に100以上あります。 このcsvふぁいるの5行目だけをaccessに書き込んでテーブルに追加していきたいと思っています。 項目1,項目2,項目3,・・・・・,項目10 a1,a2,a3,・・・・・,a10 d1,d2,d3,・・・・・,d10 このようなテーブルができればいいのですが・・・ csvファイルを開く→5行目をテーブルに追加→csvファイルを閉じる(削除する)→次のcsvファイルを開く→5行目をテーブルに追加→csvファイルを閉じる(削除する) この流れでいいと思うのですが方法が分かりません。 丸投げですがよろしくお願いします。

  • エクセルVBAで CSVファイルからのデーター参照

    エクセル2000を使用しています。 CSVで社員リストを作成して、エクセル上の指定のセルに 氏名を入力すると、年齢、性別、入社日等が他のセル表示出来るように 指定のですが、VBAでやるとすれば、どの様なコードになるのでしょうか??  現在は、OPENイベントを使用して、エクセルの別のシートにCSVファイルの全ての内容を読み込んでいます。そしてMAINのシートではLOOKUPを使用しているのですが、ファイル起動時に時間が掛かり、困っています。 エクセルとCSVの間で直接、データーのやり取りをしたいのですが・・・。

  • gnuplotで複数csvファイルからデータ取得

    http://t16web.lanl.gov/Kawano/gnuplot/datafile3.html を読んだところ、複数のファイルから読み込む場合は、UNIXのコマンドを使えばいいらしいことはわかったのですが、 #a1.csv 1.0,2.0 2.0,4.0 3.0,6.0 #a2.csv 1.0,1.0 2.0,4.0 3.0,9.0 というファイルに対し、とりあえずpasteを利用して複数行呼び出しを行おうとしたのですが、 gnuplot> set datafile separator "," gnuplot> plot "<paste -d',' a1.csv a2.csv" using 1:2 warning: Skipping unreadable file "<paste -d',' a1.csv a2.csv" No data in plot と表示されてしまいました。 一体どのようにすれば、複数のcsvファイルを結合したものを読み込めるのでしょうか? また、Cygwin上でpasteコマンドについてちょっと実験してみたのですが、 $paste -d"," a1.csv a2.csv >output.txt とすると、 #output.txt 1.0,2.0 ,1.0,1.0 2.0,4.0 ,2.0,4.0 3.0,6.0 ,3.0,9.0 と表示されるのですが、 $paste -d"," a1.csv a2.csv とすると、Cygwin上には、 ,1.0,1.0 ,2.0,4.0 ,3.0,9.0 と表示されます。 output.txtに出力した際は、メモ帳上では、結合している部位で改行されているようには見えないのですが、ブラウザにコピペしたところ改行されてしましました。 どうやら、結合した場所に\rが入っているくさいです。 このpasteを使う方法以外にもgnuplotで扱うのにもっといい方法があるという場合はその方法も教えていただけると幸いです。 よろしくお願いします。

  • excel vbaで複数のcsvファイルの読み込み

    100シート分のcsvファイルのデーターを一つずつ読み込んでexcelにコピーして使用してますが莫大な時間がかかって困ってます。 vbaを使用して作業を簡素化出来る事は出来ないでしょうか? ------------------------------------------ ※ csvの概要 excelで1枚のcsvファイルを開くとA列の11行目から65536行まで数値データがあります。 ※ vbaできたらよいなと思う仕様 そこで、複数のcsvファイルを選択して読み込むとCSV_データと言うSeetのA列の10行目から1枚目のcsvファイル、B列の10行目から2枚目のcsvファイルと言う風に選択した分のcsvを列に続けて数値データを貼り付けしてくれるvbaをご教授していただけると大変助かります。 不躾で申し訳ございませんが宜しくお願い致します。 excel2003 ------------------------------------------

  • エクセルVBAで複数CSVを抽出、ブックへの出力

    エクセルVBAで複数のCSVファイルからファイル名と 任意のセル8箇所を自作した計算シートに抽出。 別ブックにCSVファイル名 計算結果4種類を出力する。 というvbaを作りたいのですがどうすればよいでしょうか? CSVファイルが1700ほどあり、大変困っています。 申し訳ありませんがご教授願います。 ーーーーーーーーーーーーーーーーーーーーーーーーーーー 詳細 CSV読み込みセル8箇所:B2、D2、F2~P2 自作計算シートへの貼り付け箇所:G3~G10 計算結果セル抽出箇所:C8~F4 出力の理想系は CSVファイル名、計算結果1、2、3、 4の順で file01 ○○ ○○ ○○ ○○ file02 ○○ ○○ ○○ ○○ ・・・ ・・ のようになれば大変嬉しいです。 お力をお貸しください よろしくお願いいたします。

  • VBAを使い、同一フォルダにあるファイルの特定のシートの情報を取得したい

    はじめまして。 書籍や過去の質問等を調べましたが、類似するものを見つけられなかったため質問させていただきます。 Xというエクセルファイルで、Xと同一フォルダ内にある、ファイル名に特定の文字列(例えば「月報」)を含んだ全てのエクセルファイルの、特定の文字列(例えば「○年○月」)を含んだ全シートの、一定のセル範囲をひとつのシートにまとめたいと思っています。 X内のコマンドボタンで動かす予定ですが、複数のボタンになると自分では思っています(ボタンAでファイル名の取得、ボタンBでシートの取得、ボタンCでセルに貼り付け、みたいな感じで。ボタンの数は特に制限はないです) 要点としては a, 定定の文字列を含んだファイル名の取得 b, aで取得したファイル内の特定の文字列を含んだ全てのシート内の一定のセル範囲の取得(シートの数はファイルによる。必ずしも1つというわけではない。) c. bで取得した一定のセル範囲のデータを、1つのシートにまとめる。 あとはこれらのデータをtxtやcsvなどに出力できるようにするつもりです。 私がやってできたのは、同一フォルダ内にあるファイル名に特定の文字列を含むファイルの全てのファイル名を指定したセルに吐き出すことしかできませんでした。 なんか、ややこしい表現かもしれませんが、ご指導お願いします。 環境はxp、エクセル2003です。 よろしくお願いします。

  • CSVファイルの取り込みについて

    CSV取り込み方法について 教えていただきたくお願いいたします。 エクセルのマクロ・VBAの組み方について デスクトップ上の000という名前のCSVファイルを、作業しているエクセルファイルのLoadという名前のシートに貼り付けたいと思っています。 CSVファイルはエクセルで開くと1行に11列の項目が展開されています。 貼り付ける項目はこのようになります。 (CSV) →(エクセルのLoadシート) 1列目(A行)→B行へ 2列目   →C行へ 3列目   →D行へ 4列目   →E行へ 5列目   →F行へ 9列目   →G行へ 10列目  →H行へ 11列目  →I行へ (6.7.8列目は使いません) 最後にLoadのシートのA行に”=B&E”とい式を入力したいと思っています。 まだ初心者なので勉強中なのですが、仕事上急遽必要になりましたのでお願いいたします。

  • 複数のエクセルファイルからデータを抽出してリスト化

    あるフォルダ内(C¥sample)内に複数のエクセルファイルがあり(ファイル名はばらばら)、そのファイル全てに「報告書1」というシートが存在します。その「報告書1」というシート内のデータをまとめた一覧表を新規エクセルファイルに作成したいと思っています。 1つ目のファイルの報告書1シートのA2~F5のデータを一覧表エクセルA2~F5まで貼付け、2つ目のファイルの報告書1シートのA2~F5のデータを一覧表エクセルA6~F9まで貼付けという具合にまとめていきたいです。マクロで簡単にひとまとめにするいい方法はありませんでしょうか。ご教授お願いいたします。 例)報告書1シート A B     C      D     E    F 1 受付  支店    受注先    品物   数量  金額 2 0001 北海道   ●●      リンゴ    1   100 3 0002   北海道   ●●      リンゴ    2 200 4 0003   東北    ▲▲      みかん   1 150 5 0004   東北    ▲▲      みかん   2 300

  • 複数CSVファイルからEXCELへ取り込み

     複数のCSVファイルを読み込んでEXCELのシートにまとめるやり方は,以前にOKWaveのページでmerlionXXさんがbatwithさんの質問に答えているのがあって,参考にさせていただきました。  そこでそのアレンジとして次の様に変更したいのですが,教えていただけないでしょうか?  複数CSVファイルからのデータ読み出しは同じですが,読み出し時にCSVファイルの指定範囲のデータを足したり,平均とったり,最大値・最小値を検索したりして,その結果のみをEXCELに追記していきたいのです。つまりCSVファイルからデータそのものをEXCELに転記してから計算や検索をすれば目的は達成出来ますが,データそのものをEXCELに転記する必要はないため,計算や検索の結果のみを転記してEXCEL表を小さくしたいのです。  ちなみにCSVファイルは毎日1個できる同じフォーマットのファイル。EXCELファイルは日付ごとに1行のデータ集計結果が追記される表です。  どなたかよろしくお願いいたします。

  • 【エクセル】複数ファイルからのデータ引用

    エクセルについて質問がございます。 現在、複数の人間が同じフォーマットにてデータを入力しており、 そのデータを、1つのエクセルの1つのシートに引用したいと考えております。 (例) (1)ファイルA、シート「個人名A」、セルA1「回答1」 (2)ファイルB、シート「個人名B」、セルA1「回答2」 (3)ファイルC、シート「個人名C」、セルA1「回答3」 上記3ファイルのデータを以下のファイルに引用したいと思います。 統合先ファイル:ファイルD、シート「集計」 A1セルには(1)のデータ、 A2セルには(2)のデータ A3セルには(3)のデータ この際、 ファイルDの A1セルには ='[ファイルA.xlsx]個人名A'!$A$1 で「回答1」と表示されます。 A2セルには ='[ファイルB.xlsx]個人名B'!$A$1 で「#VALUE!」と表示されます。 A3セルには ='[ファイルC.xlsx]個人名C'!$A$1 で「#VALUE!」と表示されます。 この場合、A2セルとA3セルにもそれぞれの「回答」を表示させる方法がありますでしょうか。 ご回答いただけると、大変助かります。 よろしくお願いいたします。

専門家に質問してみよう