我试过在 SE 和其他地方找到的代码,但它们并没有像我想的那样工作。我会在下面列出它们。我几乎可以肯定这是一个简单的问题。
我正在尝试做的事情:如果 A2:A100 范围内的任何单元格中有任何文本或数字,则将工作表选项卡设为黄色。我需要在 20 多个选项卡上执行此操作。
我在其他代码中遇到的问题:据我所知,它们需要编辑单元格,然后快速再次按下回车键。我尝试使用 SHIFT + F9 重新计算,但这没有效果,因为我认为这仅适用于公式。代码 1 似乎有效,尽管必须手动重新输入文本,但无论颜色值是什么,我总是得到黑色的标签颜色。
我尝试过的代码:
代码1:
Private Sub Worksheet_Change(ByVal Target As Range)
MyVal = Range("A2:A27").Text
With ActiveSheet.Tab
Select Case MyVal
Case ""
.Color = xlColorIndexNone
Case Else
.ColorIndex = 6
End Select
End With
End Sub
代码2:这是来自堆栈溢出问题,尽管我稍微修改了代码以满足我的需求。具体来说,如果在设置范围内没有值,则保留标签颜色,否则将其更改为颜色值 6。但我肯定我做错了什么,我不熟悉 VBA 编码。
Private Sub Worksheet_Calculate()
If Range("A2:A100").Text = "" Then
ActiveWorkbook.ActiveSheet.Tab.Color = xlColorIndexNone
Else
ActiveWorkbook.ActiveSheet.Tab.Color = 6
End If
End Sub
感谢您的帮助!
答案1
在这两种情况下,您使用的range.text
都是字符串变量,它只会为您提供范围内第一个单元格中的文本,您需要更复杂的代码。如果我理解正确的话,您只是想测试您跨越的内容是否不为空并且对内容不感兴趣。以下是设置标准的一些提示:
使用 worksheetfunction 获取非空单元格的数量:
worksheetfunction.counta("A2:A100")>0
或者使用方法转到范围内的下一个非空单元格
end()
。
答案2
您可能需要使用以下事件:
Private Sub Worksheet_Change(ByVal Target As Range)
代替:
Worksheet_Calculate()
如果您有代码Worksheet_Calculate
,如果工作表不需要重新计算(即工作表中没有带有公式的单元格),它可能不会执行
将其粘贴到您需要设置的工作表的代码窗口中:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRange As Range
Set myRange = ActiveSheet.Range("A2:A100")
If Application.WorksheetFunction.CountBlank(myRange) = 99 Then
ActiveWorkbook.ActiveSheet.Tab.Color = xlColorIndexNone
Else
ActiveWorkbook.ActiveSheet.Tab.Color = vbRed
End If
End Sub
这使用了COUNTBLANK
如下函数这里。
您也可以使用下面的代码:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRange As Range
Set myRange = ActiveSheet.Range("A2:A100")
If Application.WorksheetFunction.CountA(myRange) = 0 Then
ActiveWorkbook.ActiveSheet.Tab.Color = xlColorIndexNone
Else
ActiveWorkbook.ActiveSheet.Tab.Color = vbRed
End If
End Sub
这使用COUNTA
描述的函数这里
COUNTBLANK
和公式COUNTA
看起来似乎是相反的。然而,我注意到了两个不同之处:
COUNTBLANK
将具有公式但未返回任何值的单元格视为空白。COUNTA
将此类单元格视为非空白。此类公式的一个简单示例为:=IF(1=1,"","test")
。此公式计算结果为不返回任何值。COUNTA
支持不连续的单元格范围。COUNTBLANK
不支持。
要在工作簿打开时更新选项卡颜色:
Worksheet_Change
您可以在每个工作表代码部分的函数内使用上述相同的代码Worksheet_Calculate
。
或者您可以将以下内容添加到工作簿代码窗口:
Private Sub Workbook_Open()
Call Sheet1.Worksheet_Change(ActiveSheet.Range("A1"))
Call Sheet2.Worksheet_Change(ActiveSheet.Range("A1"))
'Add lines of code for each sheet that you need the tab colors updated for. If you need tab colors updated for ALL sheets, you can loop through the sheets and call `Worksheet_Change` as well.
End Sub