みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

VBAのIF分がうまくいかんっす(涙)

ご教示願います。。。

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

Do
If JudgeNo <= 5 Then      '---JudgeNo5まで繰り返す。
Judge = "Judge_" & JudgeNo   '---[Judge_]文字と変数JudgeNoを組み合わせて
                       Judge_*にしてJudge変数に入れる
If Judge = "×" Then     '---Judge_*が×であれば<処理1>を実施。
<処理1>         ←##問題##これが流れず、なぜかElseで判定される。
Else
JudgeNo = JudgeNo + 1
End If
End If
Loop Until JudgeNo = 5      '---JudgeNoが5になると終了。
<処理2>
End Sub

##問題##の箇所で、最初のJudgeNo = 1が走ると、Judge変数はJudge_1が組み込まれ、
Judge_1 = × (Judge_1には×を変数で指定しているので)になり、
<処理1>が走るはずだが、なぜか素通りしてElseが実行される。
ちなみに、Judgeを直接Judge_1に明記すると、<処理1>は流れる。
デバッグ(ステップイン)でも確認して、Judge変数にJudge_1が格納されていることは
確認済み。
なぜ Judge = × が有効にならないのかさっぱり分かりません。
お分かりになられる方、ご教示願います。

投稿日時 - 2011-03-08 15:14:35

QNo.6578507

暇なときに回答ください

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

そりゃそうだわ。

「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>を実施。

  :
  :

こんな感じかな?

投稿日時 - 2011-03-08 15:33:55

お礼

うっわ!すげぇー!!
サクッと解決しました。。。

確かによく考えてみたら、単に文字列指定してただけですね・・・。
お恥ずかしい(--;

詳細な説明と、解決案、ほんっとにありがとうございました。
今回も勉強させていただきました!!

投稿日時 - 2011-03-09 09:42:35

ANo.2

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

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

回答(4)

ANo.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
と言う手も在る。すっきりしているだろう。

投稿日時 - 2011-03-08 22:51:02

お礼

詳細なご説明と、解決策をありがとうございました。

毎回毎回、みなさまのお力添えで知識向上させていただいており、大変感謝しております。

今後も色々と使える案ですので、利用させていただきます。

ほんとうにありがとうございました!

投稿日時 - 2011-03-09 09:47:25

ANo.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の方が書いてくださっているので省略します。

投稿日時 - 2011-03-08 15:58:29

お礼

詳細なご説明をありがとうございました。

みなさんの回答を読んで、自分の考えの誤りに気づきました。

こうやって教示をもらう度に、固定した考えを覆して頂き、ほんとに納得できる回答を
みなさまから頂いて感謝しております。

ありがとうございました。

投稿日時 - 2011-03-09 09:45:31

ANo.1

Judgeという変数の内容はJudge_1という文字列ですね。Judge_1という変数とはなんの関係もありません。

If Judge = "×" Then 
というのは,単に
If "Judge_1" = "×" Then 
ということですから,成立するはずがありません。

投稿日時 - 2011-03-08 15:31:55

お礼

でした。。。
冷静に考えると、私の思考が間違っていることに気づかされました。。。

勉強になりました!
ありがとうございました。

投稿日時 - 2011-03-09 09:43:27

あなたにオススメの質問