• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBAでCSVファイルを読込むと何故か文字列が日付に変換さ)

Excel VBAでCSVファイルを読込むと何故か文字列が日付に変換されて困っています

このQ&Aのポイント
  • Excel VBAでCSVファイルを読み込む際に、文字列が日付に変換されてしまう問題に困っています。
  • 具体的な状況として、CSVデータには住所情報があり、別のCSVにデータを移す処理を行っています。
  • 通常は文字列をそのまま移すだけの作業ですが、特定の文字列が日付に変換され、問題が発生しています。修正方法がわからず困っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

ヒントです Office2007で「データ」→「外部データの取り込み」→「テキストデータ」を選択すると、フィールド毎の取り込みの型を指定できます(文字列型にすれば日付型には変換されません) この操作を「マクロ記録」してみてください。こんなマクロが生成されます。 Sub Macro1() ' ' Macro1 Macro ' With ActiveSheet.QueryTables.Add(Connection:="TEXT;D:\Temp\sample.csv", _ Destination:=Range("$A$1")) .Name = "sample" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 932 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = True .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .TextFileColumnDataTypes = Array(1, 2) .TextFileTrailingMinusNumbers = True .Refresh BackgroundQuery:=False End With End Sub あとはいらない行を削除してできあがり。削除しなくても一応は動くはずですけど。

hjonathan
質問者

お礼

zap35様、m_and_dmp様、MARU4812様 色々とご助言頂きありがとうございました。 できました。 結局、zap35様のご回答がきっかけとなり、以下のような処理を実行しました。 元CSVファイルをxls形式に読込むときに文字データとしてセルを.NumberFormatLocal = ”@”で 読込みます。(最初は元CSVファイルを直接開く方法で実施していました) その後、判定加工処理をして得られた結果を別なワークシートにやはり.NumberFormatLocal = ”@”を 利用して書き出します。 その後、ワークシートをCSV形式で出力保存させるというやり方です。 この方法で、住所の"1-2-3"や電話番号の"03-XXXX-XXXX"や日付を"2010-10-01 12:34:56"なども全て正常に処理できました。 ちなみに参考になったサイトです。 http://homepage2.nifty.com/e-ka/win32/index.htm とても参考になりました。ありがとうございます。 色々とお騒がせいたしました。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.4

Excel が余計な変換をするのは有名な話です。 手入力でセルに"1-24"とか入力しても日付に変更されると思います。 (Excel2003では"1-24-11"は手入力で変換されませんでした。) "(1)"は -1 になったりします。 手入力だと、オートコンプリートも影響します。 "(c)""(r)"が丸付きに変換されます。 他にもたくさんありますよ。 『csv excel 自動変換』といったキーワードで WEB 検索して 勉強される事をお勧めします。 『excel 自動変換』で検索すればオートコンプリートの問題が 検索されます。 既に回答のある「外部データの取り込み」の設定で回避可能 ですが、列毎の設定が必要ですし、Excel のバージョンによって 動作が変わると嫌なので、私はもう、VBA でテキストファイル として直接読み込むことにしてしまってます。 その上で、セルに入れる場合はデータの先頭にアポストロフィ(') をつけてしまう場合もありますね。

hjonathan
質問者

補足

m_and_dmp様、zap35様、MARU4812様 いろいろとご指南頂きありがとうございます。 色々試してみましたが、決定打が見つかりません。 以前、同様なマクロを何度も作成しており、何故、いままでこのような 問題が発生しなかったか不思議な気分です。 ヒントはzap35様のご指摘頂いたCSVファイルを文字形式で読込む処理です。 まだ、最終的にわかったわけではないですが、時間が経過しているので 皆様に失礼があってはいけないかと思い書き込ませて頂きます。 現在は、Schema.iniを利用して対応する方法を模索しております。 実は、上記住所以外にも(見落としておりましたが、電話番号など03-XXXX-XXXXのように "03"の部分でも"0"が欠落するなど難題山すみです。 元々やりたいことは、CSVからあるデータを加工し、再度CSVに吐き出す処理です。 したがって、読込時点でこのような現象が発生するのと、CSV出力時点でも同様な問題が 発生するため、この出力方法についても検討しなければなりません。 Schema.iniを利用するとCSVの形式そのものをコントロールできそうなので チャレンジしておりますが、中々うまくいきません。 もう少し、頑張ってみようかと思いますが、もし、ご経験があれば、ご教授いただけると うれしいです。 ご協力ありがとうございます。 何卒、宜しくお願い申し上げます。

すると、全ての回答が全文表示されます。
  • m_and_dmp
  • ベストアンサー率54% (993/1828)
回答No.2

CSVファイルを開く時点で日付に変換されてしまっているとしますとエクセル上で処理するのは難しいですね。 結果が良ければ良いという方法なら、 DDateという変数に読み込んで、 mm、dd、yyに分離し、 mm-dd-yy と結合して表示させます。 以下は、エクセル上で試したのでマクロになるとコードが変わるかも知れません。 mm=Month(DDate) dd=Day(DDate) yy=Year(DDate)-2000 ChoBanGo=mm&"-"&dd&"-"&yy 表示が 1-24-11となっていさえすれば、実際の値は問題にしないならば、 セルの表示形式を mm-dd-yyにするだけで良いと思います。 どちらも最後の -11 の部分がなかったりすると、結果がおかしくなります。

すると、全ての回答が全文表示されます。
  • m_and_dmp
  • ベストアンサー率54% (993/1828)
回答No.1

コードが1行増えますが、セルの内容をStringで宣言した変数に読み込んでから別のセルに書き出してみたらいかがでしょうか?

hjonathan
質問者

補足

m and dmpさん ご回答頂きまして、ありがとうございます。 小生もご指摘の方法は、既に実行してみましたが駄目でした。 読込むところで既に日付になってしまっています。 現在、CSVを開いてからデータを他のワークシートに移す処理をしています。 なので、CSVをファイルを開く時点で日付に変換されてしまっているような 感じです。(勿論、他のエディターでは、確実に"1-24-11"になっております。 他に何か方法があれば、お伝授下さい。 よろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A