如果活动单元格等特定文本,则应用内部颜色 - VBA



我是StackOverflow和VBA的新手。我是 Excel 各个方面的专家,除了从头开始用 VBA 编写代码。

我正在尝试做的是将索引中的颜色应用于单元格的内部(如果它包含特定术语)。这是我所拥有的:

Sub ConditionalFormatting()
Do Until ActiveCell = ""
If ActiveCell = "STAR DISTRICT" Then
ActiveCell.Interior.ColorIndex = 50
ElseIf ActiveCell = "STAR SCHOOL" Then
ActiveCell.Interior.ColorIndex = 50
ElseIf ActiveCell = "HIGH PERFORMING" Then
ActiveCell.Interior.ColorIndex = 43
ElseIf ActiveCell = "SUCCESSFUL" Then
ActiveCell.Interior.ColorIndex = 34
ElseIf ActiveCell = "ACADEMIC WATCH" Then
ActiveCell.Interior.ColorIndex = 38
ElseIf ActiveCell = "LOW PERFORMING" Then
ActiveCell.Interior.ColorIndex = 22
ElseIf ActiveCell = "AT RISK OF FAILING" Then
ActiveCell.Interior.ColorIndex = 18
ElseIf ActiveCell = "FAILING" Then
ActiveCell.Interior.ColorIndex = 3
Else: ActiveCell.Interior.ColorIndex = 1
End If
ActiveCell.Offset(1, 0).Select
Loop
End Sub

选项包括:星区或学校,高性能,成功的学术观察,低性能,有失败的风险,失败

此代码适用于一列(底部两个术语除外),但它不适用于工作表中的其他任何位置。当我在其他任何地方尝试时,无论单元格包含什么,所有单元格都会变成黑色(或 ColorIndex = 1)。

任何帮助将不胜感激。

特伦顿

如果在 Excel 电子表格中看到输入数据,很难确切地说出为什么会这样:

This code works for one column (except for the bottom two terms) but it will not work anywhere else in the worksheet. When I try it anywhere else, all of the Cells turn Black (or ColorIndex = 1) no matter what the cell contains.

但是,默认情况下,VBA中的字符串比较是二进制比较,这意味着它将区分大小写,并且您正在ActiveCell与各种大写字符串进行比较。 如果您的 Excel 电子表格包含除所有大写字母以外的任何内容,则所有测试都将失败。

您需要做以下两件事之一。 首先,可以将Option Compare Text添加到代码表的顶部。 这会将所有比较更改为Text,而不是Binary比较。

或者,您可以将每个ActiveCell包装在 UCASE 函数中,该函数将在执行比较之前将活动单元格中的任何值大写:

If UCase(ActiveCell) = "STAR DISTRICT" Then
...
ElseIf UCase(ActiveCell) = "STAR SCHOOL" Then
...
...
...
End If

编辑:

正如您在评论中提到的,问题是单元格值中的尾随空格,适当的代码修复是将ActiveCell包装在Trim函数中。 您可以将函数嵌套在彼此内部,例如:

If UCase(Trim(ActiveCell)) = "STAR DISTRICT" Then
...
ElseIf UCase(Trim(ActiveCell)) = "STAR SCHOOL" Then
...
...
...
End If

这将从 ActiveCell 中的值中修剪任何尾随和前导空格,然后将其设置为大写以与标记的值进行比较。

好吧,

我不确定您要在哪个范围内应用此代码。根据我在您的代码中看到的内容,您希望 VBA 在 ActiveCell 上应用此"格式",然后选择下面的另一个单元格并重复"条件格式"过程,然后选择另一个单元格(带 ActiveCell.Offset(1, 0).Select ),依此类推,直到它偶然发现第一个空单元格。

为此,代码应该基本上可以工作(我已经尝试过了),并根据您的条件更改它处理的单元格的内部颜色索引。由于此宏适用于从 ActiveCell 到最后一个非空单元格的一列中的单元格,我不明白您打算如何在两列上使用它。

此宏将任何单元格转换为 ColorIndex of 1 的原因可能只是因为它包含不属于"条件列表"的文本。还要记住,大写和小写是不同的字符,因此单元格中的值必须与代码中的单词/字符串完全大写/小写匹配,或者您可以增强代码以将单词中的所有字母转换为大写(例如使用 UCase

您可以尝试以下代码,它将有问题的格式应用于所选范围内的每个单元格:

Sub ConditionalInteriorColor()
Dim r As Range
Dim cell As Range
Dim index As Integer
Dim word As String
    'Set the targeted range to be the selected range
Set r = Selection
For Each cell In r
    word = UCase(cell.Value)
    'Choose index
    Select Case word
        Case "STAR DISTRICT"
            index = 50
        Case "STAR SCHOOL"
            index = 50
        Case "HIGH PERFORMING"
             index = 43
        Case "SUCCESSFUL"
             index = 39
        Case "ACADEMIC WATCH"
            index = 38
        Case "LOW PERFORMING"
             index = 22
        Case "AT RISK OF FAILING"
            index = 20
        Case "FAILING"
            index = 3
        Case Else
            index = 3
    End Select
    'Color interior of cell
    cell.Interior.ColorIndex = index
Next
End Sub

最新更新