• ベストアンサー

エクセルVBA・時間値なら・・・

早速ですが 入力された値が 時間かそれとも時間でないか識別したいのですが If IsDate(Cells(1, 2)) Then 日付はあるのですが If Istime(Cells(1, 2)) Then は 駄目なようです。 If TimeValue(Cells(1, 2)) Then ですと、True なら 良いのですが、逆だとエラーになります。 エラー回避で、識別するのも手ですが、 簡単な方法は無いのでしょうか

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

IsDateを使います。 Dim セル値 As String 'セル内容を文字列で受け取る セル値 = Cells(1, 2).Text '日付と結合してみる If IsDate("2012/01/01 " & セル値) Then   MsgBox "時刻です" Else   MsgBox "時刻ではありません" End If 日付(時刻)を含むDate型の内部形式は 倍精度実数で、整数部は1899/12/31を 1として、現在までの通算日数を表わし、 小数部は1/86400を1秒として0:0:0からの 通算秒数を表わします。 よって、デフォルトプロパティのValueを使うと 実数なのか日付なのか分からないことが あります。 表面に見えている文字列を取り出すText プロパティで文字列を取得し、前方に適当な 日付を結合します。これでIsDateがTrueを 返せば、元の文字列は時刻を表わすという 仕掛けです。

007itochan
質問者

補足

サンクス 理解できました

その他の回答 (2)

  • x-1919
  • ベストアンサー率52% (91/173)
回答No.2

そこまで細かいことを気にするのなら "時間" じゃなくて "時刻" って言う癖をつけようや。 違いはわかるな? IsDateがTrueで、 なおかつ値の文字煤が5で (hh:mm と仮定)、 なおかつ3文字目が ":" だったら True を返すってな関数を作れば?

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

Istime()関数?というものはVBAに用意されていませんね。 万能な判別法ってのも、考えたら結構大がかりです。(そっちは遠慮しますが) 簡単な方法ということなので、 とても性善説的なものになってしまいますが。 例えば、  時刻が確実に時刻として正しく入力されていること  表示形式を勝手に変えてしまう人がいないこと  0:00が存在する場合は文字列ではないという判定も必要 という条件で   If v.Text = Format(Val(v.Value), "h:mm") Then (表示形式:デフォルトの"標準"または"h:mm"の場合↑) とか、  "123:456"とか"1a:b2"のようなイタズラがないこと という条件で   If v.Text Like "#*:*#" Then (RegExpとか正規表現使うと少しはマシになりますが。) とか、 表示文字列で判定するのが簡単といえば簡単かと。 ただ、これが実用に耐えられるかどうかの検証は簡単ではないと思いますが。 私も得意というわけではありませんので、とりあえず、ご参考まで