• ベストアンサー

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

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
  • ベストアンサー率65% (1633/2477)
回答No.7

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

qhtsige
質問者

お礼

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

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

その他の回答 (6)

  • SI299792
  • ベストアンサー率48% (720/1491)
回答No.6

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

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

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

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1633/2477)
回答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
  • ベストアンサー率65% (1633/2477)
回答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
  • ベストアンサー率65% (1633/2477)
回答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
  • ベストアンサー率65% (1633/2477)
回答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

  • 時間をvbaでセルに1:00と入力する場合

    セルにvbaで時間として、1:00と入れたいのですが、 Range("A2") = #1:00# とすると、自動で Range("A2") = #1:00:00 AM# になってしまい、実際にセルにも「1:00:00 AM」と入力されてしまいます。 そもそもvba上で時間をコードとして打つ場合は、#で囲うでいいんですよね? 時間をvbaでセルに1:00と入力する場合は、どうすればいいですか?

  • 【VBA】ハイパーリンクでセルに文字を正しく表示できない。

    【VBA】ハイパーリンクでセルに文字を正しく表示できない。 ハイパーリンクを設定しセルに数値を表示させる場合、 セルにもともと文字が入力されていれば、数値に置き換わります(a)が、 もともと入力されているのが数値の場合、別の数値に置き換わりません(b)。 例) (a)A1セルに「十」という漢字が入力されていたとします。   その時、下記コードを実行すればA1セルの値は「1」に変わります。   Sub test()    ActiveSheet.Hyperlinks.Add _    Anchor:=Range("A1"), _    Address:="http://www.yahoo.co.jp/", _    TextToDisplay:="1"   End Sub (b)一方、A1セルに「10」という数値が入力されていたとします。   その時、上記コードを実行してもA1のセルの値は「10」のままです。 なぜなのでしょうか? お分かりの方、教えてください。 尚、当方Excel2003を使用しております。 よろしくお願いします。

  • もっとA1にtestといれるVBAコードがあるはず

    教えて下さい。VBAです。 Sub test1() Range("a1").Value = "test" End Sub Sub test2() Cells(1, 1) = "test" End Sub 以外にも「セルA1にtestを入れる」というコードの書き方がいくつかあったと思うのですが 思い出せません。 教えていただけないでしょうか。 よろしくお願い致します。

  • IF文の作り方

    エクセル VBA 超入門のものなんですけど、質問させてください。 A1のセルに 1を入力したら、セルD1に正解を表示させ、 それ以外なら不正解を表示させたいのですが、  以下の文でつくると 実行した最初しか起動してないような気がするのですが、教えてください。どうすればセルA1を入力するたびに、 正解、不正解をD1に表示させれるでしょうか? Sub テスト() If Range("A1") = "1" Then Range("D1").Value = "正解" Else Range("D1").Value = "不正解" End If End Sub

  • VBAコードでイミディエイトウィンドウを表示する方

    VBAコードでイミディエイトウィンドウを表示する方法はありますか? 例えば、 Sub test() Debug.Print Now End Sub を実行したときに イミディエイトウィンドウが表示されていなければ結果がわかりませんよね。 Ctrl+Gでイミディエイトウィンドウを表示出来る事は知っていますが サブプロシージャーと実行とともに、 イミディエイトウィンドウをVBAで表示する方法を教えてください。 Sub test() Debug.Print Now イミディエイトウィンドウを表示 End Sub のようにしたいです。 ご回答よろしくお願いします。

  • VBAでセル記入禁止

    たとえば、"A1"に1を記入した場合、B1を記入不可にできるような、VBAのコードがあれば教えて欲しいです。 sub 記入不可() if range("A1").value = "A1" then B1のセルが記入できないコード end if end sub です。 よろしくお願い致します。

  • VBAのGotoについて

    VBA実行後A1セルにカーソルを移動するため Application.Goto Range("A1") End Sub という方法と Application.Goto Reference:=Range("A1") End Sub という方法があると思うのですがどのような違いがあるのですか? 機能的には全く同じだと思うので処理的な違いですか? またその他にも同様の動作をさせるコマンドはありますか? よろしくお願いします。

  • excelvbaで表示の時刻について

    今下記のコードを教えていただき、時計(デジタル)表示ができて時刻を刻んでいます。 sub test01() with sheets("sheet1").range("g5") .value=time .numberformatlocal="h:mm:ss" end with application.ontime now + timevalue("0:00:01"),"test01" end sub このコードに、次のような動作が追加できますか。 同じシートのセルA1:A5に、例えばA1に10:05:00、A2に12:10:30というように指定しておき その時刻になったら、メッセージを「時間が来ました」等表示し、ビープ音を2回鳴らす、30秒間表示 を継続した後、また時刻を刻む表示に戻る。 というような動作はできませんか。 どなたか教えていただけませんか。かなりの基礎知識がないとできないでしょうか。

  • Excel VBA時計がずれる理由

    Excel Office 2021 Windows11 Excelの特定セルに1秒ごとに時計をきざむVBAコードをインターネット上で探して標準モジュールに組み込みましたが、time.is/jaのサイトの表示時刻と60秒以上ずれて表示されました そこでBing AIに"D1"セルに時刻表示をするコードを書かせ(下記)、ボタンにVBAをセットし押してスタートしましたが、時刻表示はされるもののやはり75秒ほどずれて(遅れて)表示されます。 Sub DisplayCurrentTime() Range("D1").Value = Time Application.OnTime Now + TimeValue("00:00:01"), "DisplayCurrentTime" End Sub この理由は何なのでしょうか? なにかExcel VBAの仕様が変わったとかありますでしょうか?

  • ActiveX コントロールでのセル選択

    Excel VBA独学中の初心者です。 目的:ActiveX コマンドボタンをクリックして他のSheetのセルを選択する 環境例:シートが2個(Sheet1、Sheet2) Sheet2にActiveXコントロールのコマンドボタンを置く 【プログラム1】:コマンドボタンには次のようなVBAコードを記述 ---------------- Private Sub 別シートセル選択_Click() Worksheets(1).Activate Range("A5").Select End Sub ---------------- 結果:この時次のようなエラーが出ました。 '実行時エラー'1004 'アプリケーション定義またはオブジェクト定義のエラーです。 -------------------------------- -------------------------------- 【プログラム2】:コマンドボタンには次のようなVBAコードを記述 ---------------- Private Sub 別シートセル選択_Click() Worksheets(1).Activate Worksheets(1).Range("A5").Select End Sub ---------------- 結果:OK ---------------- ---------------- ところが次の【比較1】【比較2】の場合、「Range("A5").Select」だけでOKでした。 ---------------- 【比較1】 コントロールの存在するSheetのセルを選択する場合は「Range("A5").Select」だけでOKでした。 ---------------- 【比較2】 Subマクロで記述する場合も「Range("A5").Select」だけでOKでした。 プログラムは以下 -------- Sub セル選択() Worksheets(1).Activate Range("A5").Select End Sub ---------------- 【質問】 ActiveX コントロールを置いているSheetとは別のSheetのセルを選択する時は、選択しようとするセルの「Sheet名」から記述しなければならないのでしょうか。 「Range("A5").Select」だけでOKだった【比較1】【比較2】との違いを教えていただきたくお分かりの方宜しくお願いします。 (用語の使い方に誤りがありましたらすみません。)