• 締切済み

VBAでCSVファイルをインポートする方法について

VBAでCSVファイルをインポートする方法について OS:ウィンドウズXP Access Version:2000 AccessVBAでcsvファイルをインポートするマクロを作っています。 現在、インポート定義を利用して、データ型を指定したインポートができているのですが、1点だけ問題があり、質問します。 インポートするcsvファイルのA列にIDが入力されています。 そのA列の末尾に、ID(数値型)ではない「<b>32</b><br />」という値が入っています。 Accessのテーブルでは、このIDのフィールドは数値型で管理している為、この1レコードだけ エラーとなり、エラーテーブルが作られ、また、インポート先のテーブルには空のレコードができてしまいます。 この末尾の行については、IDではない「<b>32</b><br />」以外は何もデータが入っていない為、 インポートする必要がありません。 もし可能であれば、csvファイルのA列(Accessテーブルでは数値型のIDというフィールド)が数値ではない場合、 その行のインポートをスキップするような処理がVBAで作成できるとよいのですが、可能でしたら教えてもらえないでしょうか。 ※以下はVBAを作成する為に仮に用意し、読込を行っているcsvファイルと、VBAソースになります。 ○csvファイル名:インポート用csvファイル.csv 内容: ID,テキスト1,テキスト2,テキスト3,テキスト4,メモ1,メモ2, 1,a,A,z,Z,あ,ん, 2,b,B,y,Y,い,を, 3,c,C,x,X,う,わ, 4,d,D,w,W,え,ろ, 5,e,E,v,V,お,れ, 6,f,F,u,U,か,る, 7,g,G,t,T,き,り, 8,h,H,s,S,く,ら, 9,i,I,r,R,け,よ, 10,j,J,q,Q,こ,ゆ, <b>32</b><br />,,,,,, ○VBAソース Dim FN As String Dim Res As Integer WizHook.Key = 51488399 Res = WizHook.GetFileName(0, "", "", "", FN, "", _ "csvファイル(*.csv)|*.csv", 0, 0, 4, True) WizHook.Key = 0 If Res = 0 Then DoCmd.TransferText , "csvインポート定義", "インポートテーブル", FN MsgBox "csvファイルをインポートしました", vbOKOnly End If

  • kagtt
  • お礼率40% (2/5)

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

>If IsNumeric(A(1)) Option Base を特に指定しない限り、配列の底は0です。 行中に区切り文字がなければ要素数=1なので、配列範囲外に なります。 データ中に改行があったり、引用符で囲まれるという条件は 先にお知らせください。引用符があるということはデータ中に カンマ(項目の区切りでない)がある可能性があります。 Line Input は1行(改行までの)読み込みなので、改行を 含むデータがあるとすると、オカシクなります。 もし、項目数とDBフィールドが(の属性も)分かっているなら、 ファイルをフィルタリングせずに直接書き込む方が早いかも。 Const 項目数 As Long = 7 Dim 列 As Long Dim 項目 As Variant Dim RS As Dao.Recorset Set RS = CurrentDb.OpenRecordset("hoge") ’テーブルを開く == 中略 == Do Until EOF(1)     Input #1, 項目     If VarType(項目) = vbString Then         If Not EOF(1) Then Line Input #1, 項目     Else         RS.AddNew         RS.Fields(0) = 項目         For 列 = 2 To 項目数             If EOF(1) Then Exit For             Input #1, 項目             RS.Fields(列 - 1) = 項目         Next         RS.Update     End If Loop RS.Close Close #1

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

方法は二つあります。 一つはファイル読み込み→レコード挿入をVBAで記述する ものです。もう一法はファイルをVBAでフィルタリング してからインポートするものです。 「インポートの定義」があることを考えると、2番目の 方法の方が安全かと思います。 以下はフィルタリングの例 Dim T$, W$, A W = "C:\~\wk.csv" ’★フィルタリング後のファイル名 Open FN For Input As #1 Open W For Output As #2 Do Until EOF(1)     Line Input #1, T     A = Split(T, ",")     If IsNumeric(A(0)) Then         Print #2, T '★先頭項目が数字の場合のみ出力     End If Loop Close DoCmd.TransferText , "csvインポート定義", "インポートテーブル", W

kagtt
質問者

補足

