文字列型から日付型(時間型)に代入する際、暗黙的な変換により意図せぬ変換が行われることで結果に差が出ているものと思います。
ttyp03さんの説明にもありますが、
"13:12:00"という値をセルに入力する際、セルの書式が「文字列」になっていればは"13:12:00"という文字列の値が取得できます。
しかしセルの書式が「日付」や「時間」であったり、「標準」のまま入力した場合はシリアル値0.55が取得されます。
このセルの値を引数としてChangeTime関数を使用した場合、
13:12:00のセルからは、0.55というシリアル値を"0.55"という文字列として受け取ることになります。
"0.55"という文字列を暗黙的に日付型に変換した結果が"00:55:00"となります。
13:12:01はのセルでは、0.550011574074074というシリアル値を"0.550011574074074""という文字列として受け取ります。
この値は文字列としては日付型に変換できないため、シリアル値として暗黙的に変換され、結果が"13:12:01"となります。
結果的に13:12:01の方が意図した動作をしているように見えますが、"HH:MM:SS"形式の文字列を引数をとして動作することを前提としているのであれば、むしろ13:12:01の方がイレギュラーな変換結果となっていると言えます。
正しい変換方法などあるのでしょうか。
今回の問題の根本原因となっているのは、暗黙的な変換に頼っているところだと思います。
対策としては、
・暗黙的な変換に頼らず、明示的に変換しましょう
⇒文字列型から日付型にしたい場合はDateValue関数、時間型にしたい場合はTimeValue関数を使用する
・予定している形式であることをチェックしてから変換しましょう
⇒予期せぬ形で引数が来たときには変換をしないよう、事前にチェックする
Function ChangeTime(stime As String) As Single
Dim z_stime As Date
'日付形式でない値、および":"を含まない値は変換しない
If IsDate(stime) And InStr(stime, ":") > 0 Then
z_stime = TimeValue(stime)
Else
'変換できない場合はセットしない
End If
'以下割愛
End Function
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/10 04:47
2016/06/10 04:53
2016/06/10 05:02
2016/06/10 05:19