忙しい現代人の腰&肩のお悩み対策!

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qcsvファイルをアクセスにインポート

こんにちは。Access2000について質問させてください。よろしくお願いいたします。


csvファイル内のデータをAccess2000に作成したデータベースにインポートしたいんのですが、どうすれば良いでしょうか?

何を調べたらいいかもわからない状態で…

どなかかご存知の方がいらっしゃったら教えて下さい。なにとぞ宜しくお願いいたします。

Aベストアンサー

メニューのファイルメニューから外部データの取り込みを選択するかデータベースウィンドウ上で右クリックしインポートを選択します。
ファイルの種類をテキストファイルに設定しcsvファイルのあるフォルダを開きファイルを指定しインポートボタンをクリックするとインポートウィザードが開きますので順次従って進めればできます。
データを保存する場所で既存のテーブルに保存したければ次のテーブルで指定します。ウィザードの設定が終わったら完了ボタンでインポートできます。
ウィザードにある設定ボタンをクリックすればインポート定義を登録できます。インポート定義を登録すれば次回からフィールドの設定などしなくてインポート定義を使って同様のデータ構成のファイルはインポートできるようになります。
ヘルプでインポートで検索すれば出てきますのでそちらも参照してください。

QAccessのマクロでCSVファイルをインポートする

Accessのマクロ・VBAにてCSVファイルを
インポートしたいのですが、うまくいきません。

DoCmd.TransferText acImportDelim, , "C:\Documents and Settings\yoshimi\My Documents\顧客マスタテーブル.csv", False
現在のコードです。

「オブジェクト'0.txt’が見つかりませんでした。
オブジェクトが存在していること、名前やパス名が正しいことを確認
してください。」
とエラーが表示されます。

過去ログを検索し、似たようなものを見つけ同じようにしたつもりです。
http://okweb.jp/kotaeru.php3?q=1691138
(回答のANo.1の定義の保存場所が分からずしていません)

どこがおかしいのか教えていただきたいです・・・

Aベストアンサー

インポート先(保存先)となるテーブルが指定されていないようです。

その分、カンマ(,)が1個少ないなっているために引数がずれて判断され、インポートするファイルが「C:\~顧客マスタテーブル.csv」ではなく、「0.txt」だと判断されているのではないかと思います。
(「False」がファイル名と解釈され(False=0)、テキストファイルと解釈されて拡張子「.txt」をつけてエラー表示された、と)

とりあえず、「Test」テーブルを作成し(フィールドは仮でF1,F2の2つでテキスト型)、「,"C:\~」の前に「,"Test"」を入れて実行してみて下さい。
(csvファイルが3列以上の構成であれば、「テーブル'Test'にはF3フィールドがありません」とのエラーが表示されるようになりると思いますので、適宜F3,F4,・・・と、必要な列数を追加して下さい:定義のかわりです)

QaccessでSQL文を使ってcsvファイルをインポートする方法

txtファイルをDoCmd.TransferTextでインポートする事は出来ているのですが、データが15~30万件ほどありかなり時間が掛かります。SQL文でのレコード全件DELETEがかなり高速だった為、インポートもSQLの方が処理が早いのでは?と思い色々サンプルをさがし、下記のようにしてみたのですが、SQL文をうまく書けず、作動しません。
間違い部分を指摘していただけませんでしょうか?

DoCmd.RunSQL "INSERT INTO Add_house_TEMP ( ハウス,カスト,SG1ステータス )"& _
       "SELECT [add_house#txt].F1,[add_house#txt].F2,add_house#txt].F3"& _
       "FROM add_house#txt IN "\\sv999999\_営業部\個人\作業場\20071115" "Text;HDR=NO;"

Aベストアンサー

全件デリートが早いからといって、読み込みが早いと判断できないと思います。
質問の趣旨から外れていると思いますが、ちょっと実験してみました。
参考になれば幸いです。
Private Sub コマンド0_Click()
Dim sTime As Date
Dim eTime As Date
Dim strFileName As String
strFileName = "C:\test.txt"
sTime = Now()
DoCmd.TransferText acImportDelim, , "T_Temp", strFileName, False
eTime = Now()
Debug.Print (eTime - sTime) * 24 * 60 * 60
End Sub

Private Sub コマンド1_Click()
Dim sTime As Date
Dim eTime As Date
Dim strFileName As String
Dim strSQL As String
strSQL = "SELECT * INTO T_TEMP FROM T_TEMP1"
strFileName = "C:\test.txt"
sTime = Now()
DoCmd.TransferText acLinkDelim, , "T_Temp1", strFileName, False
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
eTime = Now()
Debug.Print (eTime - sTime) * 24 * 60 * 60
End Sub

