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”,则单元格(

目标是突出显示满足两种不同条件的行:

  • 如果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”,则单元格(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