1

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

我想要做的是将索引中的颜色应用到包含特定术语的单元格内部。这是我所拥有的:

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)。

任何帮助将不胜感激。

特伦顿

4

2 回答 2

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然后将其设为大写以与您的标记值进行比较。

于 2012-06-27T17:09:48.587 回答
1

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

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

此宏将任何单元格变为 ColorIndex 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
于 2012-06-27T17:15:10.287 回答