我正在处理一个表,其中插入了一些复选框(窗体控件),这些复选框链接到在选中任何一个复选框时返回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在底部添加新行
谢谢!
答案 0 :(得分: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
部分更改为其他内容,以避免循环引用。
答案 1 :(得分:0)
不要在Worksheet_Change
处启动着色子,而是将其放在Worksheet_Calculate
下。然后在工作表的某处插入公式=A1:Q21
(或覆盖范围的任何内容)。它将解析为#value
,但这并不重要。此公式将强制您的工作表在其范围内的任何内容(包括链接到您的复选框的单元格)发生更改时自动重新计算。然后重新计算后,它将触发为您的单元格正确着色的子程序。