VBSを実行すると書式設定がおかしくなる問題

このQ&Aのポイント
  • VBSを実行すると、書式設定が正しく反映されずにおかしくなる問題が発生しています。特に、「y/M/d」の日付形式が「M/d/y」の標準表示形式に変わってしまいます。
  • 編集をするためには、CSVファイルを開き、編集内容を変更し、別名で保存する必要があります。
  • いくつかのコードを試しましたが、どれもうまくいきませんでした。エクセルのバージョンは2007です。問題の解決策を教えてください。
回答を見る
  • ベストアンサー

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です。 回答よろしくお願いいたします!

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8526/19383)
回答No.2

エクセルでは、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桁にしても無駄、無意味」です。

sahksas
質問者

お礼

解決しました! ありがとうございます!

その他の回答 (1)

  • f272
  • ベストアンサー率46% (8024/17150)
回答No.1

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

sahksas
質問者

補足

回答ありがとうございます! ▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△ st.Cells(1,1) = FormatDateTime(st.Cells(1,1),0) st.SaveAs path2 , 6,,,,,,,,1 ▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△ で記述しましたが、やはり「M/d/y」となってしまい駄目でした…

関連するQ&A

  • 実行時エラー '424'  オブジェクトが必要です

    デバッグ中で、下記のエラーが出て、進めません。 実行時エラー '424' オブジェクトが必要です。 Dim x1, x2, st1, st2, st3 As String x1 = Cells(41, 5).Value Set st1.Value = Application.WorksheetFunction.VLookup(x1, Range(Cells(102, 2), Cells(106, 4)), 3, False) x1  Cells(102, 2)  Cells(106, 4)には値が入っています。 アドバイス宜しくお願い致します。

  • VBS サブルーチン化

    いつもお世話になっております。 WindowsXP環境にある下記のようなVBSがあります。 コード------------------------------------------------------------------ '********変数強制宣言******** Option Explicit '********フォルダ変数宣言************ Dim LOG_DIR '********ファイル変数宣言************ Dim LOG_FILE , LOG_FILENAME LOG_DIR = "D:\LOG" LOG_FILE = "CHECK_LOG.txt" LOG_FILENAME = LOG_DIR & "\" & LOG_FILE '********オブジェクト変数定義******** Dim FSO , LOG Set FSO = WScript.CreateObject("Scripting.FileSystemObject") Set LOG = FSO.OpenTextFile(LOG_FILENAME, 2, True) '********時間変数宣言******** Dim YYYY , MM1 , DD , HHMMSS , HH , MM2 , SS '********処理開始時間******** YYYY = Year(Date) MM1 = MONTH(Date) DD = DAY(Date) HH = Right("0" & Hour(Time), 2) MM2 = Right("0" & Minute(Time), 2) SS = Right("0" & Second(Time), 2) LOG.WriteLine("★★★************** 処理日 = " & YYYY & "/" & MM1 & "/" & DD & " 処理開始時間= " & HH & ":" & MM2 & ":" & SS & " ***************★★★") LOG.WriteBlankLines(1) 処理1(省略) '********処理終了時間******** YYYY = Year(Date) MM1 = MONTH(Date) DD = DAY(Date) HH = Right("0" & Hour(Time), 2) MM2 = Right("0" & Minute(Time), 2) SS = Right("0" & Second(Time), 2) LOG.WriteLine("★★★************** 処理日 = " & YYYY & "/" & MM1 & "/" & DD & " 処理終了時間= " & HH & ":" & MM2 & ":" & SS & " ***************★★★") LOG.WriteBlankLines(1) コード------------------------------------------------------------------ 上記VBSは処理1(省略)の前後に開始時間と終了時間をログに出力しています。 ただ、開始と終了時間を取得するのにログ出力直前に現在の【YYYY , MM1 , DD , HHMMSS , HH , MM2 , SS】を取得して ログを出力するのでコードが増えてしまい、スッキリしません。 もっとシンプルに、現在の時間・時刻等をVBSサブルーチンとかで(出来れば同じVBS内に)随時取得したいのですが なかなかコードが書けません。バッチファイルでは無く、VBSだけで実現したいです。 ご存知の方がいれば、ご教授願いませんでしょうか? 何卒、宜しくお願い致します。

  • VBS形式ファイル:ダブルクリックで実行させたい

    VBS形式ファイル:ダブルクリックで実行させたいです。 当方が現在トライしているのは: エクスプローラからVBS形式ファイル→アプリケーションから開く→プログラムの選択 によって何らかのプログラムを選択すればよいのかと思い、プログラムを探しておりますが適当なのが見つかりません。 この問題の経緯: 先ほどまではVBS形式ファイルをダブルクリックすると自動で実行できました。VBS形式ファイル編集時は右クリック→秀丸から開いておりました。 しかし、プログラム編集に没頭するあまり、右クリック→開くとしたところノートパッドで開かれたことから、秀丸が開いてほしいと思ってしまい、誤ってアプリケーションから開く→プログラムの選択→秀丸を選んでしまいVBS形式ファイルをダブルクリックすると自動で実行できなくなり、秀丸で開かれてしまうようになりました。 そこで: これを解消して以前のようにダブルクリック実行させたいです。 どうぞよろしくお願いします。

  • vbscriptを用いて他のVBSファイルを実行

    プログラム ---------------------------------------------------------------- option explicit dim objwshell set objwshell = createobject("wscript.shell") objwshell.run "ファイルのフルパス", 1, false set objwshell = nothing --------------------------------------------------------------- その「ファイルのフルパス」上に「notepad.exe」と入力するとメモ帳が起動するんですけど、他のファイル(vbs、jsなど)を指定するとエラーが出ます。 もしかしてこれは拡張子が「.exe」のファイルだけしか起動できないのでしょうか? ちなみに上のファイルを保存するときの拡張子は「.vbs」です。

  • DOSコマンドでVBSで取得した値をセットしたい

    DOSコマンドで VBSで取得した値をセットしたい サーバ上のあるフォルダにファイルが蓄積されています。 2011_07_01.csv 2011_07_02.csv 2011_07_05.csv 2011_08_05.csv 今月(8月)になった時点で、先月分(07月)で且つ_01.csv と_05.csvファイル を削除するコマンドを作ろうとしています。 先月を取得する部分をVBSにし、その値をセットしようとしましたが、セット方法が分かりません。 echo WScript.Echo Right("0" & Month(DateAdd("d",-15,Date)), 2)> C:\tmptest.vbs CALL C:\tmptest.vbs とするとメッセージボックスで'07'と出力されます。 イメージですが、この'07'を変数にセットして、 (SET AAA = C:\tmptest.vbsの出力結果 のような) フォルダ内で ????_%AAA%_01.csv ,????_%AAA%_05.csv にマッチすれば削除するとしたいのですが、 (FOR /R %%A IN (????_%AAA%_01.csv,????_%AAA%_05.csv) DO DEL %%A というかんじで) VBSで取得した値をセットする方法を教えてください。

  • VBSCRIPTでcmd命令(dir)を実行させて

    パスはcsvファイルで読みこんで、vbs上で Set Shell = CreateObject("WScript.Shell") Shell.Run "cmd /C ""dir \¥xxx\xxxxx\xxxxx" を実行させてアクセスできなかったパスがぞんざいするならエラーで返して続いて実行してほしいです。 それで最後にログにエラー情報を書く処理をおこないたいです。問題はcmdだとecho %errorlevel%これを使えば すぐにこげたことを1か0で返してくれますが vbs上でも可能ですか?

  • VBSでセキュリティ「中」のAccessをメッセージなしに開きたい

    AccessのテーブルにCSVのデータをインポートするVBSを作っていますが、そのVBSを実行するパソコンののAccessのセキュリティが「中」となっているため、実行時に「開くかどうか」を聞いてきます。 セキュリティレベルを「低」に変更できないため、VBSか、Accessファイルに修正をしなければいけないのですが、どうすればよいか、よくわかりません。 ちなみに、VBSのコーディングは以下のようになっています。 'アクセスオブジェクトセット Set objAccess = CreateObject("Access.Application") 'データベースオープン objAccess.OpenCurrentDatabase(strMdbName) 'データベースセット Set objDB = objAccess.CurrentDb 'インポート実行 objAccess.DoCmd.TransferText ,defFile,strTableName,strInFile,False 'データベースクローズ objAccess.CloseCurrentDatabase s = s & "CloseCurrentDatabase" & vbCrLf objRS.Close objDB.Close Set objRS = Nothing Set objDB = Nothing Set objAccess = Nothing どうか、助けてください。お願いします。

  • VBSについて

    いつもありがとうございます。 初歩的すぎる質問で申し訳ありません。 調べたらすぐわかると思うのですが、急ぎである為、調べるのと並行して質問させて頂きます。 現在VBSでスクリプトを作っているのですが、わからない点があります。 仕様としては他に処理がありますが、わからない箇所のみ記載させて頂きます。 ----------------------------------------------------------- // 変数セット strFile = "C:\test.dat" ' ファイルのパスを入力 // ファイルを実行 objShell.Run "notepad strFile", vbNormalFocus, False ----------------------------------------------------------- ↑上記にてノートパッドを起動して変数 "strFile" のファイルを開きたいです。 パスを直接指定すると上記方法でよかったと思うのですが この場合、どのように書けば動作するでしょうか。。 また、違う方法があればアドバイス頂きたいです。 教えて教えてで申し訳ありませんが、宜しくお願い致します。

  • エクセル VBA タイマー 0:00:00で

    5分ピッチで 仕事させます。 ブックオープンで インターバル = TimeValue("00:05:00") Application.OnTime Format(開始時刻, "hh:mm:ss"), "orgdata.必要な作業を行うマクロ", 待ち時間 Debug.Print "st" & 開始時刻 Call timer_set 反復時刻 = 開始時刻 If Format(反復時刻, "hh:mm:ss") > "23:54:00" Then 反復時刻 = Format(DateAdd("d", 1, 反復時刻), "yyyy/mm/dd") & " " & TimeValue("0:00:10") Else 反復時刻 = Format(反復時刻, "yyyy/mm/dd") & " " & TimeValue(反復時刻) + インターバル End If ループで5回ほど Application.OnTime Format(反復時刻, "hh:mm:ss"), "orgdata.必要な作業を行うマクロ", 待ち時間 Debug.Print "loopexit" & 反復時刻 で、デバッグアウトが end 2013/08/15 3:02:00 st 2013/08/14 23:50:10 loop2013/08/14 23:55:10 loop2013/08/15 00:00:10 loop2013/08/15 00:05:10 loop2013/08/15 00:10:10 loopexit2013/08/15 00:15:10 makuro 2013/08/15 00:20:10 makuro 2013/08/15 00:25:10 makuro 2013/08/15 00:30:10 で、「必要な作業を行うマクロ」 で 仕事のあと タイマー追加します。 If Format(反復時刻, "hh:mm:ss") > "23:54:00" Then 反復時刻 = Format(DateAdd("d", 1, 反復時刻), "yyyy/mm/dd") & " " & TimeValue("0:00:10") Else 反復時刻 = Format(反復時刻, "yyyy/mm/dd") & " " & TimeValue(反復時刻) + インターバル ' End If Application.OnTime Format(反復時刻, "hh:mm:ss"), "必要な作業を行うマクロ", 待ち時間 (反復時刻を 時間だけの時 formatを 入れて・・・) Debug.Print "makuro " & 反復時刻 ’これが デバッグで出力されています。 で、ダミーの作業が clup = clup + 1 orgdata.Cells(clup, 10) = Format(Now, "yyyy/mm/dd") orgdata.Cells(clup, 11) = Format(Now, "hh:mm:ss") orgdata.Cells(clup, 12) = Format(反復時刻, "yyyy/mm/dd") orgdata.Cells(clup, 13) = Format(反復時刻, "hh:mm:ss") 結果 2013/8/14 23:50:10 2013/8/15 0:20:10 2013/8/14 23:55:10 2013/8/15 0:25:10 2013/8/15 0:00:10 2013/8/15 0:30:10 これで、タイマー作業が 途切れます。 0:00:00 超える事に 問題があるなら 0:00:10 は 実行されないハズ・・・・ 反復時刻は yyyy/mm/dd & ” ” & ”hh:mm:ss” です。 試しに 時刻だけでやっても 同じでした。 さて、如何でしょ? 実は これで、動いていたのですが、3日ほど前から 0:00以降 突然タイマーが動かなくなったのです PCは 3台 同じ現象です よって WINの設定では無い・ エクセル オプションに 何か設定でもあるのか?? どうも VBAのタイマーは不可解で エクセル終了させず、 プログラムだけ終了、再ロードだと、前のタイマー残ったまま、ダブルでタイマー動くとか・・・・ それと、WIN32とかの 別のタイマー使った方が 良いのでしょうか??

  • win7でvbsファイルが実行できない

    以下のようなvbsファイルを実行してデータ取り込みをしていますが、 win7にPCを替えたら実行できなくなりました。 エラーは4行目なのですが、原因がわかりません。 どなたか教えていただけないでしょうか? sPath = "\\snysv○○\○○部\○○DIV\○○書データ\_ ○○データ入力用\○○データ.mdb"'実行するファイルのパスを指定 Set oApp = CreateObject("Access.Application") oApp.visible = FALSE oApp.OpenCurrentDatabase sPath 'ここでエラーになるようです。 oApp.Run "データ取込" 'プロシージャを実行します。 oApp.Quit : Set oApp = Nothing Const OverwriteExisting = True Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.CopyFile "\\snysv○○\○○部\○○DIV\○○書データ\○○書データ入力用\*.xls" , "\\snysv○○\○○部\○○DIV\○○書データ\○○書データ入力用\取込済データ\", OverwriteExisting objFSO.DeleteFile "\\snysv○○\○○部\○○DIV\○○書データ\○○書データ入力用\*.xls" Set FSO = Nothing