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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLserver算術オーバーフロ...
-
bcp in でエラー
-
Accessのマクロでモジュールを...
-
エクセルVBAでUserFormを起動し...
-
Access VBAで行ラベルが定義さ...
-
ストアドプロシジャからストア...
-
ODBCリンクの際にACCESSでは読...
-
VBA プロシージャの名前の取得
-
今日の日付が入った行のデータ...
-
sqlplusでヘッダーが付かない
-
oracle 文字列 01:45 を時間に...
-
キャッシュを使わずにSELECTを...
-
Accessの数値から時間に変換す...
-
PL/SQLカーソルの2重FORループ...
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
SQLエラーについて
-
質問:DBMS_OUTPUTの使用方法
-
Statement ignored というエラー
-
excel 日付のみ置換したいのです
-
ストアド実行時のエラー「参照...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLserver算術オーバーフロ...
-
bcp in でエラー
-
ACCESSのVBAでCSVを取込処理に...
-
VB.net SqlConnectionでの連続S...
-
ストアドプロシージャのRETURN...
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
エクセルVBAでUserFormを起動し...
-
Accessの数値から時間に変換す...
-
ストアドプロシジャからストア...
-
VBA プロシージャの名前の取得
-
Statement ignored というエラー
-
sqlplusでヘッダーが付かない
-
全角空白のTRIMができない...
-
PL/SQLカーソルの2重FORループ...
-
キャッシュを使わずにSELECTを...
-
今日の日付が入った行のデータ...
-
ODBCリンクの際にACCESSでは読...
-
エクセル 日付による並べ替え...
-
【Excel VBA】 WorksheetやRa...
おすすめ情報
テーブルとCSVの中身です。
テーブルとCSVをいじらないでインポートする方法を教えてください。
-----------------------------------
テーブル
ID オートナンバー型
購入者氏名(漢字) テキスト型
注文日時 日付/時刻型
注文番号 テキスト型
・・・・
-----------------------------------
-----------------------------------
CSV
注文日時
注文番号
購入者氏名(漢字)
・・・・・
--------------------------------