Private Sub コマンド2_Click()
Dim sTime As Date
Dim eTime As Date
Dim strFileName As String
Dim strSQL As String
Dim CON As New ADODB.Connection
Set CON = CurrentProject.Connection
strSQL = "SELECT * INTO T_TEMP FROM T_TEMP1"
strFileName = "C:\test.txt"
sTime = Now()
DoCmd.TransferText acLinkDelim, , "T_Temp1", strFileName, False
CON.Execute strSQL
eTime = Now()
Debug.Print (eTime - sTime) * 24 * 60 * 60
End Sub

フィールド数188、18万件(355MB)のテキストファイルを読み込んでみました。
(毎回作ったテーブルを削除し、最適化をしてから行いました。)
5回ずつテストしてみましたが、体感できる差はなさそうです。
tranfertext と runsql は私のコンピュータでは65秒くらい、
ADOを使った場合は67秒くらいでした。
どちらかというと、物理的に読むHDと書くHDを分けるのに効果が
ありそうな気がしますが、残念ながら実験できる環境がありません。

全件デリートが早いからといって、読み込みが早いと判断できないと思います。
質問の趣旨から外れていると思いますが、ちょっと実験してみました。
参考になれば幸いです。
Private Sub コマンド0_Click()
Dim sTime As Date
Dim eTime As Date
Dim strFileName As String
strFileName = "C:\test.txt"
sTime = Now()
DoCmd.TransferText acImportDelim, , "T_Temp", strFileName, False
eTime = Now()
Debug.Print (eTime - sTime) * 24 * 60 * 60
End Sub

Private Sub コマンド1_Click()
Dim sT...続きを読む

QACCESSで毎回CSVファイルをテーブルにインポートする

ACCESSでGUIで毎回CSVファイルをインポートしていますが、
(テーブル→新規作成→デーブルのインポート)
自動化?VBA?することはできるのでしょうか。
ACCSESSは初心者でよくわかっていません。
よろしくおねがいします。

Aベストアンサー

>「マクロに設定」のやり方がわかりません。
え、そうなんですか。
アクセスを開くと左側に「マクロ」ってありませんか。
そこで新規作成します。
テーブルを削除するとか、クエリを開く(実行する)とか、動作を順番に設定するのです。
任意に実行したいなら、マクロ名は任意で構いません。
mdbを開いたら、必要なときにマクロを実行するだけです。

>こちらはoffのする方法が、チェックを外せばいいということでしょうか。
見つけましたよね。そのチェックを外します。

あのー、とりあえず解説書などお持ちではないですか。
最低限のことはそういう書籍で勉強して欲しいのですが。(マクロがわからないことにびっくりしたので)
ここで一つ一つやり取りするわけにもいかないので。

QACCESS VBAでファイルを開くダイアログを表示させたい

ACCESSのフォームからコマンドボタンを押すことで、
ファイル開くダイアログが表示されて、
そこでファイル名をクリック指定することで、
実際にそのファイルがインポートされるように仕組みを作りたいと思っています。

VBAでどう記述するのでしょうか?
類似ケースの質問内容も調べましたがピンと来るものがありませんでした。
ご存知の方、教えて頂けるとありがたいです。よろしくお願いします。

Aベストアンサー

CSVファイルの場合ですが、こちらを参考に。
http://www.accessclub.jp/bbs3/0364/superbeg109189.html

Excelの場合は
DoCmd.TransferSpreadsheet acImport, 8, "テーブル名", strFileName, True, ""
のようになります。
詳しくは、TransferSpreadsheet をヘルプで調べてください。
マクロの「ワークシート変換」を 作成し
「マクロを Visual Basic に変換」で
VBA のコードにしてみるのも良いでしょう。

Qインポート時のエラー「データ型の変換エラー」

ACCESS2000を使用しています。
CSVファイルをマクロを使い、インポートしようとしているのですが、ある列に「33300G2」というデータがあります。
インポートのマクロを実行するとそのデータのみがインポートエラー(エラー内容は「データ型の変換エラー」)となってしまいます。
ちなみに、エラーが出る列は、「33300G2」以外全てが数字のみなのですが関係あるのでしょうか。
もし原因らしきものがわかればアドバイスよろしくお願いいたします。

Aベストアンサー

インポート定義をして下さい。
インポート→設定→データ型を変更して下さい。
何かあれば補足して下さい。
がんばれ

Q任意のCSVファイルをAccessに取り込むには?

