Excel VBA循环不起作用,一直出现错误信息

3
制作一个单人21点模拟器,但是当我运行它时,会一直出现以下信息:

编译错误

没有对应的 For 语句

    For i = 1 To 5
    
        If win = "False" Then
            Range("C13").Select
            Selection.Insert Shift:=xlDown
            Range("B11").Select
            Selection.Copy
            Range("C13").Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            
            With Selection.Interior
                .Pattern = xlNone
                .TintAndShade = 0
                .PatternTintAndShade = 0
            End With
            
            Range("C18").Select
            Application.CutCopyMode = False
            ActiveCell.FormulaR1C1 = "=SUM(R[-5]C:R[-1]C)"
            Range("C19").Select
            ActiveCell.FormulaR1C1 = ""
            Range("H19").Select
    
            If Range("C18") < 22 And Range("C18") >= Range("B18") Then
                win = "True"
            End If
        
            If Range("C18") < 22 Then
                win = "Bust"
        End If
    Next i
    
    If win = "True" Then
        Application.Run "Dealer_wins"
    Else
        Application.Run "player_wins"
    End If
End Sub

统计一下你的 If 和 End If。在 For 循环中,你打开了 3 个 If 语句,但只关闭了其中的 2 个。 - Vulthil
2
在“Next i”行之前缺少一个“End If”。 - mielk
"Range("C18") >= Range("B18")" 这个条件将会在任何情况下返回 "true",在你的代码中这是什么意思? - Vasily
3个回答

3

你只是在C18的测试中缺少了一个End If

而且我去掉了无用的.Select,因为这是一个非常消耗资源的命令,大多数情况下完全没有必要!

    For i = 1 To 5

        If win = "False" Then
            Range("C13").Insert Shift:=xlDown
            Range("B11").Copy

            With Range("C13")
                .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                            :=False, Transpose:=False
                With .Interior
                    .Pattern = xlNone
                    .TintAndShade = 0
                    .PatternTintAndShade = 0
                End With
            End With

            Application.CutCopyMode = False
            Range("C18").FormulaR1C1 = "=SUM(R[-5]C:R[-1]C)"
            Range("C19").FormulaR1C1 = ""

            If Range("C18") < 22 And Range("C18") >= Range("B18") Then
                win = "True"
            End If

            If Range("C18") < 22 Then
                win = "Bust"
            End If
        End If
    Next i

    If win = "True" Then
        Application.Run "Dealer_wins"
    Else
        Application.Run "player_wins"
    End If
End Sub

1
我删除了我的回答,因为它与你的回答有些重复(但不如好)。只是想补充一下:原帖作者的缩进非常好,这有助于快速发现错误。他只需要学会如何保持这个好习惯。 - gazzz0x2z
@gazzz0x2z:你应该让它继续获得一些赞,有重复的答案并不是问题!这可能会让提问者有点困惑,但他的工作就是测试我们能提出什么!请恢复它,这样我就可以给你的回答点赞了,你做得很公平!;) - R3uK

0

额外的变量已经提供:

....

For i = 1 To 5
    If win = "False" Then
        With [C13]
            .Insert
            .Value = [B11].Value2
            With .Interior
                .Pattern = xlNone
                .TintAndShade = 0
                .PatternTintAndShade = 0
            End With
        End With
        [C18].Value = Application.Sum([C13:C17])
        [C19] = ""
        If [C18].Value2 < 22 And [C18].Value2 >= [B18].Value2 Then 'this condition shall be reviewed
            win = "True"
        ElseIf [C18].Value2 < 22 Then
            win = "Bust"
        End If
    End If
Next i
If win = "True" Then
    Application.Run "Dealer_wins"
Else
    Application.Run "player_wins"
End If

....

另外,请注意您代码中的这一行:

Range("C18") >= Range("B18")

它总是会是true,因此这个条件可以被移除,因为它是代码的过度部分,或者更新为与另一个单元格比较[B18]


-1
这就是为什么元素的开始和结束之间不应该超过10-15行。例如,在For-Next中。
由于您的缩进很好(对此表示赞赏),其他评论者已经发现了结尾的错误:
        If Range("C18") < 22 Then
            win = "Bust"
    End If
Next i

那应该是

        If Range("C18") < 22 Then
            win = "Bust"
        End If
    End If
Next i

NB: 根据R3uK的要求,已恢复删除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接