ACCESS初心者です。
ACCESSのVBAでCSV取込をしようとしていますが、
うまくいきません。
CSVとテーブルの項目の場所が違ったりオートナンバーが設定されていたりしているので、
そこのところが全くわかりません。
いろいろ調べて試しましたが、うまくいがず行き詰っています。
VBAでなくてもクエリやマクロといったやり方でもいいので、
教えてください。
-------------------------------------------------------------------
VBAプログラム
'処理実行確認画面
rc = MsgBox("処理を実行しますか?", vbOKCancel, "注文データ処理")
If rc = vbCancel Then
Exit Sub
End If
'[ファイルを開く]ダイアログボックスを作成
Set dlgOpen = Application.FileDialog(msoFileDialogOpen)
'ダイアログボックスの初期値をセット
dlgOpen.AllowMultiSelect = False
dlgOpen.Filters.Clear
dlgOpen.Filters.Add "CSVファイル", "*.csv"
dlgOpen.InitialFileName = CurrentProject.Path
'ダイアログボックス表示
retDialog = dlgOpen.Show
'[キャンセル]ボタン
If retDialog = 0 Then
Exit Sub
'[開く]ボタン
Else
'選択したファイル名を表示
Me!txtファイル名IN = dlgOpen.SelectedItems(1)
End If
Const ForRading = 1
strFilePath = txtファイル名IN
Set Con = CurrentProject.Connection
Rec.Open "order_list", Con, adOpenDynamic, adLockOptimistic
Open strFilePath For Input As #FNo
'ファイルの1行目の項目名部分を読み込む(何も処理しない)
Line Input #FNo, txtData
On Error GoTo ErrHndl
'エラーが発生した場合にデータのインポートをなかったこと(ロールバック)
'にするためにトランザクション処理として実行
Con.BeginTrans
'実際のデータ部分(2行目)からの処理
Do While Not EOF(FNo)
Line Input #FNo, txtData
Debug.Print txtData
Loop
Con.CommitTrans
Close #FNo
MsgBox ("処理が完了しました。")
Exit Sub
ErrHndl:
Close #FNo
Con.RollbackTrans
MsgBox "以下のエラーが発生したためロールバックしました。" & vbCrLf & _
Err.Description, vbCritical
----------------------------------------------------------------------------------------
No.2ベストアンサー
- 回答日時:
CSVファイルにタイトル行が有り、テーブルのフィールド名と同じ、
列数も同じ(オートナンバー型フィールドは除く)、
ならTransferTextメソッドでインポートはだめですか。
安全のためインポート定義を利用するべき
オートナンバー型フィールドは考えなくとも自動的に処理されます。
トランザクション処理が出来ないからNGか・・・。
インポート出来ないデータ型(数値に文字など)の場合は
インポートエラーテーブルが自動生成され記録されます。
テキスト型に255超の文字数の場合、超過分は黙って切り捨てられ
エラーは記録されません。
姑息な方法かもしれませんがインポート前にオートナンバーの最大値を控え
インポート処理後にエラーテーブルの有無・レコード数の増加をチェックし
変化が有れば削除クエリで元に戻す。
オートナンバーが大きく飛ぶので最適化で修正
Access VBA 自身を最適化 でGoogleとVBAサンプルもあるけど。。。
・・・
現状の方向だと
dim v() as variant,i as integer
v=split(txtData,",") '配列に格納
for i= lbound(v(i)) to ubound(v(i))
debug.print i,v(i) '添え字と値(タイトル)の確認
next
with rec
.addnew
!購入者氏名(漢字)= v(2)
!注文日時= cdate(v(0) ) 'Cdate 要らないかも?
・・のように対応する配列を指定
.update
end with
のようになるかと思います。
ただ、CSVファイルを、,カンマで分割して配列に入れているだけなので
ExcelでCSV出力した時のようなフォーマット
(位取り有りの数値にダブルクォートがついて、"1,100")
区切り以外でカンマが使われていると項目数・データとも崩れます。
Rollbackすることに。
お返事が大変遅くなり申し訳ございません。
for文を使わずにsplit文でそれぞれ読み込ませるやり方で、15列分のデータを読み込むことが出来ました。
ありがとうございます。
また、ありましたら教えてください。
No.1
- 回答日時:
オイラだったら、txtDataをカンマでスプリットして、フィールド指定のSQLを作ってCon.executeで実行するけど、、、
A as variant
A=split(txtData,",")
INSERT INTO TABLENAME FILEDS(注文日時,注文番号,購入者氏名,....) VALUES (A(0),....)
http://www.1keydata.com/jp/sql/sql-insert-into.php
まあ、recordset 開いているなら
REC.Addnew
REC!注文日時 = A(0)
REC!注文番号 = A(1)
・・・・
REC.update
みたいな、形でやるのもありかな。 若干遅いかもしれないけど、
http://www.happy2-island.com/access/gogo03/capte …
どちらにしても、A(n)はテキスト型なんで、正しいデリミターつけたり値を変換したりする作業は発生する。
こんなことやってみれば、Aに何が入っているかわかるし、、、
for n = 0 to ubound(a)-1
debug.print A(n)
next n
お返事が遅くなり申し訳ございません。
INSERT文でやろうとしましたが、テーブル名でエラーで使用できず、recordsetでやりましたら、15列分のデータが読み込みました。
ありがとうございます。
また、ありましたら教えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLserver算術オーバーフロ...
-
私は某会社でaccess2003をこれ...
-
Access VBAで行ラベルが定義さ...
-
Accessのマクロでモジュールを...
-
エクセルVBAでUserFormを起動し...
-
Statement ignored というエラー
-
ODBCリンクの際にACCESSでは読...
-
OutlookVBAで作成したマクロに...
-
sqlplusでヘッダーが付かない
-
キャッシュを使わずにSELECTを...
-
WHERE句の実行順序
-
SQL文のエラー
-
PL/SQLでSPOOLさせたいのですが...
-
Transact-SQLでストアードプロ...
-
PL/SQLカーソルの2重FORループ...
-
ストアド実行時のエラー「参照...
-
callで順に実行されるプロシー...
-
全角空白のTRIMができない...
-
SQLサーバで和暦から西暦に変換...
-
SQL*Loader フォーマット変換...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLserver算術オーバーフロ...
-
bcp in でエラー
-
VB.net SqlConnectionでの連続S...
-
ストアドプロシージャのRETURN...
-
ACCESSのVBAでCSVを取込処理に...
-
Oracle8.1.7の更新処理
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
Statement ignored というエラー
-
エクセルVBAでUserFormを起動し...
-
VBA プロシージャの名前の取得
-
PL/SQLカーソルの2重FORループ...
-
ODBCリンクの際にACCESSでは読...
-
キャッシュを使わずにSELECTを...
-
【Excel VBA】 WorksheetやRa...
-
ストアドプロシジャからストア...
-
今日の日付が入った行のデータ...
-
sqlplusのspoolで空白行出現
-
sqlplusでヘッダーが付かない
-
SQL*Plusの終了はquit?exit?
おすすめ情報
テーブルとCSVの中身です。
テーブルとCSVをいじらないでインポートする方法を教えてください。
-----------------------------------
テーブル
ID オートナンバー型
購入者氏名(漢字) テキスト型
注文日時 日付/時刻型
注文番号 テキスト型
・・・・
-----------------------------------
-----------------------------------
CSV
注文日時
注文番号
購入者氏名(漢字)
・・・・・
--------------------------------