[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA IFの入れ子について』(もも)
VBE上の記述について質問です。
下記のようにIFを入れ子して細かく条件分岐させたいのですが、
「Else に対応する If がありません。」というエラーが出てしまい困っています。入れ子のやり方を間違えているのでしょうか?
※実施したいこと※
条件1のとき、処理1を実施
条件2かつ条件★1のとき、処理★1を実施
条件2かつ条件★2のとき、処理★2を実施 など
If 条件1 処理1
ElseIf 条件2
If 条件★1 処理★1
ElseIf 条件★2 処理★2
End If
ElseIf 条件3
If 条件☆1 処理☆1
ElseIf 条件☆2 処理☆2
End If
End If
< 使用 Excel:Excel2010、使用 OS:Windows10 >
構造はおかしくないように見えますが・・
If と End If の数が同じならいいと思います。
(半平太) 2020/07/20(月) 23:58
コメントありがとうございます。
ですよね…色々調べてるんですが原因不明で…
しょくぱんさん
コメントありがとうございます。
そうなんですね!勉強になります。
しかし、今回Sub〜EndSubの間にはこのIF文しか存在していないものなのです…
(もも) 2020/07/21(火) 00:15
1行で完結しているところがないですかね? (BJ) 2020/07/21(火) 00:21
以下の例を見て、同様の事を行っていませんか? If文は、Then の後ろに実行文を書くと、Else とか End If は書けませんよ。
Sub test1() 'エラーになる例 If 1 Then MsgBox "test" End If End Sub
Sub test2() '正常 If 1 Then MsgBox "test" End If End Sub
Sub tes3() '正常 If 1 Then MsgBox "test" End Sub (???) 2020/07/21(火) 09:48
Thenの後ろに実行文を書いた場合でも、1行に収めるなら、Else は書けます。 書けないのは、行を変えてのElseですね。
Sub test4() '正常 If 1 Then MsgBox "test" Else MsgBox "else test" End Sub
Sub test5() 'エラー If 1 Then MsgBox "test" Else MsgBox "else test" End If End Sub (???) 2020/07/21(火) 12:00
処理1 処理★1 処理★2 処理☆1
のいずれかの命令が不完全な形になっています。
「'」を使ってコメントアウトさせて、それでも同じエラーが出るかどうかを確認し
問題箇所を特定させてください。
(苫) 2020/07/21(火) 12:19
作りたいものとしては、オプションボタンとセルA1の値でじゃんけんを行い、
結果をB1に表示する、というようなものです。
下記のように記述しています。
Sub じゃんけん()
If OptionButton1.Value = False _ And OptionButton2.Value = False _ And OptionButton3.Value = False Then _ MsgBox "選択してください"
ElseIf OptionButton1.Value = True Then
If Range("A1").Value = "グー" Then
Range("B1").Value = "あいこ"
ElseIf Range("A1").Value = "チョキ" Then
Range("B1").Value = "まけ"
ElseIf Range("A1").Value = "パー" Then
Range("B1").Value = "かち"
End If
ElseIf OptionButton2.Value = True Then
If Range("A1").Value = "グー" Then
Range("B1").Value = "まけ"
ElseIf Range("A1").Value = "チョキ" Then
Range("B1").Value = "あいこ"
ElseIf Range("A1").Value = "パー" Then
Range("B1").Value = "かち"
End If
ElseIf OptionButton3.Value = True Then
If Range("A1").Value = "グー" Then
Range("B1").Value = "かち"
ElseIf Range("A1").Value = "チョキ" Then
Range("B1").Value = "まけ"
ElseIf Range("A1").Value = "パー" Then
Range("B1").Value = "あいこ"
End If
End If
End Sub
(もも) 2020/07/21(火) 15:53
If OptionButton1.Value = False _ And OptionButton2.Value = False _ And OptionButton3.Value = False Then _ ←原因はこのアンダーバーです。これをなくしてください。 MsgBox "選択してください" (苫) 2020/07/21(火) 15:59
3行目に改行のアンダーバーがあります。
And OptionButton3.Value = False Then _
If 比較1 And 比較2 And 比較3 then MsgBox "選択してください"
でIf文が終了するので、
次行のElseIfでエラーになります。頭のIfがありませんから。
みなさんのアドバイス通りでしたね。
(tkit) 2020/07/21(火) 16:00
(もも) 2020/07/21(火) 16:39
すみません、オプションボタンについてよくわかっていなくて…
フォームコントロールとActiveXコントロールと二種類ありますが、
ActiveXで作成したボタンはOptionButton1などと指定すれば値を取得できますが、フォームで作成したボタンについてはどのように指定すればよいのでしょうか?指定する際の名称などが自動で振り分けられているのでしょうか?その場合どこから確認できるのでしょうか?
(もも) 2020/07/21(火) 16:52
If ActiveSheet.Shapes("オプション 1").OLEFormat.Object.Value = xlOn Then
名前は、オブジェクトを選択すると、左上の、普段はセル番地を表示している部分に出てきますよ。
(???) 2020/07/21(火) 17:38
# 手品に不思議がったり一切しない人いますよね。
# だって手品なんですもん、で済ます人いますよね。
# そういう感じですかね。
(γ) 2020/07/21(火) 19:36
私は、アクティブXコントロールは、 ActiveSheet.OLEObjects("OptionButton1").Object.Value って、書きますけどね。 (BJ) 2020/07/21(火) 20:05
■1
A1の値で3つに分岐してるのでIFではなく、Select Caseを使うとよりわかりやすいんじゃないかな〜と思います。
さらに、提示のために簡略化した結果なのかもしれませんがA1セルの値に対するパターンは1種類しかないので↓みたいな感じでもOKだとおもいます。
Sub じゃんけん_改() If OptionButton1.Value = False And OptionButton2.Value = False And OptionButton3.Value = False Then MsgBox "選択してください" Else Select Case Range("A1").Value Case "グー" Range("B1").Value = "あいこ" Case "チョキ" Range("B1").Value = "まけ" Case "パー" Range("B1").Value = "かち" End Select End If End Sub
■2
上記でも触れましたが、実際には選んだボタンでパターンが変わるというならこんな書き方もありだと思います。
Sub じゃんけん改二() Stop 'ブレークポイントの代わり Select Case True Case OptionButton1.Value = False Select Case Range("A1").Value Case "グー" Range("B1").Value = "あいこ" Case "チョキ" Range("B1").Value = "まけ" Case "パー" Range("B1").Value = "かち" End Select
Case OptionButton2.Value = False Select Case Range("A1").Value Case "グー" Range("B1").Value = "かち" Case "チョキ" Range("B1").Value = "あいこ" Case "パー" Range("B1").Value = "まけ" End Select
Case OptionButton3.Value = False Select Case Range("A1").Value Case "グー" Range("B1").Value = "まけ" Case "チョキ" Range("B1").Value = "かち" Case "パー" Range("B1").Value = "あいこ" End Select
Case Else MsgBox "選択してください" End Select End Sub
(もこな2 ) 2020/07/22(水) 08:01
Sub じゃんけん() Dim Result As String Dim buf1 As Byte Dim buf2 As Byte Select Case True Case OptionButton1.Value: buf1 = 1 Case OptionButton2.Value: buf1 = 2 Case OptionButton3.Value: buf1 = 3 Case Else: MsgBox "選択してください" End Select Select Case Range("A1").Value Case "グー": buf2 = 1 Case "チョキ": buf2 = 2 Case "パー": buf2 = 3 End Select Select Case True Case buf1 * buf2 = 0: Result = "" Case buf1 = buf2: Result = "あいこ" Case (buf1 Mod 3) + 1 = buf2: Result = "かち" Case buf1 = (buf2 Mod 3) + 1: Result = "まけ" Case Else: Result = "" End Select Range("B1").Value = Result End Sub
(苫) 2020/07/22(水) 09:14
もう見てないかもしれませんが、別案を提示しておきます。
Sub 別案() Stop 'ブレークポイントの代わり Dim tmp As Variant
With ActiveSheet tmp = Application.Match(.Range("A1"), Array("グー", "チョキ", "パー")) If IsError(tmp) Then MsgBox "A1セルの値エラー" Else Select Case True Case .OptionButton1.Value = True .Range("B1").Value = Array("", "あいこ", "まけ", "かち")(tmp)
Case .OptionButton2.Value .Range("B1").Value = Array("", "かち", "あいこ", "まけ")(tmp)
Case .OptionButton3 .Range("B1").Value = Array("", "まけ", "かち", "あいこ")(tmp)
Case Else MsgBox "選択してください" End Select End If End With End Sub
(もこな2 ) 2020/07/22(水) 22:22
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.