• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAのIF分がうまくいかんっす(涙))

VBAのIF文で問題が発生しています

このQ&Aのポイント
  • VBAのIF文で条件判定がうまくいかない問題が発生しています。
  • Judge変数に正しい値が代入されているにも関わらず、条件判定が正しく行われず、意図しない結果になっています。
  • Judge変数の値が×であるかどうかを判定する処理がうまく機能しておらず、なぜか条件判定が正しく行われません。

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

  • ベストアンサー
  • FEX2053
  • ベストアンサー率37% (7995/21384)
回答No.2

そりゃそうだわ。 「Judge_1」と言うのは変数名。変数「Judge」の中身は文字列。 直接比較したくても、文字列「Judge_1」と"×"はどうやっても同じにならない。 ということで、考え方そのものが間違ってます。 だもんで、こういうときは配列変数を使います。 day_man 暇なときに回答ください VBAのIF分がうまくいかんっす(涙) ご教示願います。。。 Sub Product_add() Dim Judge(5) As String Dim Judge_T As String Dim JudgeNo As Integer Judge(1) = "×" Judge(2) = "○" Judge(3) = "×" Judge(4) = "○" Judge(5) = "×" JudgeNo = 1 Do If JudgeNo <= 5 Then      '---JudgeNo5まで繰り返す。 Judge_T = Judge(JudgeNo)   '---[Judge_]文字と変数JudgeNoを組み合わせて                        Judge_*にしてJudge変数に入れる If Judge_T = "×" Then     '---Judge_*が×であれば<処理1>を実施。   :   : こんな感じかな?

day_man
質問者

お礼

うっわ!すげぇー!! サクッと解決しました。。。 確かによく考えてみたら、単に文字列指定してただけですね・・・。 お恥ずかしい(--; 詳細な説明と、解決案、ほんっとにありがとうございました。 今回も勉強させていただきました!!

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.4

Judge_1 = × はXが文字列なんだから、Judge_1 = "×"だろう。 回数が決っているようだからFor Nextのくり返しの利用を勧める。を 書き換えて Sub Product_add() Dim Judge_1 As String Dim Judge_2 As String Dim Judge_3 As String Dim Judge_4 As String Dim Judge_5 As String Dim Judge As String Judge_1 = "×" Judge_2 = "○" Judge_3 = "×" Judge_4 = "○" Judge_5 = "×" JudgeNo = 1 For i = 1 To 5 '---JudgeNo5まで繰り返す。 Judge = "Judge_" & i '---[Judge_]文字と変数JudgeNoを組み合わせて MsgBox Judge '                      Judge_*にしてJudge変数に入れる If Judge = "×" Then '---Judge_*が×であれば<処理1>を実施。 MsgBox "<処理1>" '   ←##問題##これが流れず、なぜかElseで判定される。 Else Msgbox "<処理2>" End If Next i '---JudgeNoが5になると終了。 MsgBox "<処理3>" End Sub これをやってみると<処理1>の表示は出ない。 あくまで変数JudgeはJudge = "Judge_" & iにより、中身はJudge_1などで”X”ではない。当たり前のこと。 変数について大きな誤解が在る。 変数の1部の添え字的な数を頼りに、繰り回しはできない。 繰り回すのには配列以外はやりにくい。なにか他の言語をかじったあとで混乱しているのかな。 === 普通は配列を使うが、 VBAなら Sub Product_add2() Dim Judge As Variant Judge = Array("", "×", "○", "×", "○", "×") For i = 1 To 5 MsgBox Judge(i) ' If Judge(i) = "×" Then MsgBox "<処理1>" Else MsgBox "<処理2>" End If Next i '---JudgeNoが5になると終了。 MsgBox "<処理3>" End Sub と言う手も在る。すっきりしているだろう。

day_man
質問者

お礼

詳細なご説明と、解決策をありがとうございました。 毎回毎回、みなさまのお力添えで知識向上させていただいており、大変感謝しております。 今後も色々と使える案ですので、利用させていただきます。 ほんとうにありがとうございました!

すると、全ての回答が全文表示されます。
  • don9don9
  • ベストアンサー率47% (299/624)
回答No.3

>ちなみに、Judgeを直接Judge_1に明記すると、<処理1>は流れる。 >デバッグ(ステップイン)でも確認して、Judge変数にJudge_1が格納されていることは 確認済み。 Judge = "Judge_" & JudgeNo でJudgeNo = 1の場合と Judge = Judge_1 とでは、Judge変数に格納される内容が違います。 前者では、"Judge_1"という文字列 後者では、Judge_1という変数の内容("×") が格納されます。 Judge変数に格納されているのは"Judge_1"であって "×"ではないので、<処理1>に進まないんです。 どうすればいいかは、No.2の方が書いてくださっているので省略します。

day_man
質問者

お礼

詳細なご説明をありがとうございました。 みなさんの回答を読んで、自分の考えの誤りに気づきました。 こうやって教示をもらう度に、固定した考えを覆して頂き、ほんとに納得できる回答を みなさまから頂いて感謝しております。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • f272
  • ベストアンサー率46% (8652/18506)
回答No.1

Judgeという変数の内容はJudge_1という文字列ですね。Judge_1という変数とはなんの関係もありません。 If Judge = "×" Then  というのは,単に If "Judge_1" = "×" Then  ということですから,成立するはずがありません。

day_man
質問者

お礼

でした。。。 冷静に考えると、私の思考が間違っていることに気づかされました。。。 勉強になりました! ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A