我是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