
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ランキング
-
データベースファイル(.db)を開...
-
エクセルのフィルタ抽出が固まる
-
ACCESSのSQLで、NULLかNULLでな...
-
顧客データベースを作る場合、...
-
最新の日付とその金額をクエリ...
-
android版のMs accessはありま...
-
帳票フォームでのあるコンボボ...
-
警察はスマホに保存した動画や...
-
ORMについて
-
テキストで空欄(null?)を検索...
-
Access フォーム上でコンボボッ...
-
シートが異なるセル同士を、相...
-
Microsoft Access での経過日数...
-
テキストボックスにコントロー...
-
半角ハイフンに似た文字
-
データベース用語「実表」の読み方
-
CSVファイルでテキストの改行の...
-
日通NECロジスティクスの追跡サ...
-
データベースの勉強 公務員を目...
-
はじめてのAccess 2019 について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLserver算術オーバーフロ...
-
bcp in でエラー
-
DBへのOPENについて
-
ACCESSのVBAでCSVを取込処理に...
-
SQL : たしかに DELETE したの?
-
VB.net SqlConnectionでの連続S...
-
私は某会社でaccess2003をこれ...
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
-
Access VBAで行ラベルが定義さ...
-
キャッシュを使わずにSELECTを...
-
callで順に実行されるプロシー...
-
sqlplusでヘッダーが付かない
-
ODBCリンクの際にACCESSでは読...
-
PL/SQLカーソルの2重FORループ...
-
Accessの数値から時間に変換す...
-
エクセルVBAでUserFormを起動し...
-
WHERE句の実行順序
-
【Excel VBA】 WorksheetやRa...
-
SQLで部分的にGROUP BYしたいとき
おすすめ情報
テーブルとCSVの中身です。
テーブルとCSVをいじらないでインポートする方法を教えてください。
-----------------------------------
テーブル
ID オートナンバー型
購入者氏名(漢字) テキスト型
注文日時 日付/時刻型
注文番号 テキスト型
・・・・
-----------------------------------
-----------------------------------
CSV
注文日時
注文番号
購入者氏名(漢字)
・・・・・
--------------------------------