Excel VBA For循环不工作,不断出现错误消息
制作单人21点模拟,但当我运行时,它会不断返回消息: 编译错误 下一个没有 i=1到5的Excel VBA For循环不工作,不断出现错误消息,vba,excel,Vba,Excel,制作单人21点模拟,但当我运行时,它会不断返回消息: 编译错误 下一个没有 i=1到5的 如果win=“False”,则 范围(“C13”)。选择 选择。插入移位:=xlDown 范围(“B11”)。选择 选择,复制 范围(“C13”)。选择 Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_ :=假,转置:=假 有选择。内饰 .Pattern=xlNone .TintAndShade=0 .PatternTintAndShade=0
如果win=“False”,则
范围(“C13”)。选择
选择。插入移位:=xlDown
范围(“B11”)。选择
选择,复制
范围(“C13”)。选择
Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_
:=假,转置:=假
有选择。内饰
.Pattern=xlNone
.TintAndShade=0
.PatternTintAndShade=0
以
范围(“C18”)。选择
Application.CutCopyMode=False
ActiveCell.FormulaR1C1=“=SUM(R[-5]C:R[-1]C)”
范围(“C19”)。选择
ActiveCell.FormulaR1C1=“”
范围(“H19”)。选择
如果范围(“C18”)<22且范围(“C18”)>=范围(“B18”),则
win=“True”
如果结束
如果范围(“C18”)小于22,则
win=“Bust”
如果结束
接下来我
如果win=“True”,则
应用程序。运行“经销商赢”
其他的
应用程序。运行“玩家赢”
如果结束
端接头
对于C18上的测试,您只是缺少了一个结束If
我去掉了无用的。选择,因为这是一个非常消耗资源的命令,在大多数情况下是绝对不必要的
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
i=1到5的
如果win=“False”,则
范围(“C13”)。插入移位:=xlDown
范围(“B11”)。副本
带量程(“C13”)
.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_
:=假,转置:=假
带.内饰
.Pattern=xlNone
.TintAndShade=0
.PatternTintAndShade=0
以
以
Application.CutCopyMode=False
范围(“C18”)。公式1C1=“=总和(R[-5]C:R[-1]C)”
范围(“C19”)。公式1C1=“”
如果范围(“C18”)<22且范围(“C18”)>=范围(“B18”),则
win=“True”
如果结束
如果范围(“C18”)小于22,则
win=“Bust”
如果结束
如果结束
接下来我
如果win=“True”,则
应用程序。运行“经销商赢”
其他的
应用程序。运行“玩家赢”
如果结束
端接头
这就是为什么元素的开头和结尾之间不应该有超过10-15行的原因。这里是下一行
由于你的缩进很好(这值得称赞),其他评论者已经在结尾处发现了错误:
If Range("C18") < 22 Then
win = "Bust"
End If
Next i
如果范围(“C18”)小于22,则
win=“Bust”
如果结束
接下来我
那应该是
If Range("C18") < 22 Then
win = "Bust"
End If
End If
Next i
如果范围(“C18”)小于22,则
win=“Bust”
如果结束
如果结束
接下来我
注意:根据R3uK的要求取消删除已提供的附加变量:
....
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
....
它始终为真
,因此,由于代码部分过多,可以删除此条件,或者更新以比较[B18]
使用另一个单元格。计算您的Ifs并结束Ifs。您在For循环中打开3条If语句,但仅关闭其中2条。一条End If
缺失,就在Next i
行之前。Range(“C18”)>=Range(“B18”)
这是条件将返回true
无论如何,它在您的代码中是什么意思?删除了我的答案,因为它是a(不太好)您的两倍。只需补充一点:OP有一个非常好的缩进,可以快速识别错误。他只需要学习如何使用这个好习惯。@gazz0x2z:您应该让它仍然获得一些支持,有重复的答案不是问题!这可能会让提问者有点困惑,但测试我们可以提出的建议是他的工作!;)取消删除它,这样我就可以投票给你的答案和你的公平竞争!;)
....
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")