我已经尝试过在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更合适,因为它明确地与编程相关。
答案 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