如果单元格范围包含文本,请更改工作表选项卡颜色

时间:2015-04-13 03:36:07

标签: excel vba excel-vba excel-2010

我已经尝试过在stackoverflow上找到的代码,以及其他地方,但它们并没有像我认为的那样工作。我将在下面列出它们。我几乎可以肯定这是一个简单的问题。

我正在尝试做什么:如果在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:这是来自stackoverflow的问题,虽然我稍微修改了代码以满足我的需求。具体来说,如果在设定范围内没有值单独留下标签颜色,否则将其更改为颜色值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上发布了这个,但也许stackoverflow更合适,因为它明确地与编程相关。

3 个答案:

答案 0 :(得分:0)

也许测试修剪的连接细胞串的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

此代码将在每次计算工作表时触发,因为它是事件代码,我不确定这是否是您想要的?如果没有,那么回发,我们可以将它放入一个普通的子程序中,并让它轮询所有的表格进行测试。

答案 1 :(得分:0)

只要目标范围发生变化,就会调用Worksheet_Change函数。您只需将代码放在Worksheet下即可。如果您已将代码放在模块或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

答案 2 :(得分:0)

只有两件事能够在此声明中切换条件:

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

您已经识别了它们,更改了工作表中该范围内某个单元格的内容,或者其中一个单元格中的公式重新计算了"的值? #34 ;.就事件触发器而言,如果公式结果发生变化, 两者 将触发WorkSheet_Calculate和Worksheet_Change事件。在这两个中,Worksheet_Change是要响应的,因为只有A2:A100中的任何单元格包含公式时才会触发WorkSheet_Calculate。如果他们只包含价值观,那就不是 - 你的"代码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