• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA 単純なIF文ですが?)

VBA単純なIF文でのイコール実行の問題

このQ&Aのポイント
  • VBAの単純なIF文で変数を設定した場合、イコールが実行されない問題が発生することがあります。
  • 具体的には、変数を「set_s」とし、値を16と設定した場合、IF文が機能しないことがあります。
  • そのため、変数を単純な数字にすると、IF文が正しく機能するようになります。

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

  • ベストアンサー
回答No.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) にすれば 解決しました。

homma
質問者

お礼

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

その他の回答 (1)

回答No.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型使わなければ回避できる問題の様だから気にしない。

homma
質問者

お礼

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

homma
質問者

補足

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

関連するQ&A