- ベストアンサー
Excel VBAで外部データ(CSV)を自動読込する方法
- ExcelのVBAを使用して、外部のCSVデータを自動的に読み込む方法について質問しています。
- 具体的なケーススタディとして、特定の範囲の値を別のExcelファイルのシートにコピーする方法を知りたいとのことです。
- 質問者はVBA初心者であり、マクロの記録機能を使用してもうまくいかなかったため、アドバイスを求めています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
とりあえずマクロの流れだけを説明 一例: Sub tesy() FPass = "D:\Users\nave\Documents\帳票\" ’CSVファイルが入っているフォルダーのフルパス Fname = Dir(FPass & "*.csv") ’拡張子".csv"のファイル名を取得 ’フォルダーの中にCSVファイル以外ない場合はFname = Dir(FPass)だけで良いです While Fname <> "" ’フォルダー内のファイル読み出しが終了するまでループ Workbooks.Open FPass & Fname ’読み出したファイルを別Bookで開く ’-------------- ’ここに読み込んだデータの処理を作成 ’-------------- Workbooks(Fname).Close ’開いたCSVファイルを閉じる Fname = Dir() ’次のファイル名を取得 Wend ’ループ End Sub 見たいな感じで
その他の回答 (2)
- fujillin
- ベストアンサー率61% (1594/2576)
こんばんは。 >日基本書を読み始めたばかりの初心者です のわりには、かなり難しいことにチャレンジしようとしていますね。 とりあえず、「指定したシートの任意のセル(行番号、列番号で指定)にデータを入れる方法」、「csvファイルからデータを読み取る方法」あたりを個別に研究するところから始めるほうが良いかも。 いきなり、複合的なことをやろうとすると、混乱するばかりかも知れません。 ところで、ご質問文ですが・・・ >A1:A10 >B1:B10 csvファイルにはセルの概念はないので、改行と考えて、最初3行の各1~10個のデータという解釈でよいのでしょうか? >期間集計.xlsx >のそれぞれシート別のyyyymmdd列1行~10行にコピーする 「シート別」と書いてありますが、シートの情報がありません。 また、「yyyymmdd列」は必ず存在しますか? (excel 2007って2千万列に対応してるんでしたっけ?) >・CSVファイルを開かずに参照する処理 csvファイルを開いてはいけないのでしょうか? それで、データを取得するのは難問です。 通常の処理だと、VBAからファイルを開き、データを取得し、その後ファイルを閉じます。 >[yyyymmdd].csvを昇順に参照する処理 データのコピー先は一意に対応しているみたいですが、「昇順に参照」することに意味があるのでしょうか? 全部参照し終われば、どのような順番でも同じ結果になるのでは?
補足
返答が遅くなり申し訳ありません >>A1:A10 >>B1:B10 >csvファイルにはセルの概念はないので、改行と考えて、最初3行の各1~10個のデータという解釈でよいのでしょうか? おっしゃる通りです。Excelで参照した場合で説明してしまいました。 >>期間集計.xlsx >>のそれぞれシート別のyyyymmdd列1行~10行にコピーする >「シート別」と書いてありますが、シートの情報がありません。 >また、「yyyymmdd列」は必ず存在しますか? >(excel 2007って2千万列に対応してるんでしたっけ?) これもまた当方の説明不足で申し訳ありません。 sheet1,2,3の1行目にずらっと日付データが入力おり、 「yyyymmdd列」は[yyyymmdd+n]のn+1列目という意味です。 >>・CSVファイルを開かずに参照する処理 >csvファイルを開いてはいけないのでしょうか? それで、データを取得するのは難問です。 >通常の処理だと、VBAからファイルを開き、データを取得し、その後ファイルを閉じます。 これに関しましてはおそらく当方の見当違いの懸念によるものです。 逐次ファイルを閉じるという処理が思いつきもしなかったので 日毎に存在するcsvファイルが数年分にわたり存在するために一括で開いた際のフリーズが怖かったというのがその理由です。 >>[yyyymmdd].csvを昇順に参照する処理 >データのコピー先は一意に対応しているみたいですが、「昇順に参照」することに意味があるのでしょうか? >全部参照し終われば、どのような順番でも同じ結果になるのでは? おっしゃる通りコピー元とコピー先は一対一対応しております。 ただ未熟な私の頭ではcsvファイルのファイル名と一致するxlsxファイルの1行目の日付列を1対1に対応したコピー先として指定することは難しいので、 浅はかながらcsvファイルを「昇順に参照」しながら単純に1列ごとずらしてコピーすればいいのではないかと考えました。
- web2525
- ベストアンサー率42% (1219/2850)
>・CSVファイルを開かずに参照する処理 (Excelで開かずにどうしてセルの範囲を指定できるのかという矛盾が生じてる気はするのですが・・・) 一度読みこんで処理した方が楽ですね。 >・自動的に帳票[yyyymmdd].csvを昇順に参照する処理 一つのフォルダー内にファイルが入っているなら、Dir関数で読み込んで行けば自然と昇順に呼び出しますので意識する必要はありません。 順番が狂って居ても後で並び替えすれば問題はないかと思います。 >・それをyyyymmddに対応した列にコピーする処理 すでにyyyymmddデータが入力されているシート内にデータを読み込むのですか? 空のブックにyyyymmddデータを作成して書き込んだ方が処理は楽です。 >sheet1の[yyyymmdd]列1行:10行 ←A1:A10の値 >sheet2の[yyyymmdd]列1行:10行 ←B1:B10の値 >sheet3の[yyyymmdd]列1行:10行 ←C1:C10の値 この処理が何をしたいのかがよく分かりません。 file名:帳票[yyyymmdd].csvをExcelで読み込んだ場合の A列データをSheet1のA列に B列データをSheet2のA列に C列データをSheet3のA列に 書き込むという事? 次に読み込むfile名:帳票[yyyymmdd+1].csvのデータはどこに書き込むのでしょうか? そもそも file名:帳票[yyyymmdd].csvは10行しかデータが無いのでしょうか? 沢山あるデータのうちの10行だけ読みこむという事?
補足
返答が遅くなり申し訳ありません。 >この処理が何をしたいのかがよく分かりません。 >file名:帳票[yyyymmdd].csvをExcelで読み込んだ場合の >A列データをSheet1のA列に >B列データをSheet2のA列に >C列データをSheet3のA列に >書き込むという事? >次に読み込むfile名:帳票[yyyymmdd+1].csvのデータはどこに書き込むのでしょうか? >そもそも >file名:帳票[yyyymmdd].csvは10行しかデータが無いのでしょうか? >沢山あるデータのうちの10行だけ読みこむという事? file名:帳票[yyyymmdd+n].scvをExcelで読み込んだ場合ですが 本来見出しが1行目にあり、以降は数値が100行存在しています。 そして数値の頭から10行目までの A列データ B列データ C列データを file名:期間集計.xlsxのそれぞれ Sheet1のn+1列目に Sheet2のn+1列目に Sheet3のn+1列目に 書き込みます。
お礼
お礼が遅くなりまして申し訳ありません。 コードのアウトラインを示していただいたおかげで 今後の学習の指針が見えた気がします。 後は読み込んだデータの処理方法を検討して 複合させれば良いのですね。 ありがとうございます。