【Excel VBA】TimeValue関数の使い方!型が一致しない場合の対処法も!

【Excel VBA】TimeValue関数の使い方!型が一致しない場合の対処法も!
Excel VBAで「9:30」のような時刻の文字列を、時刻データに変換したいときはないでしょうか。

けど、そんな中で悩むことは、

・TimeValue関数の書き方と戻り値のイメージがわかない
・「型が一致しません」というエラーが出て先に進めない
・セルによって時刻だったり文字列だったりして、どう扱えばいいかわからない

ですよね。

今回はそんなお悩みを解決する

・Excel VBAのTimeValue関数の使い方(型が一致しない場合の対処法つき)

についてまとめます!

完成イメージ

勤務時間表の「開始」が、文字列や全角で入力されていると、VBAでうまく扱えず「型が一致しません」というエラーになってしまいます。
今回は
・TimeValue関数で「文字列の時刻」を時刻データに変換する方法
をゴールにします。
あわせて、時刻が「0〜1の小数」で保存されるしくみと、数値でも文字列でも安全に変換する書き方も身につきます。

完成イメージ
上の画像が完成形です。開始・終了の時刻がそろい、経過時間と人件費まで自動で計算されます。

なお、24時を超えると0時に戻ってしまう表示の問題([h]:mm)や、うまくいかないときの対処法(トラブルシュート)もあわせてご紹介します。

STEP1. 勤務時間表を用意する

まずはサンプルの勤務時間表を用意します。
A列が開始、B列が終了、C列が経過時間、D列が時給、E列が人件費です。
経過時間(C列)は =B2-A2、人件費(E列)は =C2*24*D2 という数式にしています。
時刻に24を掛けると、時間数に換算できます。
ここでひとつポイントです。
この表は上の7行は正しい時刻で入力できていますが、下の3行(9〜11行目)は入力のしかたが違います。
9行目は「9:30」という文字列、10行目は全角コロンの「9:30」、11行目は「9時30分」という文字列です。
文字列のセルは左詰めになっているので、見た目でも見分けられます。
このあと、こうしたバラバラな入力をTimeValue関数で整えていきましょう。
サンプルの勤務時間表

下の表をコピーして、Excelのシートに貼り付けるとそのまま試せます。

開始 終了 経過時間 時給 人件費
9:00 17:30 1200
8:30 12:00 1100
9:15 18:00 1250
10:00 19:30 1300
13:00 18:45 1150
9:00 13:30 1200
8:45 17:15 1050
17:30 1200
18:00 1250
19:00 1300

※ 数式で求める列は空にしています。すでに値が入っている列はそのまま残して試せます。

STEP2. TimeValue関数の基本を確認する

TimeValue関数は、時刻を表す文字列を、Excelが扱える時刻データに変換する関数です。
実際に見てみましょう。
セルに次の式を入力します。

=TIMEVALUE("9:30")

すると結果は 0.395833… という小数になります。
「9:30」という文字列が、見慣れない小数に変わって少し驚きますね。
でもこれが、Excelが時刻を扱っている正体です。
実際の入力画面がこちらです。

POINT

TimeValue関数の引数は「文字列」です。
セルの値がすでに時刻(数値)のときに渡すと、逆に型が一致しませんというエラーになります。
「文字列 → 時刻」と覚えておきましょう。

TimeValue関数の入力画面

STEP3. 時刻は「0〜1の小数」だと知っておこう

Excelの時刻は、0から1までの小数で保存されています。
これは1日を「1」とした割合だからです。
つまり「0.5」は半日(12時間)、「0.25」は6時間を表します。
先ほどの 0.395833… は、9時30分が1日の中でどのくらいの位置かを表していたわけです。
上の画像の右の列を見てください。
時刻に24を掛けると、9.5(=9時間30分)という時間数になりました。
時刻に24を掛けると「時間数」に変わる、と覚えておくと計算がぐっとラクになります。
このしくみがわかると、人件費の =C2*24*D2 の意味も見えてきますね。
時刻は0〜1の小数

STEP4. 「型が一致しない」の原因と対処

VBAやワークシート関数でTimeValueを使うと、「型が一致しません」というエラーになることがあります。
原因は、渡した値の「型」が文字列ではなかったことです。
よくある例と対処を、実際の結果とあわせて確認してみましょう。
上の画像は、左の値をそれぞれ TIMEVALUE(左の値) に入れた結果です。

セルの値 中身の種類 TIMEVALUE(値) 対処
9:30(時刻として入力) 数値(0〜1の小数) #VALUE! すでに時刻なのでそのまま使う/CDateで受け取る
“9:30″(文字列) 文字列 0.395833 そのままTimeValueで変換できる
“9:30″(全角コロン) 文字列 0.395833 半角と見分けにくい。半角に統一しておくと安心
“9時30分” 文字列 0.395833 これも変換可。ただし表記をそろえたい
” 9:30 “(余分な空白) 文字列 0.395833 Trimで前後の空白を落とす
“abc”(時刻でない) 文字列 #VALUE! 元データを直す(変換では直せない)

意外に感じるかもしれませんが、全角コロン・「9時30分」・余分な空白は、TimeValueが自動で解釈してくれます。
ただし、こうした表記が混ざっていると、あとで並べ替えや比較がしにくくなるので、そろえておくのがおすすめです。
そして、いちばん大きな原因は「セルの値がすでに数値(時刻)になっている」ことです。
見た目が「9:30」でも、中身は 0.395833… という数値のことがあります。
VBAのTimeValueは文字列を受け取る関数なので、数値を渡すと「型が一致しません(実行時エラー13)」になります。
型が一致しない例

STEP5. 数値でも文字列でも安全に変換する

セルによって数値だったり文字列だったりする場合は、型を判定してから変換すると安全です。
次の式がその一例です。

=IF(ISNUMBER(G2), G2, TIMEVALUE(G2))

ISNUMBER関数は「数値かどうか」を判定します。
数値ならそのまま使い、文字列ならTimeValueで変換する、という流れです。
上の画像の「対処の式」の列が、この式の結果です。
数値の行も文字列の行も、どちらも 9:30 にそろいました。
ただし、“abc”のような時刻でない文字列は、この式でも直せません。
その場合は元データを直しましょう。
実際の入力画面がこちらです。

POINT

迷ったら「型を確認してから変換」が合言葉です。
ISNUMBERで数値かどうかを確かめ、数値ならそのまま、文字列ならTIMEVALUEで変換します。
これだけで「型が一致しません」のほとんどを避けられます。

型を判定してから変換する式

STEP6. 時刻の差を求める・24時を超えると0時に戻る問題

経過時間は =B2-A2 のように引き算で求めます。
このとき、セルの表示形式を [h]:mm にしておくのがポイントです。
上の画像の合計を見てください。
合計が 3:00 と表示されている行(h:mm)と、75:00 と表示されている行([h]:mm)があります。
同じ数式なのに、結果がまったく違いますね。
これは、h:mm の書式だと24時間で0時に戻ってしまうためです。
勤務時間のように24時間を超える集計では、[h]:mm を選んでください。
角かっこの [h] は「時間を24で区切らずにそのまま表示する」という意味です。
実際の勤務時間は合計75時間なので、[h]:mm のほうが正しい表示です。
表示形式を変えるには、セルを選択して右クリック →セルの書式設定→ユーザー定義で [h]:mm と入力します。
24時を超えると0時に戻る例

TimeValue・TimeSerial・CDateの使い分け

ここまでで時刻の扱いに慣れてきたところで、似た働きのものを整理しておきましょう。
どれも「時刻を作る」ものですが、受け取れる型が違います。

書き方 使う場面 受け取る型 注意
TimeValue(“9:30”) 文字列の時刻を変換する 文字列 数値(時刻)を渡すと型が一致しない
TimeSerial(9,30,0) 時・分・秒から時刻を作る 数値 VBA専用。分・秒は60以上でも自動で繰り上がる
CDate(値) 数値でも文字列でも受け取りたい どちらも可 VBA専用。ワークシートには無い
=B2-A2(引き算) すでに時刻同士の差を求める 時刻(数値) 表示形式を[h]:mmにする

ワークシートでは、TIMEVALUE と TIME、そして引き算を覚えておけば十分です。
上の画像は、それぞれの書き方と結果を並べたものです。
どの書き方でも 0.395833 になっているのが確認できますね。
一方で TimeSerial と CDate は、VBAの中で使う関数です。
ワークシートにはありませんので、混同しないようにしましょう。

POINT

迷ったらCDateが便利です。
数値でも文字列でも受け取れるので、「型が一致しない」で悩みにくくなります。
とはいえ、そもそも時刻でない文字列(”abc”など)はどのやり方でもエラーになるので、元データを直しましょう。

TimeValue・TIME・引き算の結果

VBAで勤務時間表を一括変換する

最後に、文字列や全角で入った開始時刻を、VBAでまとめて変換してみましょう。
Alt+F11でVBAエディターを開き、標準モジュールに次のコードを貼り付けます。

Sub FixStartTimes()
    Dim r As Long
    For r = 2 To 11
        With Cells(r, 1)
            If IsNumeric(.Value) Then
                .Value = CDate(.Value)
            Else
                .Value = TimeValue(Trim(.Value))
            End If
            .NumberFormat = "h:mm"
        End With
    Next r
End Sub

実行すると、開始時刻の列(A列)がすべて正しい時刻に整います。
数値ならCDate、文字列ならTimeValueを使うので、型が一致しないエラーを避けられます。
ボタンに登録しておけば、クリック1つで毎回の変換ができるようになります。

タカヒロ

タカヒロ
ポイントは If IsNumeric(.Value) Then の判定です。
先に「数値かどうか」を確かめてから、CDateとTimeValueを使い分けています。
これで、セルによって型がバラバラでもエラーにならずに変換できますね。

うまくいかないときの対処法(トラブルシュート)

実際に試すと、思ったように動かないこともあるかもしれません。
よくあるつまずきと対処法をまとめました。

症状 原因 対処
型が一致しません(実行時エラー13)になる セルの値がすでに数値(時刻)なのにTimeValueに渡している CDateを使う/IsNumericで数値と文字列を分ける
合計が3:00のように小さくなる 合計が24時間を超え、h:mmで0時に戻っている 表示形式を[h]:mmに変更する
時刻に日付が混ざる(1900/1/1など) 日付と時刻が同じセルに入っている 時刻だけ欲しいならTimeValueやTimeSerialで取り出す
全角コロン「:」が混ざっている 半角と見分けにくく、データが混在しやすい Replaceで全角コロンを半角へ置き換える/入力規則でそろえる
変換したのに左詰めのまま 値が文字列のまま残っている 変換後に表示形式をh:mmにし、右詰め(=数値)になったか確認する

関数の説明

今回使う3つの概要です。
どれも時刻づくりでよく使うので、違いを押さえておきましょう。

TimeValue関数(タイムバリュー)

書式 =TIMEVALUE(時刻文字列) / TimeValue(時刻文字列)
できること 「9:30」のような文字列を、Excelが扱える時刻データ(0〜1の小数)に変換します。
戻り値 0以上1未満の小数(例:0.395833…)
こんなときに 文字列として入力された時刻を、時刻として計算に使いたいとき。
注意 引数は文字列です。すでに数値(時刻)のセルを渡すと型が一致しませんになります。
=TIMEVALUE("9:30")

TimeSerial関数(タイムシリアル)

書式 TimeSerial(時, 分, 秒)
できること 時・分・秒の数値から時刻を作ります。VBA専用の関数です。
戻り値 時刻(0〜1の小数)
こんなときに 「9時30分」のようにデータが分かれているときや、文字列を経由せず組み立てたいとき。
注意 分に60以上を渡しても自動で繰り上がります(例:TimeSerial(9,90,0)は10:30)。
TimeSerial(9, 30, 0)  ' 9:30

CDate関数(シーデート)

書式 CDate(値)
できること 数値でも文字列でも、日付・時刻データに変換します。VBA専用の関数です。
戻り値 日付・時刻
こんなときに セルの型が数値か文字列か分からないとき。「型が一致しない」を避けたいときに便利です。
注意 ワークシートには無く、VBAで使う関数です。時刻でない文字列はエラーになります。
CDate(Range("A1").Value)

完成

開始時刻がすべて正しい時刻にそろい、経過時間と人件費まで自動で計算できました。
思ったとおりに動きましたか?
文字列や全角で入っていた時刻も、TimeValueとCDateを使い分ければきれいに整います。
右詰め(緑のセル)になっていれば、数値の時刻に変換できている証拠です。
あとは毎回の作業としてボタンに登録しておけば、入力のゆれに悩まされなくなります。
完成した勤務時間表

さいごに

いかがでしょうか。

今回は、

・Excel VBAのTimeValue関数の使い方(型が一致しない場合の対処法)

についてまとめました。

TimeValueは「文字列 → 時刻」に変換する関数です。
すでに数値になっているセルにはCDateを使う、と覚えておけばエラーを避けられます。
まずは今回のサンプル表で、ぜひ一度試してみてください。
時刻のしくみ(0〜1の小数)がわかると、勤務時間や残業時間の集計がぐっとラクになります。
また、他にも便利なExcelの時短テクニックがありますので、よろしければご参照頂ければと思います。

ぜひ試してみてください。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。






コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA ImageChange Image