質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

210閲覧

Access VBAでテーブルをCSVへエクスポート時、日付型の列に謎の値が入ることがある

Finekaz

総合スコア3

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2025/05/31 08:31

実現したいこと

accdb(正確にはaccdr)ファイル(➀とする)からテーブルをCSVへエクスポートし、別のaccdbファイル(②とする)でそのCSVファイルをインポートしたい。

発生している問題・分からないこと

①で、テーブルが更新される度に「DoCmd.TransferText」メソッドでテーブルをCSVにエクスポートしている。
②でCSVファイルを既存テーブルにインポートしようとした時に日付/時刻型の列のインポートが失敗していてNULLになっていることがあり、その時にCSVファイルを確認してみると、エクスポートされた日付/時刻型の列の値がおかしな値になっている。

エラーメッセージ

error

1エラーメッセージ等は特にないので、エクスポートされた日付/時刻型の列の値の例を記載します。 2 3正しく出力された場合の値   おかしな形になっている時の値 4「2025/05/02 19:10:00」  「2025/05/02 '('022')' 19:10:00」 5「2025/05/03 13:15:00」  「2025/05/03 '('033')' 13:15:00」 6「2025/05/18 9:20:00」   「2025/05/18 '('1818')' 9:20:00」 7 8日付と時刻の間に、日付の「日」部分を二回繰り返したような文字列とシングルクォーテーション・カッコが出力されているという点が共通しています。発生した時は、該当CSVファイル内の全ての日付型の列の全ての値がこうなります。 9また、日付と時刻の間の謎の文字列は、シングルクォーテーション・カッコがなく数字3桁もしくは4桁のみのパターンもあります。。。

該当のソースコード

Access

1DoCmd.TransferText acExportDelim, , "テーブル名, "パス.csv", True 2'「テーブル名」、「パス」は質問用の仮名、正しくテーブル名・パスは指定されています

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

・Web検索では同じような例が見つかりませんでした。
・上記ソースコード実行時に、必ずしも該当のおかしな値になるとは限らず、普通に出力できることの方が多いです。再現性が無く、該当のおかしな値が出力される時の条件が分かっていません。

補足

①のファイルでのソースコード実行環境は別の者の環境で、「Microsoft 365 Access Runtime」を使用して①のaccdrファイルを開いて実行されています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

DoCmd.TransferText acExportDelim, , "テーブル名, "パス.csv", True

CSVファイルを確認してみると、エクスポートされた日付/時刻型の列の値がおかしな値になっている。

2025/05/02 '('022')' 19:10:00

恐らく以下の条件が重なっているためでしょう。

  • TransferText メソッドの第 2 引数 SpecificationName の指定を省略している(エクスポート定義を使用していない)。

  • システムの地域オプションにおいて、[短い日付]の表示形式がyyyy/MM/dd '('ddd')'に設定されている(現在のシステム日付の曜日(省略形)を括弧付きで表示させている)。

エクスポート定義を使用しなかった場合、日付/時刻型のフィールドの値は上記のオプション設定に従った形式の文字列に変換された形でファイル出力されます。
ところが TransferText メソッドを使用してテキスト変換を行う場合、ddddd(日を前ゼロ埋め2桁固定で表示)とd(日を可変桁で表示)の組み合わせとして解釈されます。
また、シングルクォーテーション'は書式指定式における文字列リテラルの囲み記号として解釈されず、そういう文字としてそのまま出力されます。

なお Access アプリケーション上において、日付/時刻型のフィールドの[書式]プロパティや、フォーム/レポート上に配置されたテキストボックスの[書式]プロパティにカスタム書式を設定する場合、dddは「曜日の英語表記の省略形("Sun", "Mon", "Tue"……)」、aaaは「曜日の日本語表記の省略形("日","月","火"……)」を表す書式文字列として指定することが出来ます。

以上の点を踏まえた限り、これは TransferText メソッドの不具合である(曜日表記に対応できてない)と推定されます。

回避方法としては、次のようなものが挙げられます。

  • システムの地域オプションの[短い日付]の書式文字列をyyyy/MM/ddに変更する。

  • あらかじめエクスポート定義を作成しておき、TransferText メソッドの呼び出し時にそのエクスポート定義を指定する。

  • 日付/時刻型のフィールドをそのまま出力するのではなく、Format 関数を使用してyyyy/mm/dd hh:nn:ssなどの表示形式の文字列に変換した結果(テキスト型のデータ)を返す選択クエリ(またはその結果を格納したテーブル)をエクスポートするようにする。

1番目の方法が最も手っ取り早くはありますが、そのPCを使用しているユーザーの都合でそういう設定にしているのでしょうから、あまりお奨めは出来ません。

CSVファイルを既存テーブルにインポート

決まったレイアウトでファイル連携を行う前提なのであれば、エクスポートする際にはエクスポート定義として、インポートする際にはインポート定義として引数 SpecificationName を明示的に指定するようにされた方が無難でしょう。

投稿2025/06/02 02:28

編集2025/06/02 03:48
sk.exe

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Finekaz

2025/06/03 03:01

詳細なご回答、誠にありがとうございます。 全く原因や直接の対策が分かっていなかったので、大変助かります! 複数の営業所の複数のPCから、営業所ごとに置いている①のファイルを操作してCSVがエクスポートされるので、もしかすると営業所のどれかのPCの「システムの地域オプションの[短い日付]」の設定で「ddd」を用いているのかもしれません。 対策として、挙げていただいている ①エクスポート定義とインポート定義として引数 SpecificationNameを指定する ②日付/時刻型の列をFormat関数でテキストに変換したクエリをエクスポートする どちらかに変更しようと思います。 営業所宛てに「システムの地域オプションを確認して」等の依頼をするのはPC操作に疎い方も多いのでしないつもりで、結果的に問題無くなったと判断できるまで時間がかかってしまいますので、一旦ベストアンサーに選ばせていただきたいと思います。 大変勉強になりました!ありがとうございました。
guest

0

Web検索では同じような例が見つかりませんでした。

再現性が無く、該当のおかしな値が出力される時の条件が分かっていません。

当方でもそのような現象の経験はないので、直接の回答は難しいです。

不具合の条件、原因が分からないのなら、対症療法的な対応をするしかないのでは。

例えば、

  • CSVファイルではなくExcelファイルかAccessファイル(accdb)でエクスポート/インポートする。

  • インポートする前にCSVファイルの「日付と時刻の間の謎の文字列」を削除しておく。

投稿2025/06/01 03:09

hatena19

総合スコア34367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Finekaz

2025/06/02 04:10

ご回答ありがとうございます。 おっしゃる通り、もし原因が分からない場合は対症療法的に対処するしかないかなと思っております。 ただ原因を把握できないと今後また困るので、できれば原因を把握して対応したいと考えた所存です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問