vba - For Each 循环只触发一次
问题描述
我正在制作一个连接四游戏来学习一些 VBA。
我有一个未绑定的表单,其中包含游戏块(令牌)的按钮。用于选择要删除令牌的列的选项组。一个文本框(隐藏),表示要放置令牌的行。
如果我在文本框中手动输入一个数字,然后点击 Drop 按钮,它会按预期工作。填写令牌并将一个添加到正确的文本框中。
示例:
将 1 放入 txtR1 中的点击按钮。
令牌已填写,txtR1 现在显示 2,再次点击下拉按钮,什么也没有。如果我在 txtR1 中手动输入 2,那么它会按预期工作。
当它显示它时,txtbox 是否没有更新?
我在 if 语句中安排了代码 str 和 row 并尝试在其中添加保存并刷新。
Private Sub drop()
Dim Token As Control
Dim Row As Control
Dim r As Integer
Dim c As Integer
Dim str As String
c = Me.frmCol
str = "txtR" & c
Set Row = Me(str)
r = Row
For Each Token In Controls
If InStr(Token.Tag, "C" & c) Then
If Right(Token.name, 1) = Row Then
Token.BackStyle = 1
Token.BackColor = vbBlue
Row = r + 1
Exit Sub
End If
End If
Next Token
End Sub
解决方案
考虑使用数字后缀控件命名而不循环设置标记颜色但使用循环重置游戏的替代方案:
Private Sub optDrop_Click()
Dim r As Integer
Dim c As Integer
c = Me.optDrop
r = Me("tbx" & c) + 1
If Me("tbx" & c) = 6 Then
MsgBox "This column is full. Pick another."
Else
Me("box" & c & r).BackColor = IIf(Me.tbxPlayer = "Player 1", vbCyan, vbMagenta)
Me("tbx" & c) = Me("tbx" & c) + 1
Me.tbxPlayer = IIf(Me.tbxPlayer = "Player 1", "Player 2", "Player 1")
Me.tbxPlayer.BackColor = IIf(Me.tbxPlayer = "Player 1", vbCyan, vbMagenta)
End If
Me.optDrop = 0
End Sub
Private Sub btnReset_Click()
Dim c As Integer, r As Integer
Me.tbxPlayer = "Player 1"
Me.tbxPlayer.BackColor = vbCyan
For c = 1 To 7
For r = 1 To 6
Me("box" & c & r).BackColor = vbWhite
Next
Me("tbx" & c) = 0
Next
End Sub
矩形控件用于标记,而 optDrop 是选项组框架控件。
还没有找到代码来检查连续 4 个并宣布获胜者。可能超出了我的能力和兴趣。
奖励:如果您想观看代币“掉落”,请考虑:
Option Compare Database
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal lngMilliSeconds As Long)
Private Sub optDrop_Click()
Dim r As Integer, c As Integer, x As Integer, dteD As Date
c = Me.optDrop
r = Me("tbx" & c) + 1
If Me("tbx" & c) = 6 Then
MsgBox "This column is full. Pick another."
Else
For x = 6 To r Step -1
Me("box" & c & x).BackColor = IIf(Me.tbxPlayer = "Player 1", vbCyan, vbMagenta)
dteD = Now()
Do
Sleep 300
DoEvents
Loop Until Now >= dteD
Me("box" & c & x).BackColor = vbWhite
Next
Me("box" & c & r).BackColor = IIf(Me.tbxPlayer = "Player 1", vbCyan, vbMagenta)
Me("tbx" & c) = Me("tbx" & c) + 1
Me.tbxPlayer = IIf(Me.tbxPlayer = "Player 1", "Player 2", "Player 1")
Me.tbxPlayer.BackColor = IIf(Me.tbxPlayer = "Player 1", vbCyan, vbMagenta)
End If
Me.optDrop = 0
End Sub
我将切换按钮移到了列的顶部,因此可以获得更多“丢弃”令牌的感觉。
推荐阅读
- python - 如何设置记录器对象的记录级别?
- r - 将函数应用于数据框的某些列,同时将结果存储在原始数据框中
- jquery - Jquery TR 可排序,用于单独的手风琴
- c# - 如何使用 C# 网络服务?
- forms - 为什么“toFillForm”在 jest-puppeteer 中不起作用?
- kubernetes - Kubernetes 主节点未接收到内部 IP
- java - 如何在快速 android 网络库中的参数中发送数组
- jenkins - archiveArtifacts finger print = false 是什么意思?
- python - lambda 函数的布尔值可以为 false 吗?
- office-js - Office Add in 可以通过添加来自不同于窗口密钥库的外部源的数字签名来修改电子邮件吗?