csvファイルがデスクトップにあります。これをアクセスのテーブルにインサートとアップデートをかけたいです。アクセスの機能をつかったインポートではなくVBAを使った方法です。例えばテーブルABCがあります。各フィールドは文字列型、数値型でnullは禁止にしていません。CSVはカンマ区切りで行の最後は改行になっています。各行の中には、

"abc,def,hij,,,,,,,,,klmn,,,op,,,qr"などになっています。1行読み込んでは次の行を読み込んでアクセスのテーブルにいれるという方法です。レコードセットを使ってinsertするのは理解できますが、どうやってcsvをうまく読み取ってテーブルに反映させればいいでしょうか?何か不具合などは生じないでしょうか?このサイトを参考にしようと思っています。http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_020.html

回答の条件
  • 1人2回まで
  • 登録:2009/03/07 01:43:19
  • 終了:2009/03/11 22:55:06

ベストアンサー

id:SALINGER No.2

SALINGER回答回数3454ベストアンサー獲得回数9692009/03/07 10:14:57

ポイント150pt

csvを読み込むことで想定される問題は、データが""で囲んでたりcsvによって仕様が違う場合があること。

データベースの数値型に文字型を代入してしまうなどの、データ型の問題。

主キーに設定されたフィールドが重複していた。

NULL禁止のフィールドに値が設定されなかった。などがあります。


参考のリンク先はExcelに表示するサンプルですが、それを参考にコードを考えてみます。

まず、コードではGetOpenFilenameはそのまま使えないので削除。

Excelに出力してる部分をデータベースに読み込むようにコードを変えるだけです。

リンク先はフィールド数が固定の場合のサンプルなので、フィールド数は5個と固定しています。

下のコードでは読み込めなかった行がわかるようにしてみました。

(Updateを何度もしてるのでオーバーヘッドではありますが)


Option Explicit

' CSV形式テキストファイル(5カラム)読み込みサンプル
Sub READ_TextFile()
    Const cnsTITLE = "テキストファイル読み込み処理"
    Const cnsFILTER = "全てのファイル (*.*),*.*"
    Dim intFF As Integer            ' FreeFile値
    Dim strFILENAME As String       ' OPENするファイル名(フルパス)
    Dim X(1 To 5) As Variant             ' 読み込んだレコード内容  ' ①
    Dim GYO As Long                 ' 収容するセルの行
    Dim lngREC As Long              ' レコード件数カウンタ
    
    Dim db As Database
    Dim rs As Recordset
    Dim i As Integer
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset("テーブルABC", dbOpenTable)

    'csvファイルのパスを指定
    strFILENAME = "C:\Documents and Settings\hogehoge\デスクトップ\sample.csv"
    
    ' FreeFile値の取得(以降この値で入出力する)
    intFF = FreeFile
    ' 指定ファイルをOPEN(入力モード)
    Open strFILENAME For Input As #intFF
    GYO = 0
    ' ファイルのEOF(End of File)まで繰り返す
    Do Until EOF(intFF)
        ' レコード件数カウンタの加算
        lngREC = lngREC + 1
        ' レコードを読み込む(このサンプルは5項目のCSV)
        Input #intFF, X(1), X(2), X(3), X(4), X(5)                  ' ②
        
        GYO = GYO + 1
        
        rs.AddNew
        For i = 1 To 5
            rs.Fields(i - 1) = X(i)
        Next i
        On Error Resume Next
        rs.Update
        If Err.Number > 0 Then
            MsgBox GYO & "行目を読み込むことができませんでした"
            lngREC = lngREC - 1
        End If
        On Error GoTo 0
    Loop
    ' 指定ファイルをCLOSE
    Close #intFF
    ' 終了の表示
    
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    
    MsgBox "ファイル読み込みが完了しました。" & vbCr & _
        "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE
End Sub
id:akaired

ご回答ありがとうございます!

2009/03/11 22:54:43

その他の回答(1件)

id:degucho No.1

degucho回答回数253ベストアンサー獲得回数672009/03/07 04:11:41

