Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
CSVをADOで取得
投稿日時: 21/11/16 09:38:28
投稿者: にゃすを

お世話になります。
CSVデータ(ダブルクォーテーション囲み無しのカンマ区切り)を
ADOを利用してデータ取得しているのですが、あるフィールドのデータが
01BF304 という文字列が入力されている内容が 勝手に 1304 に変換
されてしまいます。ダブルクォーテーション囲みで出力されたデータは
このような不具合は発生しません。おそらくこのフィールド値が文字列と
認識されず勝手に変換されているのかと考えていますが、
たとえば、フィールドの型を文字列と指定して取得する方法 もしくは
この不具合回避方法があればご教示いただきたいです。
 
ちなみに、GetString メソッド を使用してみたのですが、変換した時点で
1304に変わっていたため使えませんでした。
ちなみに、Openステートメントを使用してデータ取得を試みたのですが、
別フィールドの文字列にカンマが含まれている
データがあり、別の不具合(1行の列数不一致)が発生したため諦めました。

回答
投稿日時: 21/11/16 10:50:11
投稿者: sk

引用:
CSVデータ(ダブルクォーテーション囲み無しのカンマ区切り)を
ADOを利用してデータ取得しているのですが、あるフィールドのデータが
01BF304 という文字列が入力されている内容が 勝手に 1304 に変換
されてしまいます。ダブルクォーテーション囲みで出力されたデータは
このような不具合は発生しません。

具体的にどのようなコードを記述されているかが不明ですが、
とりあえず、CSV ファイルの読み込みに際して、
以下の全ての条件を満たしているかどうかをご確認下さい。
 
・接続のためのプロバイダーとして ACE または Jet を使用している。
 
・CSV ファイルの最初の 25 行において、その列の文字列が
 「半角数字( 0 - 9 )」と「 "F", "K", "S" のいずれか」で
 構成されている。
 
引用:
おそらくこのフィールド値が文字列と認識されず
勝手に変換されているのかと考えています

( その Field オブジェクトの Type プロパティの値を
確認すれば判ることですが)恐らく、その列が通貨型の
フィールドとして解釈された結果でしょう。
 
Microsoft コミュニティより:
https://answers.microsoft.com/ja-jp/msoffice/forum/all/%EF%BD%83%EF%BD%93%EF%BD%96%E3%81%AE%E3%82%A4/81345cc6-bcbc-461e-acab-9014fec7cb8c
 
引用:
たとえば、フィールドの型を文字列と指定して取得する方法 もしくは
この不具合回避方法があればご教示いただきたいです。

あらかじめフォーマットが決まっているのであれば、
その CSV ファイルが保存されているフォルダに
Schema.ini ファイルを用意されることをお奨めします。
 
Microsoft Docs より:
https://docs.microsoft.com/en-us/sql/odbc/microsoft/schema-ini-file-text-file-driver?view=sql-server-ver15

投稿日時: 21/11/16 11:15:13
投稿者: にゃすを

sk様
早速のご回答ありがとうございます。
プロバイダはMicrosoft.Jet.OLEDB.4.0で指定しています。
最初の 25 行においてもご指摘の通り構成されています。
Typeで調べたら確かに通貨型(6)でした。
通貨型の回避はちょっと難しそうですね・・・
Schema.ini ファイル については無知でしたので
少し調べました。構成は難しくなさそうですね。
検討します!

投稿日時: 21/11/16 12:01:19
投稿者: にゃすを

Schema.ini ファイル でうまくいきました。
しかし、運用・メンテナンスを考慮すると少しめんどくさいですね・・・
(CSVファイルに存在するすべての列に対して型を指定しないとうまくいきませんでした)
 
Schema.ini ファイル 作成についても VBAで自動化すれば良さそうですね。
 
ありがとうございました。
解決とします。