gpt4 book ai didi

excel - 如果声明未正确适用于标准

转载 作者:行者123 更新时间:2023-12-04 21:42:12 25 4
gpt4 key购买 nike

我一直在用 VBA 做实验并且一直在研究它。我不是最好的,但很多时候我能弄明白。但这……这简直是疯了。这没有逻辑意义,我来这里寻求帮助。我喜欢“数字迷宫”,所以我坐下来使用 VBA 在 Excel 中创建一个数字迷宫。第一个屏幕截图是我的代码填充迷宫之前的样子。
The maze without being filled in
其工作方式如下:可能的最大房间大小为 7 x 7,因此任何时候生成的最大数字为 7。但是,有些方 block 会产生不同的效果,要么让你回到 1 之间到 7 个方格,或奖励您随机数的点数。因此,为了以最简单的方式实现这一点,有第二个屏幕截图,它是 7 到 4 的倍数。标有“什么也不做”的部分就是这样,只需移动图 block 。将数字随机化,同时为 2 个增量 7 提供平等机会,从而使这些牌出现在惩罚或奖励牌上的机会加倍。 (再次参见屏幕截图 2)。我做了数学计算,找出了将 16 转换为基数 7 倍数(即 2)的最佳公式,并将这个公式应用于我的代码,这是另一个屏幕截图。
The rules for how spaces are calculated and what to do on those tiles. I'll add color formatting to the tiles later
相当简单,至少我是这么认为的。
我写了代码,努力让它工作,然后,这发生了。我得到的数字高于 7,但小于或等于 16,这是不可能的。我得到的数字是一个恒定的范围,这很奇怪。我完全被难住了,这不应该发生,我无法确定这种模式。下面是我的代码。这只是我见过的最奇怪的事情,我完全被难住了。我从来没有看到任何大于 21 的东西,所以我知道那部分的逻辑是正确的。我从未见过 8、9、10、11 或 13。但不断生成的数字是 12、14、15 和 16。这 4 个数字始终如一,这很奇怪。我已经四倍检查了我的逻辑,唯一可能导致问题的逻辑是在 14 到 18 之间,但为什么是 12?为什么只有这些数字?我现在好难过。
The results of pressing the button

Private Sub CommandButton1_Click()
Dim RandVal As Integer
Dim Multiplier As Integer

Dim rng As Range
For Each rng In Range("A1:AY51")
RandVal = ((28 * Rnd) + 1)

If rng.Value = "" Then
If RandVal = 8 Or RandVal = 17 Or RandVal = 28 Or RandVal = 19 Or RandVal = 23 Or RandVal = 6 Or RandVal = 25 Or RandVal = 1 Or RandVal = 18 Or RandVal = 3 Or RandVal = 7 Or RandVal = 20 Or RandVal = 16 Or RandVal = 12 Then
If RandVal > 21 Then
RandVal = RandVal - (7 * 3)
rng.Value = rng.Value + RandVal
ElseIf RandVal > 14 And RandVal <= 21 Then
RandVal = RandVal - (7 * 2)
rng.Value = rng.Value + RandVal
ElseIf RandVal > 7 And RandVal <= 14 Then
RandVal = RandVal - 7
rng.Value = rng.Value + RandVal
End If
rng.Value = rng.Value + RandVal
End If

If RandVal = 10 Or RandVal = 13 Or RandVal = 5 Or RandVal = 14 Or RandVal = 22 Or RandVal = 4 Or RandVal = 9 Then
If RandVal > 21 Then
RandVal = RandVal - (7 * 3)
rng.Value = rng.Value + RandVal
ElseIf RandVal > 14 And RandVal <= 21 Then
RandVal = RandVal - (7 * 2)
rng.Value = rng.Value + RandVal
ElseIf RandVal > 7 And RandVal <= 14 Then
RandVal = RandVal - 7
rng.Value = rng.Value + RandVal
End If
rng.Value = rng.Value + RandVal
End If

If RandVal = 15 Or RandVal = 11 Or RandVal = 24 Or RandVal = 2 Or RandVal = 27 Or RandVal = 21 Or RandVal = 26 Then
If RandVal > 21 Then
RandVal = RandVal - (7 * 3)
rng.Value = rng.Value + RandVal
ElseIf RandVal > 14 And RandVal <= 21 Then
RandVal = RandVal - (7 * 2)
rng.Value = rng.Value + RandVal
ElseIf RandVal > 7 And RandVal <= 14 Then
RandVal = RandVal - 7
rng.Value = rng.Value + RandVal
End If
End If
End If

