アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

「ACCESSのVBAでCSVを取込処理に」の質問画像

質問者からの補足コメント

  • テーブルとCSVの中身です。
    テーブルとCSVをいじらないでインポートする方法を教えてください。
    -----------------------------------
    テーブル

    ID オートナンバー型
    購入者氏名(漢字)  テキスト型
    注文日時      日付/時刻型
    注文番号      テキスト型
    ・・・・

    -----------------------------------
    -----------------------------------
    CSV

    注文日時
    注文番号
    購入者氏名(漢字)
    ・・・・・
    --------------------------------

      補足日時:2015/05/21 14:14

A 回答 (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することに。
    • good
    • 2
この回答へのお礼

お返事が大変遅くなり申し訳ございません。
for文を使わずにsplit文でそれぞれ読み込ませるやり方で、15列分のデータを読み込むことが出来ました。
ありがとうございます。

また、ありましたら教えてください。

お礼日時:2015/06/04 16:55

オイラだったら、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
    • good
    • 1
この回答へのお礼

お返事が遅くなり申し訳ございません。

INSERT文でやろうとしましたが、テーブル名でエラーで使用できず、recordsetでやりましたら、15列分のデータが読み込みました。

ありがとうございます。

また、ありましたら教えてください。

お礼日時:2015/06/04 17:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す