如果单元格区域包含文本,则更改工作表选项卡颜色
Change worksheet tab color if range of cells contains text
我已经尝试过我在 Whosebug 和其他地方找到的代码,但它们没有像我认为的那样工作。我将在下面列出它们。我几乎可以肯定这是一个简单的问题。
我正在尝试做的事情: 如果 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: 这是来自 Whosebug 的问题,虽然我稍微修改了代码以满足我的需要。具体来说,如果在设置的范围内没有值可以单独保留标签颜色,否则将其更改为颜色值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
感谢您的帮助!
我首先在 superuser 上发布了这个,但也许 Whosebug 更合适,因为它明确地与编程相关。
也许测试修剪后连接的单元格字符串的长度:
Private Sub Worksheet_Calculate()
If Len(Trim(Join(Application.Transpose(Range("A2:A100"))))) = 0 Then
ActiveWorkbook.ActiveSheet.Tab.Color = xlColorIndexNone
Else
ActiveWorkbook.ActiveSheet.Tab.Color = 6
End If
End Sub
每次 sheet 计算时都会触发此代码,因为它是事件代码,我不确定这是否是您想要的?如果没有,那么 post 回来,我们可以将它放入一个普通的子程序中,并让它轮询所有 sheet 进行测试。
每当目标范围发生变化时,Worksheet_Change 函数都会被调用。您只需要将代码放在工作表下。如果您已将代码放在模块或 Thisworkbook 中,那么它将无法工作。
将以下内容粘贴到工作簿的 Sheet1 中,并检查它是否有效。当然你需要修改下面的代码,因为我没有写完整的代码。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim WatchRange As Range
Dim IntersectRange As Range
Set WatchRange = Range("A1:A20")
Set IntersectRange = Intersect(Target, WatchRange)
If IntersectRange Is Nothing Then
''Here undo tab color
Else
ActiveSheet.Tab.ColorIndex = 6
End If
End Sub
只有两件事可以切换此语句中的条件:
If Range("A2:A100").Text = "" Then
您已经确定了它们,更改了工作表上该范围内的一个单元格的内容,或者这些单元格之一中的公式重新计算为值“”或从值“”重新计算。就事件触发器而言,如果公式结果发生变化, WorkSheet_Calculate 和 Worksheet_Change 事件都会触发。在这两者中,Worksheet_Change 是要响应的一个,因为 WorkSheet_Calculate 仅当 A2:A100 中的任何单元格包含公式时才会触发。如果它们仅包含值则不会 - 您的 "Code 2" 没有错,只是事件从未触发。
简单的解决方案是在打开工作簿时设置选项卡颜色。这样,如果您必须激活该范围内的单元格并更改它,没关系 - 只有这样,您测试的值才会发生变化。
我会这样做(ThisWorkbook 中的代码):
Option Explicit
Private Sub Workbook_Open()
Dim sheet As Worksheet
For Each sheet In Me.Worksheets
SetTabColor sheet
Next sheet
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not Intersect(Target, Sh.Range("A2:A100")) Is Nothing Then
SetTabColor Sh
End If
End Sub
Private Sub SetTabColor(sheet As Worksheet)
If sheet.Range("A2:A100").Text = vbNullString Then
sheet.Tab.Color = xlColorIndexNone
Else
sheet.Tab.Color = 6
End If
End Sub
编辑:要测试特定文本的存在,您可以做同样的事情,但需要让测试检查您正在监视的范围内的每个单元格。
Private Sub SetTabColor(sheet As Worksheet)
Dim test As Range
For Each test In sheet.Range("A2:A100")
sheet.Tab.Color = xlColorIndexNone
If test.Text = "whatever" Then
sheet.Tab.Color = vbRed
Exit For
End If
Next test
End Sub
我已经尝试过我在 Whosebug 和其他地方找到的代码,但它们没有像我认为的那样工作。我将在下面列出它们。我几乎可以肯定这是一个简单的问题。
我正在尝试做的事情: 如果 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: 这是来自 Whosebug 的问题,虽然我稍微修改了代码以满足我的需要。具体来说,如果在设置的范围内没有值可以单独保留标签颜色,否则将其更改为颜色值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
感谢您的帮助!
我首先在 superuser 上发布了这个,但也许 Whosebug 更合适,因为它明确地与编程相关。
也许测试修剪后连接的单元格字符串的长度:
Private Sub Worksheet_Calculate()
If Len(Trim(Join(Application.Transpose(Range("A2:A100"))))) = 0 Then
ActiveWorkbook.ActiveSheet.Tab.Color = xlColorIndexNone
Else
ActiveWorkbook.ActiveSheet.Tab.Color = 6
End If
End Sub
每次 sheet 计算时都会触发此代码,因为它是事件代码,我不确定这是否是您想要的?如果没有,那么 post 回来,我们可以将它放入一个普通的子程序中,并让它轮询所有 sheet 进行测试。
Worksheet_Change 函数都会被调用。您只需要将代码放在工作表下。如果您已将代码放在模块或 Thisworkbook 中,那么它将无法工作。
将以下内容粘贴到工作簿的 Sheet1 中,并检查它是否有效。当然你需要修改下面的代码,因为我没有写完整的代码。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim WatchRange As Range
Dim IntersectRange As Range
Set WatchRange = Range("A1:A20")
Set IntersectRange = Intersect(Target, WatchRange)
If IntersectRange Is Nothing Then
''Here undo tab color
Else
ActiveSheet.Tab.ColorIndex = 6
End If
End Sub
只有两件事可以切换此语句中的条件:
If Range("A2:A100").Text = "" Then
您已经确定了它们,更改了工作表上该范围内的一个单元格的内容,或者这些单元格之一中的公式重新计算为值“”或从值“”重新计算。就事件触发器而言,如果公式结果发生变化, WorkSheet_Calculate 和 Worksheet_Change 事件都会触发。在这两者中,Worksheet_Change 是要响应的一个,因为 WorkSheet_Calculate 仅当 A2:A100 中的任何单元格包含公式时才会触发。如果它们仅包含值则不会 - 您的 "Code 2" 没有错,只是事件从未触发。
简单的解决方案是在打开工作簿时设置选项卡颜色。这样,如果您必须激活该范围内的单元格并更改它,没关系 - 只有这样,您测试的值才会发生变化。
我会这样做(ThisWorkbook 中的代码):
Option Explicit
Private Sub Workbook_Open()
Dim sheet As Worksheet
For Each sheet In Me.Worksheets
SetTabColor sheet
Next sheet
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not Intersect(Target, Sh.Range("A2:A100")) Is Nothing Then
SetTabColor Sh
End If
End Sub
Private Sub SetTabColor(sheet As Worksheet)
If sheet.Range("A2:A100").Text = vbNullString Then
sheet.Tab.Color = xlColorIndexNone
Else
sheet.Tab.Color = 6
End If
End Sub
编辑:要测试特定文本的存在,您可以做同样的事情,但需要让测试检查您正在监视的范围内的每个单元格。
Private Sub SetTabColor(sheet As Worksheet)
Dim test As Range
For Each test In sheet.Range("A2:A100")
sheet.Tab.Color = xlColorIndexNone
If test.Text = "whatever" Then
sheet.Tab.Color = vbRed
Exit For
End If
Next test
End Sub