回答いただきありがとうございます。 早速試してみたところ、仮のcsvファイルの先頭行を削除すると、うまく動作しています。  ※先頭行:ID,テキスト1,テキスト2,テキスト3,テキスト4,メモ1,メモ2, こちらの先頭行はインポート定義でフィールド名として使用している為、レコードとして読込は行っていません。 また、EOFやIsNumericについても解説されているサイトを見てみました。 そこで質問で挙げた仮データではなく実際に使用するcsvファイルの読み込みように編集したところ、  実行時エラー '9':  インデックスが有効範囲にありません。というエラーが発生しました。 実際に使うcsvファイルの形式を用いて、新たに簡易のcsvファイルを用意したところ、 同様のエラーが発生しましたので、伺いたく新たな簡易csvファイルの内容を記載させていただきます。 ○csvファイル名:インポート用簡易csvファイル2.csv          → ファイルを開くダイアログを用いて開き、ファイル名を変数FNへ格納しています。   ・csvとしてExcelで開いた場合    A列  B列 1行目 ID  text  2行目 1 aa        bb        cc 3行目 2 dd        ee        ff   ・メモ帳で開いた場合 "ID","text", "0001","aa bb cc", "0002","dd ee ff", ※本番で使用するcsvファイルは、区切り文字が「"」と「,」であることや  セル内で改行を行っているフィールドがあり、メモ帳で開くとbbとccの間の  空白行があったことが本エラーの原因ではないかと思っているのですが、  これらの原因を回避する方法が分からず困っています。  また、先頭行のIDというのも数値ではないので、  そこですでにエラーになっているのかも?という気もしていますが、  まだAccessをはじめたばかりでこれ以上詳しくは分かりませんでした。 よろしければ原因と対策を判断いただけないでしょうか? 以下は現在編集したソースです。 Dim FN As String Dim Res As Integer Dim T$, reFile$, A WizHook.Key = 51488399 Res = WizHook.GetFileName(0, "", "", "", FN, "", _ "csvファイル(*.csv)|*.csv", 0, 0, 4, True) WizHook.Key = 0 If Res = 0 Then reFile = Dir(FN) & "\Filetering" & FN ’★フィルタリング後のファイル名 Open FN For Input As #1 Open reFile For Output As #2 Do Until EOF(1) Line Input #1, T A = Split(T, ",") If IsNumeric(A(1)) Then   Print #2, T '★先頭項目が数字の場合のみ出力 End If Loop Close DoCmd.TransferText , "csvインポート定義", "インポートテーブル", reFile MsgBox "csvファイルをインポートしました", vbOKOnly End If

