dポイントプレゼントキャンペーン実施中!

Excel VBAでCSVファイルを読込むと何故か文字列が日付に変換されて困っています。
すごく困っております。どなたか教えて下さい。

状況を申し上げますと、以下のようなCSVデータがあります。
"住所1","住所2"
"東京都港区青山","1-24-11"

このとき、別なCSVにデータを移すという単純なものです。

通常は、
WsCount.Cells(1, 1).Value =Cells(2,1).value
WsCount.Cells(1, 2).Value =Cells(2,2).value
で、セルにある文字をそのまま、新しいシートのセルに移すだけのことですが、
何故か、"1-24-11"が日付に変換され、"2011/1/24"に変わってしまいます。
デバックなどで、途中経過を見ても既に日付にかわっており、
どうにも対応ができません。

以前は""で囲んである文字は、文字のまま認識していたと思いますが、
何故か今回はうまくいきません。

ちなみに、Excel2007です。

どなたか、教えて下さい。

宜しくお願いします。

A 回答 (4件)

ヒントです



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

あとはいらない行を削除してできあがり。削除しなくても一応は動くはずですけど。
    • good
    • 0
この回答へのお礼

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
とても参考になりました。ありがとうございます。

色々とお騒がせいたしました。
ありがとうございました。

お礼日時:2010/09/28 19:15

Excel が余計な変換をするのは有名な話です。


手入力でセルに"1-24"とか入力しても日付に変更されると思います。
(Excel2003では"1-24-11"は手入力で変換されませんでした。)

"(1)"は -1 になったりします。
手入力だと、オートコンプリートも影響します。
"(c)""(r)"が丸付きに変換されます。
他にもたくさんありますよ。

『csv excel 自動変換』といったキーワードで WEB 検索して
勉強される事をお勧めします。
『excel 自動変換』で検索すればオートコンプリートの問題が
検索されます。

既に回答のある「外部データの取り込み」の設定で回避可能
ですが、列毎の設定が必要ですし、Excel のバージョンによって
動作が変わると嫌なので、私はもう、VBA でテキストファイル
として直接読み込むことにしてしまってます。
その上で、セルに入れる場合はデータの先頭にアポストロフィ(')
をつけてしまう場合もありますね。

この回答への補足

m_and_dmp様、zap35様、MARU4812様

いろいろとご指南頂きありがとうございます。
色々試してみましたが、決定打が見つかりません。
以前、同様なマクロを何度も作成しており、何故、いままでこのような
問題が発生しなかったか不思議な気分です。

ヒントはzap35様のご指摘頂いたCSVファイルを文字形式で読込む処理です。
まだ、最終的にわかったわけではないですが、時間が経過しているので
皆様に失礼があってはいけないかと思い書き込ませて頂きます。

現在は、Schema.iniを利用して対応する方法を模索しております。
実は、上記住所以外にも(見落としておりましたが、電話番号など03-XXXX-XXXXのように
"03"の部分でも"0"が欠落するなど難題山すみです。

元々やりたいことは、CSVからあるデータを加工し、再度CSVに吐き出す処理です。
したがって、読込時点でこのような現象が発生するのと、CSV出力時点でも同様な問題が
発生するため、この出力方法についても検討しなければなりません。

Schema.iniを利用するとCSVの形式そのものをコントロールできそうなので
チャレンジしておりますが、中々うまくいきません。

もう少し、頑張ってみようかと思いますが、もし、ご経験があれば、ご教授いただけると
うれしいです。

ご協力ありがとうございます。
何卒、宜しくお願い申し上げます。

補足日時:2010/09/28 15:38
    • good
    • 0

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 の部分がなかったりすると、結果がおかしくなります。
    • good
    • 0

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

この回答への補足

m and dmpさん
ご回答頂きまして、ありがとうございます。
小生もご指摘の方法は、既に実行してみましたが駄目でした。
読込むところで既に日付になってしまっています。

現在、CSVを開いてからデータを他のワークシートに移す処理をしています。
なので、CSVをファイルを開く時点で日付に変換されてしまっているような
感じです。(勿論、他のエディターでは、確実に"1-24-11"になっております。

他に何か方法があれば、お伝授下さい。
よろしくお願いします。

補足日時:2010/09/27 21:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A