概要
dat出力はcsv出力に比べてちょっと癖があるので、その点についてのまとめ。
dat出力の方法は大きく
『DoCmd.TransferText使用』
『ADODB.Stream使用』
の2種類ある。
DoCmd.TransferText
エクスポート定義作成
ここのファイル名(ファイルパス)はエクスポート定義に影響しない。
(任意でOK)
↓ 区切り文字などいろいろ設定してエクスポート定義を保存できる。
上記の画面の通り、 改行コードは設定できない 。
DoCmd.TransferTextを使う場合、改行コードは『キャリッジリターン + ラインフィード』となる。
もし別の改行コードで出力する必要があるなら、ADODB.Streamを使おう。
DoCmd.TransferTextを使って出力
'ヘッダー行の有無については、エクスポート定義の設定ではなく、
'DoCmd.TransferTextの引数の値で決まる。
Const is_header_add_ As Boolean = True
'文字コードについてはDoCmd.TransferTextの引数よりもエクスポート定義の
'設定が優先される。
'ここではDoCmd.TransferTextで例外にならないよう、いったん0=SJISにしておく。
Const encode_ As Long = 0
'dat拡張子を出力しようとすると例外になるので、
'一旦txtで出力しておいて出力直後にファイル名変更。
'Accessと同じフォルダーに出力。
DoCmd.TransferText _
acExportDelim, _
"lycoreco_export", _
"lycoreco", _
CurrentProject.Path & "\test.txt", _
is_header_add_, _
, _
encode_
Name CurrentProject.Path & "\test.txt" As CurrentProject.Path & "\test.dat"
datファイル出力しようとすると、下記のように例外になってしまう。
実行時エラー3027
データベースまたはオブジェクトは読み取り専用なので、更新できません。
DoCmd.TransferText方式のまとめ
- 改行コードの指定ができない。
- 一旦txtやcsvに出力した後、datにリネームが必要。
ADODB.Stream
参照設定
ADODB.Streamを使って出力
'ストリーム準備。
Dim stream_ As New ADODB.Stream
stream_.Charset = "Shift-JIS"
stream_.Open
'出力対象のテーブル開く。
Dim rst_ As New ADODB.Recordset
rst_.Open _
"lycoreco", _
CurrentProject.Connection, _
adOpenForwardOnly, _
adLockReadOnly
'ヘッダー部出力。
Dim i_ As Long
For i_ = 0 To rst_.Fields.Count - 1
stream_.WriteText rst_.Fields(i_).Name
stream_.WriteText vbTab 'タブ区切り
Next
stream_.WriteText vbLf '改行はラインフィード
'rst_.MoveNextしていないので、この時点ではRecordsetのカーソルは1行目から動いていない状態。
'データ部出力。
Do Until rst_.EOF
stream_.WriteText rst_.Fields("namae").Value
stream_.WriteText vbTab 'タブ区切り
stream_.WriteText rst_.Fields("age").Value
stream_.WriteText vbLf '改行はラインフィード
rst_.MoveNext: Loop
rst_.Close
'ファイル出力してストリーム閉じる。
'Accessと同じフォルダーに出力。
stream_.SaveToFile CurrentProject.Path & "\test.dat"
stream_.Close
ADODB.Stream方式のまとめ
- コードが長くなってしまう。
囲み文字ありの場合はエスケープも自前でやらないといけない、など面倒。 - その分自由度は高い。
蛇足
レジストリ変更すれば、DoCmd.TransferTextでダイレクトにdatファイルを出力できるらしい。
でも下記の理由あるからやめた方がいいと思う。
- セキュリティの為に『レジストリに無い拡張子はダメー』って制御がかかっているとのこと。
つまり、レジストリ変更によってセキュリティが下がる恐れがある。 - レジストリに依存する = 実行環境に依存する = 移植性が下がる。
参考サイトさん
バージョン
Windows 10 Pro 22H2 OSビルド 19045.2546
Microsoft Access for Microsoft 365 MSO (バージョン 2212 ビルド 16.0.15928.20196) 32 ビット