Excel 宏/VBA:基于2个条件高亮显示行
目标是突出显示满足两种不同条件的行:Excel 宏/VBA:基于2个条件高亮显示行,excel,vba,Excel,Vba,目标是突出显示满足两种不同条件的行: 如果A列等于前一个工作日(考虑参考表中提到的节假日) 如果B列不等于“AA” 我有以下代码,但无法突出显示相应的行(由于不满足条件#1,没有行突出显示): 子代码() 暗淡的光线和长的一样 lrow=单元格(Rows.Count,“A”)。结束(xlUp)。行 对于i=2至lrow 如果单元格(i,“A”).Value=“=WORKDAY(today(),-1,Reference!$A$2:$A$12)”和单元格(i,“B”).Value“AA”,则单元格(
子代码()
暗淡的光线和长的一样
lrow=单元格(Rows.Count,“A”)。结束(xlUp)。行
对于i=2至lrow
如果单元格(i,“A”).Value=“=WORKDAY(today(),-1,Reference!$A$2:$A$12)”和单元格(i,“B”).Value“AA”,则单元格(i,1).EntireRow.Interior.ColorIndex=6
接下来我
端接头
您可以尝试以下方法:
Option Explicit
Sub code()
Dim i As Long, lrow As Long
Dim objRangeHolidays As Range
Set objRangeHolidays = Worksheets("Reference").Range("$A$2", "$A$12")
lrow = Cells(rows.Count, "A").End(xlUp).row
For i = 2 To lrow
If CDate(Cells(i, "A").Value) = CDate(Application.WorksheetFunction.WorkDay(Date, -1, objRangeHolidays)) And Cells(i, "B").Value <> "AA" Then
Cells(i, 1).EntireRow.Interior.ColorIndex = 6
End If
Next i
Set objRangeHolidays = Nothing
End Sub
选项显式
子代码()
暗我一样长,浅我一样长
Dim OBJRANGAS范围
设置objRangeHolidays=工作表(“参考”)。范围($A$2,“$A$12”)
lrow=单元格(rows.Count,“A”)。结束(xlUp)。行
对于i=2至lrow
如果CDate(单元格(i,“A”).Value)=CDate(Application.WorksheetFunction.WorkDay(Date,-1,objRangeHolidays))和单元格(i,“B”).Value“AA”,则
单元格(i,1).EntireRow.Interior.ColorIndex=6
如果结束
接下来我
设置objRangeHolidays=Nothing
端接头
您的原始代码不能作为“=WORKDAY(today(),-1,Reference!$A$2:$A$12)”工作。
是VBA上的文本字符串,而不是函数调用
我们使用CDate()
WorksheetFunction.Today()
与VBA中的Date()
相同
objRangeHolidays
保存参考
工作表中定义的假日
这是我的测试结果:
高亮显示整行
- 调整常量部分中的值
选项显式
次高光上一个工作日()
"来源:
Const sName As String=“Sheet1”
Const sFirst As String=“A2”
Const sCritCol As String=“B”
常量sCriteria为String=“AA”
常数sColorIndex,长度=6
“假日
Const hName As String=“Reference”
常量hFirst为String=“A2”
'工作簿
将wb设置为工作簿:设置wb=ThisWorkbook包含此代码的工作簿
wb.Activate'`Evaluate`如果不处于活动状态,则将失败。
"来源:
变暗srg As范围
带wb.工作表(sName).范围(sFirst)
暗淡的SLAS范围
设置slCell=.Resize(.Worksheet.Rows.Count-.Row+1)_
.Find(“*”,xlFormulas,,xlPrevious)
如果slCell为空,则退出Sub
设置srg=.Resize(slCell.Row-.Row+1)
以
“假日
朦胧的假日
带wb.工作表(hName).范围(hFirst)
暗淡的HLAS范围
设置hlCell=.Resize(.workeep.Rows.Count-.Row+1)_
.Find(“*”,xlFormulas,,xlPrevious)
如果不是的话,那细胞就什么都不是了
Holiday=“,”&hName&“!”_
&.调整大小(hlCell.Row-.Row+1).地址
如果结束
以
"评估",
作为变量的日期
evDate=Evaluate(“工作日(今天(),-1“&假日”)
“联合收割机
变暗drg As范围
如果VarType(evDate)=vbDouble,则
暗sCell As范围
作为变量的Dim-sValue
将字符串变暗为字符串
对于srg.单元中的每个sCell
sValue=sCell.Value
如果VarType(sValue)=vbDate,则
如果CDbl(S值)=evDate,则
sString=CStr(sCell.EntireRow.Columns(sCritCol.Value))
如果是斯特里亚那么
设置drg=getCombinedRange(drg,sCell)
如果结束
如果结束
如果结束
下一节
如果结束
“颜色
Application.ScreenUpdating=False
srg.EntireRow.Interior.ColorIndex=xlNone
如果不是drg,那么什么都不是
drg.EntireRow.Interior.ColorIndex=sColorIndex
如果结束
Application.ScreenUpdating=True
端接头
函数getCombinedRange(_
比瓦尔建筑范围作为范围_
ByVal AddRange作为范围)_
As范围
如果BuiltRange什么都不是,那么
设置getCombinedRange=AddRange
其他的
设置getCombinedRange=Union(BuiltRange,AddRange)
如果结束
端函数
我建议您使用单独的函数查找上一个工作日,然后在比较中使用该结果。而不是单元格(I,“a”)。Value=“=WORKDAY(…)”
关于单元格(I,“a”)。Value=Application.Evaluate(“WORKDAY(…)”
Option Explicit
Sub code()
Dim i As Long, lrow As Long
Dim objRangeHolidays As Range
Set objRangeHolidays = Worksheets("Reference").Range("$A$2", "$A$12")
lrow = Cells(rows.Count, "A").End(xlUp).row
For i = 2 To lrow
If CDate(Cells(i, "A").Value) = CDate(Application.WorksheetFunction.WorkDay(Date, -1, objRangeHolidays)) And Cells(i, "B").Value <> "AA" Then
Cells(i, 1).EntireRow.Interior.ColorIndex = 6
End If
Next i
Set objRangeHolidays = Nothing
End Sub