条件格式 - 如何引用单元格本身?

时间:2018-05-14 18:29:33

标签: vba excel-vba excel

我试图编写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?谢谢!

2 个答案:

答案 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"