Excel VBAで「9:30」のような時刻の文字列を、時刻データに変換したいときはないでしょうか。
けど、そんな中で悩むことは、
・「型が一致しません」というエラーが出て先に進めない
・セルによって時刻だったり文字列だったりして、どう扱えばいいかわからない
ですよね。
今回はそんなお悩みを解決する
についてまとめます!
完成イメージ
勤務時間表の「開始」が、文字列や全角で入力されていると、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が時刻を扱っている正体です。
実際の入力画面がこちらです。
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 の意味も見えてきますね。

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”のような時刻でない文字列は、この式でも直せません。
その場合は元データを直しましょう。
実際の入力画面がこちらです。
迷ったら「型を確認してから変換」が合言葉です。
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 と入力します。

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の中で使う関数です。
ワークシートにはありませんので、混同しないようにしましょう。
迷ったらCDateが便利です。
数値でも文字列でも受け取れるので、「型が一致しない」で悩みにくくなります。
とはいえ、そもそも時刻でない文字列(”abc”など)はどのやり方でもエラーになるので、元データを直しましょう。
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つで毎回の変換ができるようになります。
先に「数値かどうか」を確かめてから、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を使い分ければきれいに整います。
右詰め(緑のセル)になっていれば、数値の時刻に変換できている証拠です。
あとは毎回の作業としてボタンに登録しておけば、入力のゆれに悩まされなくなります。

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














コメントを残す