こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBSを実行すると書式設定がおかしくなってしまう

VBSで、
(1)CSVを開く
(2)編集する
(3)別名保存
を行いたいのですが、
VBSを実行すると元々「y/M/d」の日付形式のセルが「M/d/y」の標準表示形式になってしまいます。

(2)の編集に何か余計なことを書いてしまったかと思って
(1)→(3)のみでも実行してみましたがやはり駄目でした。

下記は実際のコードです。

'▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△

path1 = "C:\test\読み込み.csv"
path2 = "C:\test\書き込み.csv"

Set xl = CreateObject("Excel.Application")
xl.Application.Visible = False
xl.Application.DisplayAlerts = False

WScript.Sleep(500)

Set bk = xl.Application.Workbooks.Open(path1)
Set st = xl.Worksheets(1)

st.SaveAs path2 , 6

xl.quit
Set xl = Nothing

'▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△



色々中を弄って、

▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△
'A1に日付セルがあり、最終的に「yyyy/MM/dd」形式で保存したい
st.Cells(1,1).FormatNumber = "yyyy/MM/dd"
st.Cells(1,1) = Format(st.Cells(1,1),0)
st.Cells(1,1) = Format(st.Cells(1,1),1)
st.Cells(1,1) = Year(st.Cells(1,1)) & "/" & Month(Right("0" & Month(st.Cells(1,1)), 2)) & "/" & Right("0" & Day(st.Cells(1,1)), 2)
▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△

といくつか試しましたが、どれも駄目でした。(実行自体エラーのものもありますが一応…)

エクセルのバージョンは2007です。


回答よろしくお願いいたします!

投稿日時 - 2017-02-08 13:24:24

QNo.9291365

すぐに回答ほしいです

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

エクセルでは、csvに保存してあるファイルを開こうとすると「日付に見えるデータは、日付形式として読み込み」されます。

例えば、CSVファイルに

2017/02/08,東京都千代田区,1-1-1

と出力されているファイルをEXCELに読み込むと

A1セル   B1セル     C1セル
2017/2/8  東京都千代田区 2001/1/1

と言う状態になります。

これを回避するには「すべてのデータをダブルクォーテーションで括ってcsvに出力」しなければなりません。

試しに、メモ帳を開いて、以下

2017/02/08,東京都千代田区,1-1-1
”2017/02/08”,”東京都千代田区”,”1-1-1”

の2行を書きこんで「C:\test\読み込み.csv」で保存して、VBSで実行してみて下さい。

VBSを実行すると「C:\test\書き込み.csv」の内容は、以下

2/8/2017,東京都千代田区,1/1/2001
”2017/02/08”,”東京都千代田区”,”1-1-1”

のようになる筈です。

ダブルクォーテーションで括ってある部分は「EXCELが余計な解釈をしない」ので、そのまま出力されています。

ダブルクォーテーションで括ってない部分は「EXCELが日付と解釈できてしまう部分は日付としてCSVに書き込む」ので、勝手に日付として出力されます。

この「勝手に日付として解釈して出力する際」には「日付の標準表示形式」つまり「M/d/y」が使われます。

で「日付データをyyyy/MM/dd形式で保存したい」と言う場合は

path1 = "C:\test\読み込み.csv"
path2 = "C:\test\書き込み.csv"

Set xl = CreateObject("Excel.Application")
xl.Application.Visible = False
xl.Application.DisplayAlerts = False

WScript.Sleep(500)

Set bk = xl.Application.Workbooks.Open(path1)
Set st = xl.Worksheets(1)

str = Year(st.Cells(1,1)) & "/" & Right("0" & Month(st.Cells(1,1)), 2) & "/" & Right("0" & Day(st.Cells(1,1)), 2)
st.Cells(1,1).NumberFormatLocal = "@"
st.Cells(1,1) = str

st.SaveAs path2 , 6

xl.quit
Set xl = Nothing

のようにして「セルの書式を文字列にして、yyyy/mm/ddに変換した文字列を、文字列としてセルに書き込む」必要があります。

こうすると

「C:\test\書き込み.csv」の内容は、以下

2017/02/08,東京都千代田区,1/1/2001
”2017/02/08”,”東京都千代田区”,”1-1-1”

のようになる筈です(「1-1-1」のような「丁目-番地-号」のデータは、日付に誤解されたままですから注意して下さい)

なお、出来上がった「C:\test\書き込み.csv」をEXCELで読み込むと

A1セル   B1セル     C1セル
2017/2/8  東京都千代田区 2001/1/1

のようになり、「1~9の範囲の月と日は、頭の0が削られ1桁に短縮」されてしまいますから、VBSで「頭に0を付けて2桁にしても無駄、無意味」です。

投稿日時 - 2017-02-08 14:37:33

お礼

解決しました!

ありがとうございます!

投稿日時 - 2017-02-08 17:34:42

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

st.SaveAs path2 , 6

st.SaveAs path2 , 6,,,,,,,,1
にしてみたらどうかな。

投稿日時 - 2017-02-08 13:44:24

補足

回答ありがとうございます!

▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△
st.Cells(1,1) = FormatDateTime(st.Cells(1,1),0)
st.SaveAs path2 , 6,,,,,,,,1
▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△

で記述しましたが、やはり「M/d/y」となってしまい駄目でした…

投稿日時 - 2017-02-08 14:29:10

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-