ポイント35pt

参考サイトにあるように、CSVといってもいろいろあるので、

Accessで直接インポート出来るフォーマットファイルであれば

DoCmd,TransferTextを使って一旦別のテーブルに取り込んでから

処理するのが速度や機能の変更の面で楽だと思います。

(取り込み前に加工してもいい。場合によってはクエリで済むかもしれない)


ファイルを読む場合、

Access2000以降であれば例示のInputステートメントより

LineInputで一行読んでSplit関数で分けて配列で処理したほうが

Recordset.Fieldsコレクションとインデックスで対応させられるから

プログラムしやすいかもしれません。

例示の行だと行頭と行末の"を取ってやらないといけませんが


不具合というのがなにを想定しているのかがわかりませんが

(レコードセットでAddNew/Updateは出来るんですよね?)

よくある処理だと思います。

Accessの文字列型はNullと""(空文字)を区別しますのでNullを入れたいときは

プログラムで意図的に判断してやる必要があるかとおもいます

id:SALINGER No.2

SALINGER回答回数3454ベストアンサー獲得回数9692009/03/07 10:14:57ここでベストアンサー

ポイント150pt

csvを読み込むことで想定される問題は、データが""で囲んでたりcsvによって仕様が違う場合があること。

データベースの数値型に文字型を代入してしまうなどの、データ型の問題。

主キーに設定されたフィールドが重複していた。

NULL禁止のフィールドに値が設定されなかった。などがあります。


参考のリンク先はExcelに表示するサンプルですが、それを参考にコードを考えてみます。

まず、コードではGetOpenFilenameはそのまま使えないので削除。

Excelに出力してる部分をデータベースに読み込むようにコードを変えるだけです。

リンク先はフィールド数が固定の場合のサンプルなので、フィールド数は5個と固定しています。

下のコードでは読み込めなかった行がわかるようにしてみました。

(Updateを何度もしてるのでオーバーヘッドではありますが)


Option Explicit

' CSV形式テキストファイル(5カラム)読み込みサンプル
Sub READ_TextFile()
    Const cnsTITLE = "テキストファイル読み込み処理"
    Const cnsFILTER = "全てのファイル (*.*),*.*"
    Dim intFF As Integer            ' FreeFile値
    Dim strFILENAME As String       ' OPENするファイル名(フルパス)
    Dim X(1 To 5) As Variant             ' 読み込んだレコード内容  ' ①
    Dim GYO As Long                 ' 収容するセルの行
    Dim lngREC As Long              ' レコード件数カウンタ
    
    Dim db As Database
    Dim rs As Recordset
    Dim i As Integer
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset("テーブルABC", dbOpenTable)

    'csvファイルのパスを指定
    strFILENAME = "C:\Documents and Settings\hogehoge\デスクトップ\sample.csv"
    
    ' FreeFile値の取得(以降この値で入出力する)
    intFF = FreeFile
    ' 指定ファイルをOPEN(入力モード)
    Open strFILENAME For Input As #intFF
    GYO = 0
    ' ファイルのEOF(End of File)まで繰り返す
    Do Until EOF(intFF)
        ' レコード件数カウンタの加算
        lngREC = lngREC + 1
        ' レコードを読み込む(このサンプルは5項目のCSV)
        Input #intFF, X(1), X(2), X(3), X(4), X(5)                  ' ②
        
        GYO = GYO + 1
        
        rs.AddNew
        For i = 1 To 5
            rs.Fields(i - 1) = X(i)
        Next i
        On Error Resume Next
        rs.Update
        If Err.Number > 0 Then
            MsgBox GYO & "行目を読み込むことができませんでした"
            lngREC = lngREC - 1
        End If
        On Error GoTo 0
    Loop
    ' 指定ファイルをCLOSE
    Close #intFF
    ' 終了の表示
    
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    
    MsgBox "ファイル読み込みが完了しました。" & vbCr & _
        "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE
End Sub
id:akaired

ご回答ありがとうございます!

2009/03/11 22:54:43

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません