Microsoft Access 掲示板

CSVファイル(文字コード:UTF-8)からデータを取得し、Accessのテーブルにデータを書き込むVBAコードが知りたい

4 コメント
views
4 フォロー

Sub Sample2()
    Dim buf As String, Target As String, i As Long
    Dim tmp1 As Variant, tmp2 As Variant, j As Long
    Target = "D:\Work\UTF-8のテキスト.csv"
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .LoadFromFile Target
        buf = .ReadText
        .Close
        tmp1 = Split(buf, ”,")

    End With
End Sub

Office TANAKAが掲載している"ADODB Stream"オブジェクトを使用して読み込んだデータを変数bufに格納するところまでは出来ましたが、その後、Accessの「T_サンプル」テーブルのフィールド[商品ID]、[商品受取者]、[数量]のデータ最終行に、変数bufに格納されたデータを転記するコードがわかりません。
お手数ですが、ご教示頂けたら幸いです。
よろしくお願いします。

TK
作成: 2024/03/06 (水) 18:24:32
通報 ...
1

最終目的は、UTF-8のCSVファイルをAccessのテーブルにインポートしたいということでしょうか。

だとしたら、そんな面倒なことせずに、下記の1行でできますが、それではだめですか。

Docmd.TransferText acImportDelim, , “T_サンプル”, "D:\Work\UTF-8のテキスト.csv", True, , 65001

最後の 65001 が文字コードを UTF-8 と指定してます。
その他の文字コードに関しては下記を参照に。

コード ページ識別子 - Win32 apps | Microsoft Learn

上記の方法でだめなのなら、その理由を説明してもらえますか。

2

回答ありがとうございます。
言葉足らずの説明で大変申し訳ありません。
CSVファイルは、1行目が空白行、2行目が項目(データあり)、3行目からデータな形式になっており、実際にデータとして取得したいのは、3行目以降となります。
もし、回答頂いたコードで実現できるとしたら、どのようなコードになりますでしょうか?
もちろん、別の方法でも構いません。
ご教示よろしくお願いします。

3

CSVファイルは、1行目が空白行、2行目が項目(データあり)、3行目からデータな形式になっており、実際にデータとして取得したいのは、3行目以降となります。

そのようなファイルはCSVファイルとは言えません。
どのような経緯で入手したものか分かりませんが、入手先にCSVの仕様にそった形式にできないかまずは確認してみましょう。

それが不可能なら、
2行目以降はCSVの仕様に沿っているなら、1行目を削除して上書保存して、それを前回の回答の方法でインポートするとシンプルかつ高速に処理できると思います。

テキストファイルへの書き込み方法はOffice TANAKAさんのサイトにあります。

Office TANAKA - ファイルの操作[UTF-8形式のテキストファイルに書き込む]

1行目の削除は下記のコードでできます。

    Dim pos As Long
    pos = InStr(buf, vbCrLf)
    buf = Mid(buf, pos + 2)
4

CSVファイルは、1行目が空白行、2行目が項目(データあり)、3行目からデータな形式になっており、
実際にデータとして取得したいのは、3行目以降となります。

別の方法でも構いません

別案( Windows標準のpowershellワンライナーをVBAから実行 )をご紹介します

・ UTF8のテキストファイルを読み書き
・ テキストファイルの先頭X行を読み飛ばす

の両立に関しては、ADODB.Streamの利用より記述が簡潔になります
 

Sub SampleTK()
    Const TARGET    As String = "D:\Work\UTF-8のテキスト.csv"
    Const SKIP_ROWS As Long = 1  '←読み飛ばす行数
    Dim tail_path   As String
    Dim command     As String
    
    With CreateObject("WScript.Shell")
        tail_path = .SpecialFolders("Desktop") & "\TK_" & Format$(Now, "yyyymmddhhnnss"".csv""")
        command = "powershell ""gc -Path '" & TARGET & "' -Encoding UTF8 " _
                & "| select -Skip " & CStr(SKIP_ROWS) & " | out-file '" & tail_path & "' -Encoding UTF8"""
        .Run command, 0, True
    End With
    
    DoCmd.TransferText acImportDelim, , "T_サンプル", tail_path, True, , 65001
    Kill tail_path
    MsgBox Prompt:=command, Buttons:=vbOKOnly, Title:=CStr(SKIP_ROWS) & "行の読み飛ばし"
End Sub