関連するQ&A

  • CSVファイルインポート時の制限について

    AccessVBAでcsvファイルをインポートするマクロを作っています。 現在、インポート定義を利用して、データ型を指定したインポートができているのですが、1点だけ問題があり、質問します。 インポートするcsvファイルのA列にIDが入力されています。 そのA列の末尾に、ID(数値型)ではない「<b>32</b><br />」という値が入っています。 Accessのテーブルでは、このIDのフィールドは数値型で管理している為、この1レコードだけ エラーとなり、エラーテーブルが作られ、また、インポート先のテーブルには空のレコードができてしまいます。 この末尾の行については、IDではない「<b>32</b><br />」以外は何もデータが入っていない為、 インポートする必要がありません。 もし可能であれば、csvファイルのA列(Accessテーブルでは数値型のIDというフィールド)が数値ではない場合、 その行のインポートをスキップするような処理がVBAで作成できるとよいのですが、可能でしたら教えてください。

  • Access2000のCSVファイルのインポートについて

    Access2000でCSVファイルをインポートしようと思っています。 インポート方法は、VBAで 「DoCmd.TransferText acImportDelim, , "テーブル名", "ファイル名"」を使用しています。 この時に、CSVファイルが次のようなデータです。 F1,F2,F3 0010,0200,0001A12 0011,0201,0021B12 (実際は、1000件近いデータです) これをインポートすると、 F1,F2,F3 10,200,1A12 11,201,21B12 となってしまいます。 頭の「0」を省きたくないのです。 文字列として取り込めないでしょうか? CSVのデータに""を自動でつける方法はないでしょうか? Accessの外部データの取り込みを使うと、文字列として指定できるのですが、VBAを使いワンクリックでデータを取り込もうとしています。 よろしくお願いします。

  • 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ファイルのインポート

    Accessでcsvファイルをインポートさせようとしています。しかし、「F1フィールドがありません」のようなエラー表示が出て、できません。私の予想では、テーブルの型とcsvファイルの型が違うのではないかと思っています。テーブルには、数値型、テキスト型、日付/データ型があります。 保存したcsvファイルをExcelで開くと日付がApr-01や、2001/06/26となったりしていました。どこかで型変換のようなことをするのでしょうか?csvのことはよく分かりません。どうか、よろしくお願いします。

  • CSVファイルをエクセルファイルにインポートさせるには?

    おせわになります CSVファイルをエクセルファイルにインポートさせたいのですが 方法は ユーザーフォームをにテキストボックスと参照ボタン、実行ボタンを作成し 参照ぼたんでCSVファイルを選ぶ テキストボックスには参照先の住所が記載され 実行ボタンでsheet1にB2から貼り付けさせたいのですが可能ですか? 又、CSVの情報が不要な列もあります 必要な列のみ落とし込みをしたいです 当方初心者でVBAコードがあれば幸いです。 わかる方よろしくおねがいします

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

  • AccessでCSVをインポートしたい(VBA)

    お世話になります。AccessVBA暦2週間の初心者です。 AccessでCSVをインポートできたらいいなと思い ↓下のサイトにあるVBAサンプルを参考にして以下のようにプログラミングをしました。 http://memo.bz/access/advance/csvinpsam Public Function SplitTest() On Error GoTo myError Dim dbs As Database Dim rst As Recordset Dim varData As Variant Dim lngFileNum As Long Dim strData As String Dim xSQL As String FileName = TestGetFileName '入力元CSVファイルを開く lngFileNum = FreeFile() Open FileName For Input As #lngFileNum 'テーブルを開く Set dbs = CurrentDb Set rst = dbs.OpenRecordset("Data") 'CSVファイルの全レコードを読み込むループ Do Until EOF(lngFileNum) 'CSVファイルより1件分を読み込み Line Input #lngFileNum, strData 'カンマで区切って配列に代入 varData = Split(strData, ",", , vbTextCompare) '各フィールドデータをテーブルに追加 With rst .AddNew ![Code1] = varData(0) ![Code2] = varData(1) ![TS] = varData(2) ![PM] = varData(3) ![金額] = varData(4) ![摘要] = varData(5) ![メモ] = varData(6) .Update End With Loop rst.Close Close #lngFileNum MsgBox "データの取り込みが終了しました" Exit Function myError: MsgBox "ファイル名を指定してください" End Function 'CSVファイル選択 Function TestGetFileName() 'ファイル選択 Const ENABLE_WIZHOOK = 51488399 Const DISABLE_WIZHOOK = 0 Dim strFile As String Dim intResult As Integer WizHook.Key = ENABLE_WIZHOOK ' WizHook 有効化 intResult = WizHook.GetFileName( _ 0, "", "", "", strFile, "", _ "すべてのファイル (*.*)|*.*", _ 0, 0, 0, True _ ) WizHook.Key = DISABLE_WIZHOOK ' WizHook 無効化 TestGetFileName = strFile End Function ダイアログは普通に開けるのですがインポートが出来ず「ファイル名を指定してください」 というメッセージボックスが出ます。 弄っている部分は ![フィールド1] = varData(0)を ![Code1] = varData(0)にしているぐらいです。 何が悪いのか皆目見当がつきません。 こんな初心者でございますがご教授のほどよろしくお願いします。 (ヒントでも構いません) 説明不足等ございましたらご指摘のほどよろしくお願いします。

  • VBAでCSVファイルのインポートについて

    ACCESS2003でCSVファイルのインポートを行うVBAをご教授下さい。 ただし、CSVファイルは各項目がダブルコーテーションではさまれており、カンマはありません。 1行目にヘッダーがあります。 DoCmd.TransferText acImportDelim, , FileName, ImportPath, True ↑ これだと、うまくインポートされませんでした。 大変困っております。 どうぞよろしくお願い致します。

  • VBA 複数のCSVファイルを一度にインポートするには?

    お世話になります ■概要 Accessのボタンで複数のCSVファイルを一括にひとつのテーブルにインポートさせたいのですが ■内容 テキストボックス、参照ボタン、実行ボタンをフォーム上に設置 参照ボタンでダイアログボックスを表示させCSV複数選択し 選択内容がテキストへ反映。 実行ボタンで選択された複数CSVをインポートさせたいです 当方初心者なのでVBA等の回答があれば幸いです ご教授よろしくお願い致します。

  • Access VBA CSVファイルのインポート

    お世話になります。 VBAにてCSVファイル(タブ区切り)をインポートするのに、 以下のように記述してますが、エラーとなります。 なお、インポート先のtempテーブルはインポートするCSVファイルの フィールドと同じ並びで予め作成したものです。 DoCmd.TransferText acImportDelim, , "temp", path, True 「実行時エラー2391 貼り付け先のtempテーブルには、'フィールド1_ フィールド2_フィールド3'フィールドがありません。」 このエラーを見る限り、フィールド1~3が一つのフィールドとして 認識されているように見受けられます。 タブ区切りなのか、カンマ区切りなのかを指定するようなパラメタは あるのでしょうか。 なお、当該CSVファイルをウィザードより手動でインポートする分には 問題無くインポート出来ます。 ************** インポートするCSVファイルはユーザーにより見出し(フィールド)の 並びが異なる場合がある為、インポート定義を予め作っておくことが できない状況です。 ご教授の程、宜しくお願い致します。