ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:harudog_03 ユーザーフォームから入力された値が時刻の表示形式かをチェックするには?
困り度:
  • 困っています
VBAで、ユーザーフォームから時刻を入力するときに、
入力された値が、時刻の表示形式(h:mm)かどうかをチェックする
にはどうしたら良いですか?
IsnumberやIsnumericの時刻版みたいな関数はないんでしょうか?
質問投稿日時:08/07/03 14:05
質問番号:4148191
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:Husky2007 Public Function IsTime(ByVal IData As String, Optional F As String = "h:mm") As Boolean
On Error Resume Next
  If IsDate(IData) Then
    IsTime = CBool(Format(IData, F) = IData)
  End If
End Function

Public Function IsTime(ByVal IData As String, Optional F As String = "h:mm") As Boolean
  IsTime = (Format(IData, F) = IData) * IsDate(IData)
End Function

この2つの書き方は同じ処理を意味しています。

IsDate(IData)・・・真であること。
IsTime = CBool(Format(IData, "h:mm") = IData)・・・真であること。

と2つのテストに合格しなきゃダメです。

? CBool(True*False)
False
? CBool(True*True)
True

と、論理演算の特質を利用してIF Then 文を論理演算で代用しているだけです。

なお、関数中に"h:mm"を埋め込むのは、これはやってはならない禁則事項。
で、少し、IsTime関数を汎用的に修正しています。

[イミディエイト]
? ISTime("2:20")
True
? ISTime("2:20", "h:mm:ss")
False
? ISTime("2:20:00", "h:mm:ss")
True
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/04 14:18
回答番号:No.5
この回答へのお礼お礼が遅くなり、すみません。
とても丁寧なご説明ありがとうございました。
お陰で良く理解できました!
ANDでふたつとも真であることを確かめているんですね。

良回答にさせていただきます。
有難うございました。

回答

 

回答者:Husky2007 Public Function IsTime(ByVal IData As String) As Boolean
  IsTime = (Format(IData, "h:mm") = IData) * IsDate(IData)
End Function

1行でも書けないことはないです。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/03 15:05
回答番号:No.4
この回答へのお礼ありがとうございます。上手くいきました!
色々試してみましたが、ちゃんとチェックされています。

h:mm形式に変換されたIDataと IsDate関数の結果を
掛け合わせている所が(AND?)、よく理解できないのですが、
宜しければ簡単にご説明していただけませんか?

回答

良回答10pt

回答者:kigoshi ベタな方法です。

Private Sub CommandButton1_Click()
If checkTimeFormat(TextBox1.Text) Then
MsgBox "時刻形式です"
Else
MsgBox "時刻の形式ではありません"
End If
End Sub

Function checkTimeFormat(tStr As String) As Boolean
Dim prtT As Variant
tStr = StrConv(tStr, vbNarrow)
tStr = Trim(tStr)
prtT = Split(tStr, ":")
checkTimeFormat = True
If UBound(prtT) < 1 Then
checkTimeFormat = False
Exit Function
End If
If Val(prtT(0)) > 24 Then
checkTimeFormat = False
Exit Function
End If
If (Val(prtT(1)) > 60) Or (Len(prtT(1)) <> 2) Then
checkTimeFormat = False
Exit Function
End If
End Function


自分でもスマートなコードとは思ってません。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/03 14:58
回答番号:No.3
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:Husky2007 [イミディエイト]
? IsDate("23:00:00")
True
? IsTime("23:00:00")
False
? IsTime("2:12")
True

Public Function IsTime(ByVal IData As String) As Boolean
On Error Resume Next
  If IsDate(IData) Then
    IsTime = CBool(Format(IData, "h:mm") = IData)
  End If
End Function

まあ、自作するしかないかもです。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/03 14:54
回答番号:No.2
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:imogasi IsDate関数があります。
>時刻の表示形式(h:mm)かどうかをチェックする
これは通常的外れ。入力者には通常、表示形式まで設定させないのでは?
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/07/03 14:50
回答番号:No.1
この回答へのお礼この回答にお礼をつける(質問者のみ)
最新から表示回答順に表示良回答のみ表示