アプリ版:「スタンプのみでお礼する」機能のリリースについて

“:” を含むセルを特定したいのですがうまくいきません。
 A列の各セルには、英数字の文字列(固有名詞、年月日、整数、小数点付きの数値、時刻)等が記入されています。
 例えばA1セルに時刻を表す 22:00 が記入されている場合、以下のようなコードで判別しようとしてみたのですが 「: を含んでいません」 と判定してしまいます。

If InStr(Cells(1, "A").Value, ":") > 0 Then
MsgBox " : を含んでいます。"
Else
MsgBox " : を含んでいません。"
End If

 また、以下のようなコードでも同様に、「時間の型式ではありません。」と判定してしまいます。
If IsDate(Cells(1, "A").Value) = True Then
MsgBox "時間の型式です。"
Else
MsgBox "時間の型式ではありません。"
End If

 この判定方法を教えて下さい。
 宜しくお願いします。

A 回答 (2件)

こんにちは



時刻を判定できれば良いということでしょうか?
時刻を入力してあっても、セルの書式が「G/標準」などになっていると、少数表記の数値として表示されるので、その様なものは対象外としてよいものと仮定しました。

「:」を含むかどうかで判定するなら、Value値ではなく、表示されている文字列(=Text)で判断できます。
 If InStr(Cells(1, "A").Text, ":") > 0 Then
ただし、この場合は(セルの書式設定が文字列で) 「15:82」や「A:B」 などと表示されていても「:」を含んでいるのでTRUEとなります。

一方で、IsDate関数は「有効な時刻または日付」を判定できます。
ただし、対象は文字列ですので、やはり調べる対象はText属性になります。
 If IsDate(Cells(1, "A").Text) = True Then
IsDate関数の場合は、上記の「15:82」などは有効な時刻ではないと見做して、Falseとなります。
ただし、日付の場合でもTRUEになりますので、「5/11」のような表示であってもTRUEになります。


シリアル値でかつ時刻表示のものだけを判別したければ、両方を組み合わせて
 If IsDate(Cells(1, 1).Text) And InStr(Cells(1, 1).Text, ":") > 0 Then
などとすることで可能になるでしょう。
    • good
    • 1
この回答へのお礼

fujillin さん
 今回も迅速で的確なる回答、篤くお礼申し上げます。
 VBAの基本をあまり理解していないので、Textを使う事など思い浮かべませんでした。
 対象の文字列は時刻とは限らず日付も含むので、InStr だけの適用で完全に動作しました。
 万年初心者の見本のような小生ですが、今後とも宜しくお願いします。

お礼日時:2023/05/11 18:19

時刻が表示された状態での文字列として取得できていないので、


判定されないのです。
Formatを使って、指定した表示形式の文字列として取得してから
判定をします。
https://daitaideit.com/vba-time-cstr-format/#mok …

Sub test()

 Dim TimeValue As String
 TimeValue = Format(Cells(1, "A").Value, "hh:mm")

 If InStr(TimeValue, ":") > 0 Then
  MsgBox " : を含んでいます。"
 Else
  MsgBox " : を含んでいません。"
 End If

End Sub
    • good
    • 0
この回答へのお礼

enunokokoro さん
 この度は迅速なる回答を有り難うございました。
 ただ、今回はA列には数百個のセルがあり、全てのセルを文字列として定義してから取得するのは効率が良くないと思われます。
 今後、この方法を必要とするような場合に使わせて頂きます。

お礼日時:2023/05/11 18:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!