【问题标题】:Excel vba if cell value is included in another worksheet如果单元格值包含在另一个工作表中,则 Excel vba
【发布时间】:2018-03-29 00:19:07
【问题描述】:

我有名为“1Q FY 18”的工作表,这是第二张表,“Holiday”是第七张表。

“1Q FY 18”的第 12 行包含从 4 月 1 日到 6 月 30 日的日期。 从“B20”到“B35”的单元格包含 2018 年的假期。

我想突出显示第二张工作表中在 range("B20:B35") 处具有匹配值的列。换句话说,我想为假日列着色。

我的代码是这样的。

   Sub Holiday()
    lastr = Worksheets(2).UsedRange.Rows.Count
    lastc = Worksheets(2).UsedRange.Columns.Count
    Worksheets(2).Activate
    Set ws7 = Worksheets("Holiday")
    Set rng1 = ws7.Range("B20:B35")
    For i = 15 To lastc
    If Not IsEmpty(Application.WorksheetFunction.VLookup(Cells(12, i).Value, rng1, 1)) Then
    Range(Cells(13, i), Cells(lastr - 2, i)).Interior.ColorIndex = 6
    End If
    Next i
    End Sub

但是这个错误发生了。 当我调试时,它会突出显示

****如果不是 IsEmpty(Application.WorksheetFunction.VLookup(Cells(12, i).Value, rng1, 1)) 那么****

我该怎么办?

【问题讨论】:

  • 什么是lastc?你没有定义lastc
  • 为什么不用 networkdays.intl 进行条件格式化?
  • 如果在rng1中没有找到该值,则会出错,不返回空对象,并停止代码。您将需要处理该错误。这个网站上有很多关于如何处理的答案。
  • @ScottCraner 我尝试使用“IsError”,但它仍然无法正常工作。你能指出我正确的方向吗?
  • @PaichengWu 我刚刚做了

标签: vba excel


【解决方案1】:

这是一个简单的宏,可以按照您的描述进行操作。我在其中放置了一个.select 语句,因此您可以单步执行代码以查看它是如何工作的,但之后您应该将其删除。一旦了解了它的工作原理,您就可以根据自己的需要进行更改。如果您有任何问题,请告诉我。动画 gif 显示工作簿的每个工作表,然后运行宏。在我的示例中,我刚刚选择了每周的假期,但您可以更改它。我还包括一个子来方便地重置颜色。 (你说你想“给列上色”,但我只是给单元格上色。如果你真的想给整个列上色,你可以用Columns(cell.Column).interior...替换cell.interior..和r.interior...)

Sub test()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim r1 As Range, r2 As Range, cell As Range, holidayCell As Range
Set sh1 = Worksheets("1Q FY 18")
Set sh2 = Worksheets("Holiday")
Set r1 = sh1.Range("A12")
Set r1 = sh1.Range(r1, r1.End(xlToRight))
Set r2 = sh2.Range("B20:B35")
resetColor r1
For Each cell In r1
  cell.Select
  For Each holidayCell In r2
    If cell = holidayCell Then
      cell.Interior.Color = vbYellow
      Exit For
    End If
  Next
Next cell
End Sub

Sub resetColor(r As Range)
    With r.Interior
        .Pattern = xlNone
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End Sub

【讨论】:

  • 首先,谢谢你这么好的描述。这对我帮助很大!!但问题是我必须突出显示从具有日期的单元格下方的一行开始的列。这就是为什么我不能使用“For Each”命令的原因。还有其他想法吗??
  • 在 StackOverflow 上“感谢”的方法是单击向上箭头,或者更好的是,如果您觉得您的问题得到了解答,请勾选复选标记。如果您想从可以轻松完成的日期下方的一行开始突出显示 - 但您想为其下方的所有单元格着色吗?
  • 如果您确实想为日期单元格下方的所有单元格着色,则在该行之后:“If cell = holidayCell Then”放入这两行:“Columns(cell.Column).Interior.Color = vbYellow " & "resetColor sh1.Range(cell, cell.End(xlUp))"
  • 感谢您的提示!这是我第一次在 SO 上发帖。我只想突出显示单元格,直到使用的最后一行。这就是我使用“lastr”的原因。
  • 我认为您的意思是要突出显示日期下方的单元格,然后继续向下直到到达空白单元格之前。如果是这样,此代码将为这些单元格着色: sh1.Range(cell.offset(1,0), cell.end(xlDown)).Interior.Color = vbYellow"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 2021-10-10
  • 2022-10-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多