見出し画像

Excel VBAで戸惑った時刻の表記法

1. はじめに

 便利ツールの作成には、Excel VBAが重宝する。例えば、「ログからデータを収集してグラフに表示する」という話は、非常に得意である。この時、時刻の取り扱いにおいて不可解な事象に遭遇したので、その話をまとめる。

2. Excelの時刻表示

 ことの発端は、ログに書かれている時刻をセルにコピーする際に発生した。下記にイメージのプログラムを示す。

Sub Test()
    Dim dateStr As String
    dateStr = "10:50:11.333"
    
    Range("A1").Value = dateStr
End Sub

 このプログラムは、dateStr変数に時分秒ミリを代入し、A1セルに設定するプログラムである。なお、セルの書式設定をh:mm:ss.000としている。

セルの書式設定

 このプログラムを実行すると、A1セルには10:50:11.333と表示される。実行結果には何の問題もなさそうに見える。

プログラムの実行結果

 しかし、中身を確認すると、「.333」が抜けている。

実行結果

 そのため、セルを選択してエンターを押すと、ミリ秒が消えてしまう。

ミリ秒が抜け落ちた様子(.000に置き換わる)

3. 原因はExcelの書式にある?

 筆者は解決方法がわからず、ChatGptで原因を尋ねると、下記の回答があった。

Excelは、日付と時刻をシリアル値で管理しており、その形式では直接ミリ秒を扱うことはできない。結果、セルに「2024/5/19 10:50:11.333」という文字列を入力しても、内部的にはミリ秒を除いた形で保存する。したがって、セルの書式設定にミリ秒(h:mm:ss:000)を含めても、Excelはミリ秒を表示できないため、000と表示する。

ChatGptの回答の要約

 恐らく、ミリ秒を除くどこかの基準の時刻を1としてそれを加算しているようだ。よって、セルの書式設定のユーザ定義にミリ秒を含む形式を設定しても、無視される。

4. 解決策

 解決策は、セルのフォーマットを文字列に設定する。

Sub Test()
    Dim dateStr As String
    dateStr = "10:50:11.333"
    
    '書式を文字列に設定する
    Range("A1").NumberFormat = "@"
    Range("A1").Value = dateStr
End Sub

 上記は、A1セルのフォーマットを文字列に設定し、時刻を設定している。この時の実行結果は下記に示す通り、ミリ秒まで記載されている。

 ミリ秒を含む時刻をセルに代入するには、フォーマットを文字列に設定してから代入する必要がある。

5. おわりに

 今回は、Excel VBAで時刻をセルに代入する場合、ミリ秒が消え、戸惑ってしまった話を取り上げた。VBAで時刻を扱う場合には、注意してほしい。

この記事が気に入ったらサポートをしてみませんか?