こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBA 単純なIF文ですが?

以下のような文を書いたときに、If文の後の変数を「set_s」にした場合イコールが実行されません。
「set_s」を単純な数字(この場合16)にするとIf文が機能します。

なぜでしょうか。

Do
set_s = 16
Cells(1, 1) = Time
h = Left(Time, 2)
m = Mid(Time, 4, 2)
s = Right(Time, 2)
If set_s = s Then
Cells(8, 2) = "時間です。"
Exit Do
Else
Cells(8, 2) = "まだです。"
End If
Loop

投稿日時 - 2017-09-04 17:23:39

QNo.9370871

困ってます

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

set_sの型宣言がないのでデフォルトのVariant型扱いで、これにset_s=16で数値の16が代入
s も 型宣言がないのでVariant型で、Right(Time,2)で文字列の"16"が代入
となっているので
If set_s = s は Variant型とVariant型の比較なので、数値16と 文字列"16"は 等しくないとなり
If 16 = s だと Integer型とVariant型の比較なので、 暗黙の型変換が行われて等しいとなる、
ってことではないですかね。

先頭にDim set_s as Integerを いれるか
set_s = 16 を set_s = "16"に変更するか
If set_s = Val(s) にすれば 解決しました。

投稿日時 - 2017-09-04 18:45:48

お礼

ありがとうございます。
基本がなっていませんでした。
確かに宣言文でString扱いにしたところ解決しました。
お手数をおかけしました。

投稿日時 - 2017-09-05 11:47:52

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

変数の宣言をしていない(全てVariant)を前提にテストしてみたんだが

set_s = 16
で、set_sは内部形式がInteger
s = Right(Time, 2)
で、sは内部形式がString
a = 10
b = "10"
Debug.Print a = b
だと、a(内部Integer) = b(内部String)で、Debug.PrintはFalse。
a = 10
b = CInt("10")
Debug.Print a = b
だと、a(内部Integer) = b(内部Integer)は、Debug.PrintはTrue
a = CInt(10)
b = CDbl(10)
Debug.Print a = b
だと、a(内部Integer) = b(内部Double)でもDebug.PrintはTrue
 Dim a As Integer, b As String
a = 10
b = "10"
Debug.Print a = b
だと、a(Integer) = b(String)でもTrue

試した範囲では、Variant型で内部Integerと内部String組み合わせだけ他と違う結果になった。

>なぜでしょうか。

さぁ、分からないけどVariant型使わなければ回避できる問題の様だから気にしない。

投稿日時 - 2017-09-04 18:41:29

補足

改めて勉強になりました。

投稿日時 - 2017-09-05 11:48:49

お礼

ありがとうございます。
基本がなっていませんでした。
確かに宣言文でString扱いにしたところ解決しました。
お手数をおかけしました。

投稿日時 - 2017-09-05 11:48:04

あなたにオススメの質問