質問 |
||
| 質問者: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 |
|
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |