質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Q&A

解決済

2回答

3225閲覧

VB Date型への変換について

ShingoMaeshima

総合スコア7

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

0グッド

0クリップ

投稿2016/06/09 10:15

###前提・実現したいこと
VBでStringからDate変数に変換について

###発生している問題・エラーメッセージ
セルに入力された時間がうまく変換できません。
60進法を10進法になおす関数を作っていたのですが
セルに13:12:00と入力されている時だけ値がおかしくなります。
13:12:01の時は問題ないのです。
13:12:00の時は0:55:00となってしまいます。
CDate関数を使っても同じでした。
正しい変換方法などあるのでしょうか。

初歩的な質問かもしれませんが
宜しくお願いいたします。
###該当のソースコード

Function ChangeTime(stime As String) As Single Dim z_stime As Date z_stime = stime’このやり方だと13:12:00→0:55:00となってしまうCStr関数も同じ 以下割愛 ``` ###試したこと 課題に対してアプローチしたことを記載してください ###補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

文字列型から日付型(時間型)に代入する際、暗黙的な変換により意図せぬ変換が行われることで結果に差が出ているものと思います。

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:44

編集2016/06/10 04:56
jawa

総合スコア3020

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jawa

2016/06/10 04:47

投稿前に解決済みになっていました(^-^; でも参考になれば幸いです。
ttyp03

2016/06/10 04:53

詳しい解説ありがとうございます。 書きたかったこと全部書いていただけましたw
jawa

2016/06/10 05:02

何度読み返しても誤字だらけの駄文でお恥ずかしい限りです(^-^;;;;←もう誤字修正はあきらめた
ShingoMaeshima

2016/06/10 05:19

ありがとうございます。 勉強になります!
guest

0

ベストアンサー

VB?VBA?Excel?
質問内容、タグは正確に教えてくださいね。
「セル」と書いてあったので、ExcelのVBAとして回答します。

再現テストをした感じだと、セルには文字列ではなくタイムスタンプ値で入っている。
その値を文字列にした場合に発生するようです。

ChangeTimeをどうやって呼び出しているかが書いてないのでわかりませんが、String型で受け取らずにDate型でセルの値をそのまま受け取ればよろしいかと思います。

VBA

1Sub test() 2 Call ChangeTime(Cells(1, 1).Value) 3End Sub 4 5Function ChangeTime(stime As Date) As Single 6 Dim z_stime As Date 7 z_stime = stime 8 Debug.Print Format(z_stime, "hh:nn:ss") 9End Function 10

投稿2016/06/10 01:02

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShingoMaeshima

2016/06/10 04:41

回答ありがとうございます 次質問するときは気を付けます。 時間はDateを使った方がいいってことですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問