0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AccessのVBAでdatファイル出力

Posted at

概要

dat出力はcsv出力に比べてちょっと癖があるので、その点についてのまとめ。

dat出力の方法は大きく
『DoCmd.TransferText使用』
『ADODB.Stream使用』
の2種類ある。

DoCmd.TransferText

エクスポート定義作成

下記のようにするとエクスポートの画面に移動できる。
image.png

ここのファイル名(ファイルパス)はエクスポート定義に影響しない。
(任意でOK)
image.png

↓ 左下の『設定』で定義の設定画面が開く。
image.png

↓ 区切り文字などいろいろ設定してエクスポート定義を保存できる。
image.png

上記の画面の通り、 改行コードは設定できない
DoCmd.TransferTextを使う場合、改行コードは『キャリッジリターン + ラインフィード』となる。

もし別の改行コードで出力する必要があるなら、ADODB.Streamを使おう。

↓ 出力サンプルを確認する意味でも、最後の完了まで進める。
image.png

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ファイル出力しようとすると、下記のように例外になってしまう。
image.png

実行時エラー3027
データベースまたはオブジェクトは読み取り専用なので、更新できません。

DoCmd.TransferText方式のまとめ

  • 改行コードの指定ができない。
  • 一旦txtやcsvに出力した後、datにリネームが必要。

ADODB.Stream

参照設定

image.png

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 ビット

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?