我试图编写VBA代码来为列设置条件格式,这样当单元格包含小写和大写字母的混合时,请用黄色填充单元格。列号将由变量c确定。最后一行编号将由变量last_row确定。
以下代码无法正常工作。看起来LCase(xlCellValue)总是返回“1”而不是小写格式的单元格内容。因此,条件变为“CellValue<> 1”,这不符合我的意愿。
c = 1
last_row = 10
Range(Cells(1, c), Cells(last_row, c)). _
FormatConditions.Add(xlCellValue, xlNotEqual, LCase(xlCellValue)). _
Interior.ColorIndex = 6
所以我想我必须使用xlExpression而不是xlCellValue。但是我怎么写这个公式所以它需要变量c和last_row?谢谢!
答案 0 :(得分:1)
在这里,试试这个:
Sub test()
c = 1
last_row = 10
Range(Cells(1, c), Cells(last_row, c)). _
FormatConditions.Add(xlExpression, , "=NOT(Exact(" & Cells(1, c).Address(RowAbsolute:=False) & ",Lower(" & Cells(1, c).Address(RowAbsolute:=False) & ")))"). _
Interior.ColorIndex = 6
End Sub
我不知道与xlCellValue, xlNotEqual
的比较是否区分大小写;但是,Excel具有函数Exact
,其中 是区分大小写的比较。我添加了一个Not
,当字符串不是全部小写时,会使公式返回为true。由于这是使用Excel函数设置的,因此我还将Lcase
替换为Lower
。
注意:强>
使用你所遵循的逻辑,如果整个字符串是大写的,它也会变成黄色。如果您只想在混合情况下进行调节,则应使用以下代码:
Sub test()
c = 1
last_row = 10
Range(Cells(1, c), Cells(last_row, c)). _
FormatConditions.Add(xlExpression, , "=NOT(OR(Exact(" & Cells(1, c).Address(RowAbsolute:=False) & ",Lower(" & Cells(1, c).Address(RowAbsolute:=False) & ")),Exact(" & Cells(1, c).Address(RowAbsolute:=False) & ",Upper(" & Cells(1, c).Address(RowAbsolute:=False) & "))))"). _
Interior.ColorIndex = 6
End Sub
答案 1 :(得分:0)
您将格式条件添加到[ActiveSheet.]Range([ActiveSheet.]Cells(1, c), [ActiveSheet.]Cells(last_row, c))
- 您可以将其提取到本地变量中:
Dim target As Range
Set target = ActiveSheet.Range(ActiveSheet.Cells(1, c), ActiveSheet.Cells(last_row, c))
然后使用该变量来引用单元格:
Dim fCondition As FormatCondition
Set fCondition = target.FormatConditions.Add(xlCellValue, xlNotEqual, LCase$(target.Value))
看起来LCase(xlCellValue)总是返回" 1"而不是小写格式的单元格内容。
这是因为xlCellValue
是常量,值为1
。因此,LCase(xlCellValue)
相当于LCase(1)
,它始终只返回"1"
。