Csvファイルをインポートする

  • そのまま取り込む(ヘッダーあり = 最後のTrueで設定)
    DoCmd.TransferText acImportDelim, ,”sample1″, “D:\sample1.csv”, True

  • 文字コード指定:UTF-8
    DoCmd.TransferText acImportDelim, ,”sample2_utf8″, “D:\sample2_utf8.csv”, True, ,65001

  • 文字コード指定:S-JIS
    DoCmd.TransferText acImportDelim, ,”sample3_sjis”, “D:\sample3_sjis.csv”, True, ,932

  • 定義済みのインポート定義を利用
    DoCmd.TransferText acImportDelim, “sample4_import_def”,”sample4_utf8_define2″, “D:\sample4_utf8_define2.csv”, True

‘ https://msdn.microsoft.com/ja-jp/library/office/ff835958.aspx
‘ http://www.geocities.jp/cbc_vbnet/kisuhen/docmd.html#transfertext

select insert

  1. テーブルを作るとき
select * from ${new_tbl} from ${src_tbl}
  1. 追記する場合
insert into ${tbl}
select * from ${src_tbl}

### テーブルを削除する

Sub drop_table_if_exists(tb_name As String)
    If has_table(tb_name) Then
        CurrentDb.TableDefs.Delete tb_name
    End If
End Sub


Function has_table(name As String) As Boolean
    Dim t As TableDef
    For Each t In CurrentDb.TableDefs
        If t.name = name Then
            has_table = True
            Exit Function
        End If
    Next
    has_table = False
End Function

関数

  • 大文字小文字を区別しないので、 strcomp 関数を使って比較する
    strcomp(val1, val2, 0) = 0
    でも、val1 or val2 が null だと “null” が 帰ってくる
    回避策 → nz関数を使って nullが入らないようにする

テーブルを3つ以上 join 句で結合するとき

カッコの位置がポイント

select * from (
tblA as a left join tblB as b on (a.key = b.key))
left join tblC as c on (a.key = c.key)

マクロからQueryを実行する

戻り値がないQuery

currentdb.execute "delete from a"

戻り値がある場合

Dim ret As Recordset
Set ret = CurrentDb.OpenRecordset("select * from sample1")

Do While ret.EOF = False
    Debug.Print ret!id
    ret.MoveNext
Loop

注意点

  • GUIから複数クエリを同時に実行できない
    • 移行でupdateを大量に実行しようとすると泣きを見る
  • 文字列型だと英字の大文字小文字を区別しない
    • これはExcelでも同様の仕様。というか、MS製品の仕様か。
    • 照合順序の設定で変更できそうだが、チラッと試したレベルではうまくいかず