【ACCESS VBA】Amazon QuickSightから出力したCSVのインポート

## やりたいこと
Amazon QuickSightからエクスポートしたCSVファイルをVBAを使用してACCESSにインポートしたい！

## いつもどおりにインポートしてみた
ACCESS VBAでのテキストインポートといえば __DoCmd.TransferText メソッド__ ですね。

https://learn.microsoft.com/ja-jp/office/vba/api/access.docmd.transfertext


```vb:Access VBA
Sub インポート_Click()

    Dim Path As String: Path = "C:\Users\〇〇\Documents\test.csv"
    DoCmd.TransferText acImportDelim, , "import", Path, True, , 65001

End Sub
```
こんな感じですね。
Pathに置かれたCSVファイルを「import」テーブルにインポートするコードです。

ちなみにAmazon QuickSightのCSVはUTF-8 BOM付きファイルなので
DoCmd.TransferText メソッドのCodePage識別子で「65001（UTF-8）」を指定しています。

## うまくいかない...
DoCmd.TransferText メソッドを使用したコードを実行したところ
フィールド名をうまくインポートすることができませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576431/066ca6bf-99f0-d068-f1b9-63b607d95513.png)

## なんで？
今回インポートしたのは下記のようなテストデータです。
Amazon QuickSightから出力するCSVファイルはフィールド名とレコードが
ダブルクォーテーション(")で囲われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576431/06756858-35eb-2237-58a6-40e7c34c090c.png)

このダブルクォーテーションが邪魔してうまくフィールド名をインポートできなかったみたいです。

## 対処法
色々試しましたが、下記の方法でうまくいきました。

```vb:Access VBA
Sub インポート_Click()

    Dim Path As String: Path = "C:\Users\〇〇\Documents\test.csv"
    Dim db As Database: Set db = CurrentDb
    Dim Newtb As TableDef
    Dim fldCnt As Integer: fldCnt = 0
    Dim fld As Field
    Dim fldArr() As Variant
    Dim buf As String
    Dim tmpfld As Variant

    '➀ CSVをimportテーブルに取込'
    DoCmd.TransferText acImportDelim, , "import", Path, True, , 65001  'UTF-8'
    
    Set Newtb = db.TableDefs("import")  'importテーブルをNewtbに設定'
    '➁ 現在のフィールド名をリストに取込'
    For Each fld In Newtb.Fields
        ReDim Preserve fldArr(fldCnt)
        fldArr(fldCnt) = fld.Name       'フィールド名をfldArrリストに取込'
        fldCnt = fldCnt + 1
    Next

    'CSVファイルを開く'
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .LineSeparator = 10             '改行コード：LF'
        .LoadFromFile Path

        '➂CSVファイルの1行目（フィールド名）をリストに入れる'
        buf = .ReadText(-2)             '一行目をbufに取込'
        tmpfld = Split(buf, ",")        'カンマで分割してtmpfldリストに取込'

        '➃ importテーブルのフィールド名を変更する'
        For fldCnt = 0 To UBound(tmpfld, 1)
            Newtb.Fields(fldArr(fldCnt)).Name = Replace(tmpfld(fldCnt), """", "")
        Next
       .Close
    End With
    
    MsgBox ("インポート完了")
    
End Sub
```

ステップとしては
➀DoCmd.TransferText メソッドを使用してCSVファイルを取り込む
　（この時点ではフィールド名はうまくインポートできていないまま）
➁現在のフィールド名をリストに取り込み
➂CSVファイルの１行目だけをADODB.Streamを使用してリストに取り込み
➃➁で取得した現在のフィールド名を、➂で取得したCSVファイルのフィールド名に変換

とりあえずCSVファイルをインポートして、その後フィールド名を直すという流れですね。

上記のコードを使用してインポートをすると以下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576431/f6faaa56-cce5-d27e-827b-e228844a30b9.png)

想定通りにインポートできましたね。

## まとめ
最初はどうしてフィールド名がうまくインポートできないのか分からず
BOM付きなのが原因なのかなと思ったのですが、ダブルクォーテーションがこんな風に邪魔しちゃうんですね。

ADODB.Streamを使用して１行目はフィールド名、それ以降はレコードに...
みたいなやり方を試したりしましたがうまくいかず、
DoCmd.TransferText メソッドでレコードは正しくインポートできていたので
今回のフィールド名だけを変更する方法に切り替えました。

## ご案内
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area