[[20200720232340]] 『VBA IFの入れ子について』(もも) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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


If...End If
With...End with
のような、はじまりとおわりのある命令のどちらかが欠けていると
その欠けた命令そのものではないところのエラーを返す場合があります。
If以外の命令についても確認してみてください。
(しょくぱん) 2020/07/21(火) 00:11

半平太さん

コメントありがとうございます。
ですよね…色々調べてるんですが原因不明で…

しょくぱんさん

コメントありがとうございます。
そうなんですね!勉強になります。
しかし、今回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

「Else に対応する If がありません。」というエラー、ということですから、

 処理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


OptionButton1〜3がなければそうなります。
(苫) 2020/07/21(火) 16:42

ありがとうございます。

すみません、オプションボタンについてよくわかっていなくて…

フォームコントロールとActiveXコントロールと二種類ありますが、
ActiveXで作成したボタンはOptionButton1などと指定すれば値を取得できますが、フォームで作成したボタンについてはどのように指定すればよいのでしょうか?指定する際の名称などが自動で振り分けられているのでしょうか?その場合どこから確認できるのでしょうか?
(もも) 2020/07/21(火) 16:52


んー、ActiveXのオプションボタンの方が簡単だから、そっちを使えば良いのでは? 今のコードのままだし。
フォームコントロールのオプションボタンだと、以下みたいになっちゃいますよ?
    If ActiveSheet.Shapes("オプション 1").OLEFormat.Object.Value = xlOn Then

名前は、オブジェクトを選択すると、左上の、普段はセル番地を表示している部分に出てきますよ。
(???) 2020/07/21(火) 17:38


コメントありがとうございます!
フォームコントロールのオプションボタンだと記述がまどろっこしいことになるんですね…
ActiveXのオプションボタンに切り替えます!
名前についてもありがとうございます。勉強になりました。
(もも) 2020/07/21(火) 17:46

余談:
拝見していましたが、何か感慨に乏しいですね。
こういうのアンチクライマックスというらしい。
あり得ないと思っていたことの理由がわかって、
驚きのようなものは無かったのでしょうか。
もちろん回答不要です。

# 手品に不思議がったり一切しない人いますよね。
# だって手品なんですもん、で済ます人いますよね。
# そういう感じですかね。
(γ) 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


>A1セルの値に対するパターンは1種類しかないので
失礼しました。よく見たら違うパターンになっていました。

もう見てないかもしれませんが、別案を提示しておきます。

    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.