- ベストアンサー
VBA単純なIF文でのイコール実行の問題
- VBAの単純なIF文で変数を設定した場合、イコールが実行されない問題が発生することがあります。
- 具体的には、変数を「set_s」とし、値を16と設定した場合、IF文が機能しないことがあります。
- そのため、変数を単純な数字にすると、IF文が正しく機能するようになります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
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) にすれば 解決しました。
その他の回答 (1)
- nan93850673
- ベストアンサー率32% (179/553)
変数の宣言をしていない(全て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型使わなければ回避できる問題の様だから気にしない。
お礼
ありがとうございます。 基本がなっていませんでした。 確かに宣言文でString扱いにしたところ解決しました。 お手数をおかけしました。
補足
改めて勉強になりました。
お礼
ありがとうございます。 基本がなっていませんでした。 確かに宣言文でString扱いにしたところ解決しました。 お手数をおかけしました。