如果单元格区域包含文本,则更改工作表选项卡的颜色

我已经尝试了我在这里find的代码,在其他地方,但他们不工作,因为我认为他们可以。 我会在下面列出。 我几乎可以肯定这是一个简单的问题。

我在做什么:如果在A2:A100范围内的任何单元格中都有任何文本或数字,请将工作表选项卡设置为红色。 而且我需要在20多个标签上做这个。 这必须在打开工作簿时执行,因此不需要手动更改单元格或重新计算。

我用其他代码所遇到的问题:据我所知,他们需要编辑一个单元格,然后再次快速地input。 我试过SHIFT + F9来重新计算,但这没有效果,因为我认为这只是公式。 代码1似乎工作,虽然不得不手动重新input文字,但无论什么颜色值,我总是得到一个黑色的标签颜色。

我试过的代码:

代码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 

谢谢你的帮助!

我首先发布了这个超级用户 ,但可能stackoverflow更合适,因为它是明确的编程相关。

只有两件事情可以在这个声明中切换条件:

 If Range("A2:A100").Text = "" Then 

您已经确定了他们两个,在工作表上更改该范围内某个单元格的内容,或者在其中一个单元格中重新计算“”的值的公式。 就事件触发器而言,如果公式结果发生变化,则WorkSheet_Calculate和Worksheet_Change事件都将触发。 其中,Worksheet_Change是要回应的,因为只有在A2:A100中的任何单元格包含公式时,WorkSheet_Calculate才会触发。 不是,如果他们只包含值 – 你的“代码2”没有错,事件只是从来没有射击。

简单的解决方法是在打开工作簿时设置选项卡的颜色。 这样,如果您必须激活该范围内的某个单元格并对其进行更改,那么这并不重要 – 只有这样,您所testing的值才会发生变化。

我会做这样的事情(在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 

编辑:为了testing是否存在特定的文本,你可以做同样的事情,但需要testing检查您正在监视的范围内的每个单元格。

 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 

也许testing修剪后的连接string的len:

 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 

这个代码每次计算时都会触发,因为它是事件代码,我不知道这是你想要的吗? 如果没有,然后回发,我们可以把它放到一个正常的子你,并让它轮询所有的表来testing。

每当目标范围发生变化时,Worksheet_Changefunction将被调用。 您只需要将代码放在Worksheet下。 如果你把代码放在模块或者这个工作簿中,那么它就不能工作。

将以下粘贴到工作簿Sheet 1中,并检查它是否工作。 当然你需要修改下面的代码,因为我没有写完整的代码。

 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