• 締切済み

CSVファイルの指定列だけを読み込んでEXCELに表示したい

EXCELのVBAの .ActiveSheet.QueryTables.Add メソッドを利用する方法で、 (不可能ならば別な方法でもお願いします。) CSVファイルを読み取って、シートに書き込みたいと思ったのですが、 その際、CSVファイル全体ではなくて、特定番目の列だけを読み取って、書き込むことは出来ないでしょうか。 その特定の列の指定を複数にすることも出来ますでしょうか。 もし複数でも可能でしたら、EXCELに書き込むときに、 一列目、二列目、と詰めて書くのではなく、間に空列をはさんだりして、 バラバラに好きな位置の列に、読み取ったそれぞれの列を、書き込むことは出来るでしょうか。

みんなの回答

  • TTak
  • ベストアンサー率52% (206/389)
回答No.3

accessdb_userさんこんにちは。 データソースに新規にCSVのソースを追加することによって可能です。例えば、マイドキュメントにCSVファイルがあり、データベースの先頭をセルA1に置くとして、次のようになるはずです。 ActiveSheet.QueryTables.Add(Connection:=Array(Array("ODBC;DefaultDir=C:\My Documents;Driver={Driver da Microsoft para arquivos texto (*.txt; *.csv)};DriverId=27;Extensions=txt,csv,tab,a"), Array("sc;FIL=text;MaxBufferSize=2048;MaxScanRows=25;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;")), Destination:=Range("A1")) 手動で言えば、外部データの取り込みで、新規データソースを作成し、アクセスするデータベースの種類に対応するドライバに Driver da Microsoft para arquivos texto (*.txt; *.csv) を選択するということです。これによって、クエリーが使えますから、 > 特定番目の列だけを読み取って、書き込むことは出来 ます。また、MSクエリーの他の機能も使えます。複数の列の取り込みも可能です。 取り込む列の選択は、上記AddメソッドのCommandTextプロパティの値として、Array関数に格納して使います。 .CommandText = Array("SELECT XXX.AAA, XXX.BBB& vbCrLf & "FROM XXX.csv XXX" ) のようになります。XXXはファイル名、AAA,BBBはフィールド名です。 クエリーを使った場合、空白の列を入れることはできないようです。データ取り込み後にInsertメソッドやCopy、Pasteメソッドで列挿入や入れ替えをすれば良いと思われます。 一度、自動記録すると解りやすいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

テストデータとして下記を作りました。 ファイル名をaa1.csvで保存しました。 5,大島,大阪,商業,a1 23,古河,豊橋,商業,b1 34,恩田,岐阜,普通,d1 45,寒川,福島,国際,c1 67,桐井,新潟,工業,c2 13,青井,久留米,普通,a2 そしてVBEのModule1に Sub test01() i = 1 Open "aa1.csv" For Input As #1 While Not EOF(1)  Input #1, a, b, c, d, e  ' MsgBox a & "," & b & "," & c & "," & d & "," & e  Worksheets("sheet1").Cells(i, 1) = b  Worksheets("sheet1").Cells(i, 2) = d  i = i + 1 Wend Close #1 End Sub テスト済み。項目数(フィールド数)だけa,b,c,・・・を設定してください。そして何番目の項目かを選んでください。このテストでは2、4番の2つを選択した。 その項目数だけWorksheets("sheet1").Cells(i, xx) = xを増やしてください。xxはA列を1としてB列を2とする列順序数です。xは取り出してシート列にセットする変数名(項目データ)です。

accessdb_user
質問者

お礼

ご解答ありがとうございました。 とても明快でわかりやすいソースとご説明で、よくわかりました。 プログラムするときに参考にさせていただきます。 でも、セルに一つずつ書き込むのでは、処理が遅くなってしまうようなのです。 一気に書き込めればいいのですが・・・

全文を見る
すると、全ての回答が全文表示されます。
  • taka2456
  • ベストアンサー率29% (36/122)
回答No.1

データが以下のようになってるとします 名前,生年月日,性別 mike,19920503,male tiger,19950304,male linda,19790403,female Open "CSVファイルの場所" For Input As #1 i = 1 Do Until EOF(1) Line Input #1, tmp hairetu = Split(tmp, ",")   'カンマで区切られたものをばらして                  '配列にいれます '1行目を読んだ状態では                  ’hairetu(0)="名前",                  ’hairetu(1)="生年月日",                  ’hairetu(2)="性別"となってます Cells(i, 4) = hairetu(2) ’配列3番目(性別)をD列に出力します   Cells(i,6)=hairetu(0) '配列1番目(名前)をG列に出力します i = i + 1 Loop Close #1 こんな回答しかできませんでした きっともっといいやり方があるとおもいますので他の方の意見を参考に してください

accessdb_user
質問者

お礼

セルに一つずつ書いていくと、なぜかやたら処理に時間がかかってしまうようなので、 CSVを一気に読み込みたいと思っていたんです。しかし、列を分けて読み込むのは難しいでしょうか。 でも、ファイル入出力に慣れていなかったので、ためになりました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 先頭にゼロを含む数字列のcsvをExcelに取込む

    UTF-8のCSVファイルがあり、含まれるデータに先頭がゼロで始まる数字列があります(例えば00123や0123で桁数は不定)。 これをVBAを使ってExcelに取り込み、ゼロ付きのまま扱いたいのですが、取り込んだデータは先頭のゼロが欠けてしまいます。 VBAコードは以下のとおりです。 どこを見直したらよろしいでしょうか。 strConnPhrase = "TEXT;" & strFilePath Set qt = ws.QueryTables.Add(Connection:=strConnPhrase, Destination:=ws.Range("A1")) With qt .TextFilePlatform = 65001 .TextFileParseType = xlDelimited .TextFileCommaDelimiter = True .PreserveFormatting = True .RefreshStyle = xlOverwriteCells .Refresh .Delete End With

  • EXCELで複数のファイルを同じブック内で開きたい

    久しぶりにVBAを使用してやらせたいことがありますので、質問です。 複数のCSVファイルがあり、これを同じブック内のシートとして開くことは 出来ますでしょうか。 メニューから開くとして、それぞれのファイルを開くと、別々のブックにて開いてしまいます。 これを同じブックで、シート別に開かせたいのですが、出来ますでしょうか。 さらに、これをVBAでやりたいと考えております。 まず考えたのは、 ”Application.GetOpenFilename”です。 ただし、これを利用すると、別々のブックでしか開くことができませんでした。 次に考えたのが、”QueryTables.Add”を利用することです。 これだと、同一ファイル、同一シート内にデータを取り込むことができるので、 問題ないのですが、ファイル名を指定しなければなりません。 ファイルが変わるたびにVBAでパスを修正するのは大変ですので、 ”QueryTables.Add”のデータ取り込みでファイル選択ダイアログが開くような コードがあればよいと考えております。 ファイル選択のダイアログが開いて、そのファイルのパスが取得できるような コードにすれば、”QueryTables.Add”にてデータの取り込みができそうなのですが、 どうすればよいか思いつきません。 "Dialogs(wdDialogFileFind)"というものも見つけたのですが、うまくいきませんでした。 何か良い方法がありますでしょうか。 よろしくお願いします。 Dialogs(wdDialogFileFind)

  • 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 ------------------------------------------

  • CSVファイルの特定列だけを呼び出し

    はじめまして。VBA初心者です。 質問させてください。 横に十列、縦に1万レコードのcsvデータがあり、このうちの2列分だけをエクセルシートに取り出すマクロが必要になりました。 外部データ呼び出し後、列を削除、というのを作ってみましたが、僕の力量不足にためか、改変ポイントがよくわかりませんでした。 opentextを使ってarrayで読み込む、というのもやってみましたが、結構時間がかかってスムーズにはいきませんでした。 ネットでさがしているうちに、読み込む列が少ないならcsvから特定の列をコピーして、それを新しいブックに貼り付け、すればいいみたいな記述をみたのですが、参考になるコードが見つかりませんでした。 そういうことは可能なんでしょうか?また、大量のデータを読み込む時に一番早い方法はどんなものでしょうか?

  • EXCEL- VBA(CSVファイル→インポート)

    A列~F列になる複数(100個以上)のCSVファイルをエクセルファイルにインポートして更に個別にエクセルファイルとして保存したいのですが VBAでできるのでしょうか? 記憶マクロでやったらどうにもうまくいきません。 エクセルのVBAについては ほとんど知識ゼロなので困っております。 大変厚かましくありますが どなた様かご教授お願いできたらと思います!! 【元のファイルの状態】   ◆ファイル名「*.CSV」*は文字数それぞれ違います。   <例:tanaka.xls だったり 09福島.xls>  ◆入っているドライブ   TEXT;C:\Documents and Settings\AA_B\デスクトップ\練習  ◆A~F列にデータが入っている 【やりたいこと】    (1)A~F列はカンマ区切りで全て文字列としたい  (2)元のファイル名でエクセルとして保存したい「*.XLS」

  • エクセルで任意のcsvファイルを指定して関連ずけたい

    エクセルでフォームが出来ていて,特定したcsvファイル(ファイル名指定)の指定データ値をフォームに割り当て表示させています.フォームとcsvファイルは別になっています. csvデータファイルのデータの内容はフォームに合わせてあるので考えなくていいのですが,任意のcsvファイルをPCに保存してあり,そのファイルが複数あり選択指定できるようにしたいのですが,お教えいただけないでしょうか.よろしくお願いいたします.

  • CSVを特定の列だけ抽出してエクセルへ変換したい

    図々しい質問で本当に申し訳ありません。当方VBAの初心者というか、ほぼ何もわかっていません。本来ならばきちんと自分で勉強し地道に解決すべきであるのは重々承知しているのですが、どうしても来週必要になるので無礼は承知で質問させていただきます。 20列、長くても200行程のCSVファイルから特定の5列程のデータだけを抜き出し、エクセルに変換し、CSVと同じフォルダに格納したいと思っております。(エクセルのファイル名はCSVと同じで構いません) どのようなコードを書けばよいのか、ネットで似たような質問を拝見し自分なりに調べて書いてみたのですが、全く上手くいきません。 厚かましいお願いで本当に、情けなく、お怒りを買ってしまうかもしれませんが、「このコードをそのまま貼り付けたら動くよ」といった感じでお教えいただけませんでしょうか・・・。 使うバージョンはエクセル2013です。 本当にすみません。 何卒お願いいたいます。

  • CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。

    CSVファイルの任意の列をダブルクォーテーションで囲みたいのですが・・・。 例えば  abc,def,ghi,jkl  mno,pqr,stu,vwx     ↓  abc,"def",ghi,"jkl"  mno,"pqr",stu,"vwx" というように、2番目と4番目の列の文字列をダブルクォーテーションで囲む、といった具合にです。 調べてみるとVBAを使用する方法はあるようですが、EXCELやその他のフリーソフト等を使用して処理する方法はありませんでしょうか。 よろしくお願いいたします。

  • 複数の.csvファイルから指定数値を取り出す

    お世話になります。 早速質問ですが、Excel VBA環境で あるフォルダ内の複数の.csvファイル一つ一つから 指定数値(B列6行目のみ)を取り出して、 デスクトップ上、別のExcelシートの(B列1行毎に日付と時間が書いてある) 隣のC列にまとめて自動で書いてくれるプログラムがあればいいな と考えているのですが、 可能でしょうか。 値をただ吸い出して、別の新規ファイルにまとめて表示してくれるだけでも 助かります。宜しくお願い申し上げます。

  • VBでcsvファイルを取り込むときに・・・

    困っています。ビジュアルベーシック初心者です。 次のようなcsvデータがあります。 「あいうえお,,かきく,,1あ2い3う,,12.3,,45.6,,78.9  あいうえお,,かきく,,1あ2い3う,,12.3,,45.6,,78.9  あいうえお,,かきく,,1あ2い3う,,12.3,,45.6,,78.9」 ※あいう等はテキスト、123等は数値(小数) これをエクセルに表示するため、 With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & (ファイル名), Destination:=Range("B3"))  .TextFileCommaDelimiter =True  .Refresh BackgroundQuery =False End With とプログラムしました。 ところが、エクセルをみると全てのデータの間に1マスづつ余計なセル(空白)が入ります。 空白が入らない取り込み方はあるでしょうか? なお、一度別な場所に取り込み必要なセルだけ転記するというのは避けたいです。 アドバイスを宜しくお願いします。

専門家に質問してみよう