Next rng
结束子

最佳答案

需要解决的几点
1 不要将代码放入与确定控件状态和传递该状态无关的表单控件中。
您的“CommandButton1_Click”因此变为

Private Sub CommandButton1_Click()
RefreshBoard
End Sub

2.你有一些如果测试多个常量来选择要采取的行动。
在您的情况下,这样的结构最好由 Select Case Structure 表示
3.您对每个多 if 语句都有重复的代码。这最好抽象成它自己的方法。因此您的刷新板方法可以折叠如下
Select Case RandVal

Case 1, 3, 6, 7, 8, 12, 17, 18, 19, 20, 23, 25, 28

rng.Value = RefreshCell(rng.Value)
rng.Value = rng.Value + RandVal

Case 4, 5, 9, 10, 13, 14, 22
rng.Value = RefreshCell(rng.Value)
rng.Value = rng.Value + RandVal


Case 2, 11, 15, 21, 24, 26, 27
rng.Value = RefreshCell(rng.Value)

End Select

'and

Public Function RefreshCell(ByVal ipCellValue As Variant) As Variant

If RandVal > 21 Then
RandVal = RandVal - (7 * 3)
ipCellValue = ipCellValue + RandVal
ElseIf RandVal > 14 Then
RandVal = RandVal - (7 * 2)
ipCellValue = ipCellValue + RandVal
ElseIf RandVal > 7 Then
RandVal = RandVal - 7
ipCellValue = ipCellValue + RandVal
End If

RefreshCell = ipCellValue

End Function

The second set of If Tests, now encapsulated in the RefreshCell Method contain unecessary tests. Eg. 'If >21' means than in the following ElseIf there is no need to do '<=21' because all numbers >21 have aleady been eliminated. You can only get to the else if clause if the number is <=21.
所以整个代码是
Private Sub CommandButton1_Click()
RefreshBoard
End Sub


Public Sub RefreshBoard()

Dim RandVal As Integer
Dim Multiplier As Integer ' Not used

Dim rng As Range
For Each rng In Range("A1:AY51")
RandVal = ((28 * Rnd) + 1)

If rng.Value = "" Then
Select Case RandVal

Case 1, 3, 6, 7, 8, 12, 17, 18, 19, 20, 23, 25, 28

rng.Value = RefreshCell(rng.Value)
rng.Value = rng.Value + RandVal

Case 4, 5, 9, 10, 13, 14, 22
rng.Value = RefreshCell(rng.Value)
rng.Value = rng.Value + RandVal


Case 2, 11, 15, 21, 24, 26, 27
rng.Value = RefreshCell(rng.Value)

End Select

Next rng

End Sub


Public Function RefreshCell(ByVal ipCellValue As Variant) As Variant

If RandVal > 21 Then
RandVal = RandVal - (7 * 3)
ipCellValue = ipCellValue + RandVal
ElseIf RandVal > 14 Then
RandVal = RandVal - (7 * 2)
ipCellValue = ipCellValue + RandVal
ElseIf RandVal > 7 Then
RandVal = RandVal - 7
ipCellValue = ipCellValue + RandVal
End If

RefreshCell = ipCellValue

End Function
  • 您还不断地阅读和书写单个单元格。将 excel 范围复制到 VBA 数组并使用 VBA 数组会更有效。

  • 您将在刷新板方法结束时将更新的数组复制回 excel。
    数组的这种使用需要实现一个嵌套的 for 来迭代板单元,因为您不能写回由 a for each 生成的值,除非该值是一个对象并且您正在更改对象的内容。
    当您检查修改后的代码时,正如@timwilliams 所指出的,您可能有一些无关的代码行变得更加清晰。
    rng.Value = rng.Value + RandVal
    编辑以添加最后一点。我没有阅读规则,因此可能生成 RefreshCell 方法的事实可能反射(reflect)了您没有正确实现规则,因为您似乎将相同的代码应用于 1 到 28 之间的每个值。

    关于excel - 如果声明未正确适用于标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72831150/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com