はじめに
Excel VBA を使用してデータを処理する際、時刻情報の取り扱いが重要になります。特に、国際的なデータを扱う場合、協定世界時(UTC)を日本標準時(JST)に変換する処理が必要になることが多いです。本記事では、VBAでUTCからJSTに変換するユーザー定義関数(UDF)を作成し、その使い方や注意点を詳しく解説します。
UTCとJSTの基本
協定世界時(UTC)とは?
協定世界時(UTC: Coordinated Universal Time)は、世界の標準時として使用されており、経度0度のグリニッジ標準時(GMT)を基準とした時刻です。
日本標準時(JST)とは?
日本標準時(JST: Japan Standard Time)は、日本で用いられている標準時で、UTC+9時間の時差があります。つまり、UTCの時刻に9時間を加えることでJSTに変換できます。
VBAによるUTCからJSTへの変換関数
VBAでは、Date 型や時間関連の関数を使用して時刻の変換を行えます。以下に、UTCをJSTに変換するユーザー定義関数を紹介します。
ユーザー定義関数のコード
Function UTCtoJST(ByVal utcString As String) As Variant
Dim datePart As String, timePart As String
Dim utcDate As Date
' 入力形式チェック
If Not utcString Like "####-##-##T##:##:##Z" Then
UTCtoJST = CVErr(xlErrValue) ' #VALUE! エラーを返す
Exit Function
End If
' "T"と"Z"を除去して日付と時刻を分割
On Error Resume Next
datePart = Split(utcString, "T")(0)
timePart = Left(Split(utcString, "T")(1), 8)
' 日付と時刻を結合し、Date型に変換
utcDate = CDate(datePart & " " & timePart)
If Err.Number <> 0 Then
UTCtoJST = CVErr(xlErrNum) ' #NUM! エラーを返す
Exit Function
End If
On Error GoTo 0
' JST(UTC+9時間)に変換
UTCtoJST = utcDate + TimeValue("9:00:00")
End Function
この関数の動作
2006-12-30T10:35:00Z
を入力すると2006/12/30 19:35:00
(JST)に変換されます。- 書式が不正(
2023-03-15 12:00:00Z
やabcd-ef-ghTij:kl:mnZ
)の場合、#VALUE!
エラーを返します。 - 日付が正しく解釈できない場合 (
2023-02-30T10:00:00Z
など)、#NUM!
エラーを返します。
この関数をExcelのセルで =UTCtoJST(A1)
のように使用できます。
ユーザー定義関数の使用方法
Excelのセルで使用
- ExcelのVBAエディタ(Alt + F11)を開く。
- 標準モジュール(Module)を追加し、上記のコードを貼り付け。
- Excelのセルで次のように入力。
=UTCtoJST(A1)
A1にUTC時刻が入力されている場合、JSTに変換された値が表示されます。
VBAコード内で使用
Dim result As Variant
result = UTCtoJST("2006-12-30T10:35:00Z")
Debug.Print result ' 2006/12/30 19:35:00 と表示される
直接文字列を入力する場合は =UTCtoJST("2006-12-30T10:35:00Z")
のようにダブルクォーテーションで囲む必要があります。
エラー処理
- 不正な入力の場合
#VALUE!
→ 書式が間違っている (2023-03-15 12:00:00Z
など)#NUM!
→ 存在しない日付 (2023-02-30T10:00:00Z
など)
- エラーが出た場合の対応
=IFERROR(UTCtoJST(A1), "エラー")
のようにIFERROR
を使うと、エラー時に別の値を表示可能
注意点
正しいモジュールの選択
ユーザー定義関数(UDF)を ワークシートのセルで使用する場合は、標準モジュールに保存する必要があります。
標準モジュール(Module1, Module2…)
📌 標準モジュールなら、全シート・他のVBAコードでも使用可能。
VBAProject
内の標準モジュール(Module1 など)
に保存すると、どのシートからも=UTCtoJST(A1)
のように関数を直接使える。- 手順:
- VBAエディタ(
Alt + F11
)を開く 挿入
→標準モジュール
を選択- 生成された
Module1
にコードを貼り付ける
- VBAエディタ(
シートモジュール(Sheet1, Sheet2…)
Sheet1
などのシートオブジェクトのコード内に関数を記述すると、そのシート内でしか機能しない。=UTCtoJST(A1)
を他のシートで使えないので非推奨。
ThisWorkbook モジュール
ThisWorkbook
に保存すると ワークシート関数としては認識されない。- 他のマクロからは呼び出せるが、ワークシートのセルに
=UTCtoJST(A1)
と入力しても動作しない。
クラスモジュール
- ユーザー定義関数(UDF)としては不適切。クラスモジュールはオブジェクトの定義に使うため、ワークシートでの関数利用には向かない。
マクロ有効ブックとして保存
ユーザー定義関数(UDF)を含むExcelファイルは、**「Excel マクロ有効ブック(.xlsm)」または「Excelアドイン(.xlam)」**として保存する必要があります。
通常の .xlsx 形式ではVBAが保存されず、関数が動作しません。
計算速度・制限
- 大量のデータを処理すると遅くなる可能性
VBAのユーザー定義関数(UDF)はネイティブ関数(標準のExcel関数)より遅いため、大量のデータに適用するとパフォーマンスが低下することがあります。 - Excelの関数で代用可能ならそちらを使う
VBAを使わずにJSTに変換可能。(ただし、形式チェックが甘くなる)

関数が更新されない場合
VBAのユーザー定義関数(UDF)は通常のExcel関数と異なり、手動再計算が必要な場合があります。F9
キーを押して再計算Ctrl + Alt + F9
で全セルを強制再計算Application.Volatile
をVBA内で使用すると、自動再計算が可能(ただし計算が増え処理が重くなる)
まとめ
UTCは世界標準時刻で、日本標準時(JST)はUTC+9時間。
ユーザー定義関数(UDF)を使用するメリット
- VBAのユーザー定義関数を作成することで、Excelで簡単に時刻変換が可能。
- セル関数やVBAコード内で関数を活用できる。
- エラー処理を細かくコントロールできる。
注意が必要な事項
- ユーザー定義関数(UDF)は標準モジュールに保存すること。
- .xlsm または .xlam で保存すること(マクロを有効にする必要がある)。
- 大量データには注意(Excel関数で代用できるならそちらを検討)
- 手動再計算が必要な場合がある (
F9
,Ctrl + Alt + F9
)
Excel VBAで時刻を正しく管理し、データ処理をよりスムーズに進めましょう!
コメント