为啥我会从 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.ValueCheck 变量给出的输出与 Select Case 中使用的普通 ActiveCell.Value 不同。 @JakubTracz Check 在循环之前被分配一次,然后再也不会重新分配:它在每次迭代时仍然保持完全相同的单元格引用 - Check 不会神奇地“保持” up" 与ActiveCell 是什么,而循环体不断激活不同的单元格。不要对自己这样做 - 避免选择/激活,您将不必处理此类问题。

以上是关于为啥我会从 VBA Select Case 获得随机/错误的输出?的主要内容,如果未能解决你的问题,请参考以下文章

VBA select case 练习

使用C#如何表达VBA“select case control.ID”

VBA Select case 1 to 100 只取 1

为啥从子组件返回时我会从查询结果中获得空指针?

使用 case 语句从 SELECT 更新记录。 (mysql)

是否可以根据表中的条目数将案例添加到 Select Case 中?