同様の質問が発見できなかったため質問させて頂きます。

アクセスを利用して日々の電力監視のデータを管理しようと思います。
データを出力するシステムの都合で、日々のデータがcsv形式で毎日1ファイル生成されます。
ファイル名は[AT20070925.csv]のような形です。
このファイルをアクセスにインポートする際、ファイル名をダイレクトに指定しなくてもインポートするファイルを指定することは出来るのでしょうか?

具体的には
(1)毎日指定した時間にデータを取り込むものとして、本日の(または前日の)ファイル名のデータを取り込む
(例えば9月26日0時2分に9月25日のデータ[AT20070925.csv]を自動的にインポートする)

(2)処理を行う際に随時指定した日付のファイル名のデータを取り込む
(フォームで日付を指定し、例えば9月25日と指定したら[AT20070925.csv]を随時インポートする)

インポートするファイル名に変数を使うことは可能なのでしょうか?

また実際にはインポートでなくリンクを使用する可能性もあるのですが、リンクでも同じ様な処理は出来るのでしょうか?

良い方法等ありましたらご教授いただければと思います。

同様の質問が発見できなかったため質問させて頂きます。

アクセスを利用して日々の電力監視のデータを管理しようと思います。
データを出力するシステムの都合で、日々のデータがcsv形式で毎日1ファイル生成されます。
ファイル名は[AT20070925.csv]のような形です。
このファイルをアクセスにインポートする際、ファイル名をダイレクトに指定しなくてもインポートするファイルを指定することは出来るのでしょうか?

具体的には
(1)毎日指定した時間にデータを取り込むものとして、本日の(または前日の)...続きを読む

Aベストアンサー

>インポートするファイル名に変数を使うことは可能なのでしょうか?
可能です。

1、2ともに「AT20070925.csv]という文字列(日付部分が変化)を生成する方法がわかればよいですよね? サンプルを書きましたので参照されてください。(ファイルがCドライブ直下にある場合の定義です。C:\AT20070925.csv というような文字列になります。)

(1)のパターン 「昨日」
FileName = "C:\AT" & Format(Date-1, "yyyymmdd") & ".csv"

(2)のパターン 「フォーム内のTextBox1の値」
FileName = "C:\AT" & Format(Me.TextBox1.Value, "yyyymmdd") & ".csv"

これで変数FileNameにご希望の文字列が格納されます。

あとは、DoCmd.TransferTextメソッドでこのFileNameを引数に指定してあげれば希望のテーブルにインポート/リンク可能です。インポートの場合の例は下記のとおりです。リンクの場合もほぼ同じです。(デリミトの形式はCSVは省略可です、、、確か。) 

'TableName = "任意のテーブル名(インポート先)"
DoCmd.TransferText acImportDelim, , TableName, FileName

今回は書いていませんが、エラー処理等を忘れずに。

>インポートするファイル名に変数を使うことは可能なのでしょうか?
可能です。

1、2ともに「AT20070925.csv]という文字列(日付部分が変化)を生成する方法がわかればよいですよね? サンプルを書きましたので参照されてください。(ファイルがCドライブ直下にある場合の定義です。C:\AT20070925.csv というような文字列になります。)

(1)のパターン 「昨日」
FileName = "C:\AT" & Format(Date-1, "yyyymmdd") & ".csv"

(2)のパターン 「フォーム内のTextBox1の値」
FileName =...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QエクセルマクロでCSVファイルをACCESSのテーブルに取り込みたい

エクセルマクロというかプログラミング初心者です。
エクセルマクロでCSVファイルをACCESSのテーブルに取り込みたいのですが、なんだかさっぱり分かりません。
近いサンプルコードや勉強方法が載っているサイトをご存知のかたがいらっしゃったら教えてください。

Aベストアンサー

単にCSVをAccessに取り込むだけならマクロは不要です。
たぶんプログラミングで取り込む、わざわざしかもAccessの側でなくてExcelマクロから行うのには、たぶん理由があると思うのですが、その辺やりたいことをなるべく具体的に書いてみたほうが良いと思います。


以下のリンクが求める回答になっているか、あまり自信は無いのですが


魔術幻燈-VBAマクロサンプル集
CSVファイルを読み込む
http://www.bekkoame.ne.jp/~poetlabo/COMP/Excel/VBASAMP/IMP_CSV.TXT

Excelでお仕事 CSVのVBSでの読み書きの例があります。
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_050.html

Access VBA Tips+α
http://www.happy2-island.com/access/gogo03/capter00301.shtml

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング