为啥我会从 VBA Select Case 获得随机/错误的输出?
Posted
技术标签:
【中文标题】为啥我会从 VBA Select Case 获得随机/错误的输出?【英文标题】:Why do I get random/wrong output from VBA Select Case?为什么我会从 VBA Select Case 获得随机/错误的输出? 【发布时间】:2019-11-20 19:05:28 【问题描述】:我对下面的代码有疑问。我刚刚开始学习这个,当我做了一个简单的练习时,结果发现代码真的很随机。
有时什么都不做,有时只选择一种情况,但从未应用正确的格式。我很困惑。
你能帮忙解决这个问题吗? ;)
Sub Colors()
Dim Check As String
Check = ActiveCell.Value
Range("A2").Select
Do While ActiveCell.Value <> ""
Select Case Check
Case "Red"
ActiveCell.EntireRow.Interior.Color = RGB(200, 100, 100)
Case "Blue"
ActiveCell.EntireRow.Interior.Color = RGB(100, 100, 200)
Case "Green"
ActiveCell.EntireRow.Interior.Color = RGB(100, 200, 100)
End Select
ActiveCell.Offset(1, 0).Select
Loop
End Sub
【问题讨论】:
强烈建议您阅读this question。 这完全取决于您在工作表上的数据以及您的期望。您能否提供一个数据示例? 这个过程被调用时的ActiveCell
地址是什么,它的值是多少?请注意,Check
对于循环的每次迭代都是常量...
如果这是错误的,您期望的行为是什么?
现在,此代码正在获取您在开始运行时碰巧选择的任何单元格的值,并将其存储在Check
中。然后,从单元格 A2 开始,它使用颜色为列 A 的单元格着色,具体取决于来自最初选择的单元格的值。一旦它碰到一个有值的单元格,它就会停止。这就是你的意思吗?
【参考方案1】:
Check
在循环的每次迭代中都保持不变,因此 Select Case Check
总是计算相同的值,并且此过程的执行结果仅取决于恰好是 ActiveCell
的任何单元格的值调用过程的时间。
Avoid Select and Activate,但要解决您当前的直接问题,您需要在此处将 Check
替换为 ActiveCell
,并可能显式调用其 Value
成员:
Select Case ActiveCell.Value
Check
分配变得多余,现在循环将依次激活从 A2 开始的单元格,评估其内容,并相应地设置内部颜色。
这也可以在没有任何 VBA 代码的情况下使用应用于整行的条件格式规则来实现。考虑改用条件格式。
【讨论】:
非常感谢您的回复。我理解您的观点并检查了它 - 它有效,但是我不明白为什么分配有ActiveCell.Value
的 Check
变量给出的输出与 Select Case
中使用的普通 ActiveCell.Value
不同。
@JakubTracz Check
在循环之前被分配一次,然后再也不会重新分配:它在每次迭代时仍然保持完全相同的单元格引用 - Check
不会神奇地“保持” up" 与ActiveCell
是什么,而循环体不断激活不同的单元格。不要对自己这样做 - 避免选择/激活,您将不必处理此类问题。以上是关于为啥我会从 VBA Select Case 获得随机/错误的输出?的主要内容,如果未能解决你的问题,请参考以下文章
使用C#如何表达VBA“select case control.ID”