【问题标题】:Automatic Sheet Calculation (Checkbox linked to cell)自动工作表计算(复选框链接到单元格)
【发布时间】:2019-09-05 07:34:08
【问题描述】:

我正在处理一个表格,在该表格中我插入了一些复选框(表单控件),这些复选框链接到在选中任一复选框时返回 True 或 False 的单元格。 我写了一个代码,应该根据返回的值改变单元格的颜色。 代码工作正常,但只有当我双击单元格并通过按 Enter 验证,或者当我通过按 F5 或单击按钮运行 Sub 时。 (我使用了一个类似的代码,在另一个项目中自动更新所有内容,但在这里似乎不起作用)

勾选复选框后,如何使 Sub 自动运行(或工作表更新)?

代码如下:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Range("A2:Q21"), Range(Target.Address)) Is Nothing Then

        Dim cell As Range

        For Each cell In ActiveWorkbook.Sheets("Sheet1").Range("A2:Q21")

            If cell.Value = "True" Then
                cell.Interior.Color = vbGreen
            ElseIf cell.Value = "False" Then
                cell.Interior.Color = vbRed
            End If
        Next
End Sub

我知道我可以使用条件格式,但这张表格会迅速扩大,而且我看不到自己复制粘贴数百个复选框

随着工作表的展开,我认为最好包含“lastRow”语句,因为我将使用 UserForm 在底部添加新行

谢谢!

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您应该将进行着色的部分提取到一个新函数中,并从原始函数和复选框的事件处理程序中调用它。

    ' In Sheet1 Module
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Application.Intersect(Range("A2:Q21"), Range(Target.Address)) Is Nothing Then
            ColorCells
        End If
    End Sub
    
    
    ' In Module1 Module
    
    Sub CheckBox1_Click()
        ColorCells
    End Sub
    
    Public Sub ColorCells()
        Dim cell As Range
    
        For Each cell In ActiveWorkbook.Sheets("Sheet1").Range("A2:Q21")
    
            If cell.Value = "True" Then
                cell.Interior.Color = vbGreen
            ElseIf cell.Value = "False" Then
                cell.Interior.Color = vbRed
            End If
        Next
    End Sub
    

    更新

    如果复选框太多,您可以使用工作表的计算事件处理程序,假设复选框具有链接单元格并且其他一些单元格引用它们的值。

    ' In Sheet1 Module
    
    Private Sub Worksheet_Calculate()
        ColorCells
    End Sub
    

    注意,如果复选框没有链接单元格,它将不起作用。如果复选框有一个链接单元格但没有被任何其他单元格引用,它将不起作用。这是因为在这些情况下不会启动重新计算。

    您可以对此进行测试:将 A1 分配给复选框(在新工作表上),并尝试宏是否运行(不应该),然后写入 A2 =2*--A1,再次检查,现在它应该可以工作了。

    如果您想最小化此要求的占用空间,请在工作表上找到一个未使用的单元格并输入以下公式:=INDEX(1:1048576,1,1)。这是指所有单元格,但不需要冗长的计算。当然,如果你想把它放到A1中,你应该把,1,1部分改成别的,避免循环引用。

    【讨论】:

    • 嗯,我怕有人会这么说。因此,如果工作表中有 3000 个复选框,我将不得不从每个复选框子中调用 ColorCells?
    • @MikeRophone 你希望计算立即发生吗?如果没有,您可以编写一个快速循环,每隔一段时间或按下按钮时遍历整个工作表。
    • 理想情况下,只要工作表内发生任何变化,就应该进行计算
    • @MikeRophone 任何需要重新计算的内容,请参阅我更新的答案以了解详细信息。
    【解决方案2】:

    不要在Worksheet_Change 上触发你的着色子,而是将它放在Worksheet_Calculate 下。然后在工作表的某处插入公式=A1:Q21(或任何你需要覆盖你的范围的东西)。它将解析为#value,但这并不重要。此公式将强制您的工作表在其范围内的任何内容发生更改时自动重新计算,包括链接到复选框的单元格。然后在重新计算时,它会触发正确为您的单元格着色的子。

    【讨论】:

    • 或者只看@z32a7ul 编辑以获得更完整的解释。
    猜你喜欢
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多