• ベストアンサー

時間値の表示が期待とおりにならない

excelのVBAです。 下記のコード1ではセルA1に実行結果のように表示されますが、 コード2では期待した表示になりません。 これは何故でしょうか。期待した表示は 163001 です。 コード1 Sub TimerProc() Range("A1") = Time() End Sub 実行結果 4:30:01 PM コード2 Sub TimerProc() Range("A1") = Format(Time(), "hhmmss") End Sub 実行結果 12:00:00 AM セルの式は 2346/1/3 0:00:00

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1729/2599)
回答No.7

> hhmmssでは時間とみなさないということなのですね。 念のため、後から読んだ人が勘違いしないように付け加えさせてください。 時間のデータを表示形式(NumberFormatLocal)でhhmmss指定したものは、見た目がhhmmssになっているだけですので、セルの値は時間として認識されます。 Formatで時間のデータをhhmmss指定したものは、hhmmssを利用した文字列にデータが変換されますから、データは時間としては認識されません。

qhtsige
質問者

お礼

わかりました(本当か?) やはりセルの書式の問題なのですね。 時間はシリアル値であることは一応承知していましたが、時間データの扱いはいろんなケースがあって正確に理解処理するのは難しいです。結局対症療法的なってしまいます。

その他の回答 (6)

  • SI299792
  • ベストアンサー率47% (775/1622)
回答No.6

コード1 を実行して、表示形式が時刻になっているからです。 新規のワークブックでコード1 を実行せずに実行、又は表示形式を標準に戻してから実行すれば、期待通りになります。 又はプログラムで表示形式を標準にします。 ' Sub TimerProc2() ' [A1] = Format(Time, "hhmmss") [A1].NumberFormatLocal = "G/標準" End Sub

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

質問に置いて、セルA1の表示形式・書式の文字列などを明らかにして、質問しないと質問にならないのでは。 Sub TimerProc() Range("A1") = Time() MsgBox Range("a1").NumberFormat End Sub の(現在設定されている)書式を確認して、その式(文字列)h:mm:ss AM/㏘を見て考えてみないと、2つの例で違うと言っても、一方(後者)は、自分でVBAで設定したもの。(これは正しく効果が出るでしょう) 前者は、後者のVBA実行前に設定してあるもので、両社が違うことはあり得ることではない?

  • kkkkkm
  • ベストアンサー率66% (1729/2599)
回答No.4

Timeは時刻ですので日時でしたらNowを利用します。 VBA Now 関数:現在の日時を取得する https://www.tipsfound.com/vba/05now 年は4桁ですのでyyyyとしてください。 Range("A1").NumberFormatLocal = "yymmdd hhmmss" Range("A1") = Format(Now, "yyyy/mm/dd hh:mm:dd") 先に表示形式を指定してますのでFormatせずに Range("A1") = Now で大丈夫だと思います。 先の回答で Range("A1") = Format(Time(), "hh:mm:ss") とFormat利用したコードを示したのはある意味手抜きでした。

  • kkkkkm
  • ベストアンサー率66% (1729/2599)
回答No.3

No.2の訂正です > Format(Time(), "hh:mm:ss") > のあとででも > Range("A1").NumberFormatLocal = "hhmmss" > としてください。 コードの順番を間違えました Range("A1").NumberFormatLocal = "hhmmss" のあとででも Range("A1") = Format(Time(), "hh:mm:ss") としてください。 元の表示形式が何か不明なので、代入前に時間の表示設定にしておいた方が無難です。

  • kkkkkm
  • ベストアンサー率66% (1729/2599)
回答No.2

No.1の追加です 忘れてました > 期待した表示は 163001 です。 Format(Time(), "hh:mm:ss") のあとででも Range("A1").NumberFormatLocal = "hhmmss" としてください。

qhtsige
質問者

お礼

ご返事ありがとうございます。 hhmmssでは時間とみなさないということなのですね。 NumberFormatLocal を使えばできました。また、このEXCELセルをCSVファイルに変換しても、期待通りの数値が確認できました。 NumberFormatLocal の機能を確認すると、日付を同様に変換できそうなので、 Range("A1") = Format(Time, "yy/mm/dd hh:mm:ss") Range("A1").NumberFormatLocal = "yymmdd hhmmss" としたところ、表示は 99/12/30 18.39.15 となり、日付は変換できませんでした。

  • kkkkkm
  • ベストアンサー率66% (1729/2599)
回答No.1

Format関数は、指定した書式に変換した「文字列」を返しますから Format(Time(), "hhmmss") は「hhmmss」がそのまま文字(数字)としてセルに代入されます 表示形式が「ユーザー定義h:mm:ss AM/PM」になっていると思いますから、その数字は数値とみなされ時間に換算されて質問のような表示になっています。文字の数字はそのままの数値として日時を示すシリアル値という値として扱われます。 たとえば上記の式だと、17時25分16秒でしたら数字の172516となってセルに代入されます。 Format(Time(), "hh:mm:ss") や Format(Time(), "h:mm:ss AM/PM") などとすればエクセルが時間として処理してくれます。 シリアル値については以下のサイトを参考にしてください。 日付と時刻はシリアル値で出来ている!! 上手に付き合えばExcelの真の力が見えてくる!! https://tsurutoro.com/serial-value/#gsc.tab=0

関連するQ&A