【问题标题】:Macros for Comapring columns with dates and Id and highlighting them用于将列与日期和 Id 进行比较并突出显示它们的宏
【发布时间】:2017-06-20 14:54:28
【问题描述】:

我有 A、B、D、E 列 A 列包含 ID,B 列仅包含匹配的 ID。 (有时在 B 列中找不到 ID)并且 D 列包含源日期,E 列包含开始日期。(E 列有时没有任何日期)

我需要比较日期并将结果粘贴到项目已启动的 f 列中。

我有 4 个案例。

案例 1. 如果源日期小于开始日期的 4 周,则按时打印 Project。

案例 2:如果源日期是开始日期的 > 8 周,则打印 Project delay。

案例 3:如果在 A 和 B 列中存在 Id 并且在 E 列中没有找到开始日期,那么它应该打印剩余项目。

案例 4:B 列中没有 id,也没有找到源日期,然后什么也不打印。

我已经编写了比较日期的代码,但我很惊讶在案例 3 中我应该如何将它与 Id 进行比较。

Sub dateCompare()

Dim r As Long, zLastRow As Long
Dim zWeeks As Double, zcolour As Long
Dim Ztext  As String

zLastRow = Cells(Rows.Count, "D").End(xlUp).Row

For r = 2 To zLastRow
    If Len(Trim(Cells(r, "E"))) = 0 Then

    Cells(r, 6) = " Remaining"
    Cells(r, 6).Interior.Color = vbYellow
    Cells(r, 7) = "Yellow"
   Else
    zWeeks = DateDiff("w", Cells(r, "D"), Cells(r, "E"))

        Select Case zWeeks
            Case Is > 8
                zcolour = vbRed
                Ztext = "Delayed " & Int(zWeeks) & " weeks"
                Cells(r, 7) = "Red"
            Case Is < 4
                zcolour = vbGreen
                Ztext = " On- Time"
                Cells(r, 7) = " Green"

          Case 4 To 8
          zcolour = vbYellow
          Ztext = "Remaining"
          Cells(r, 7) = "Yellow"

            Case Else
                zcolour = none
                Ztext = " check for dates"
        End Select

        Cells(r, "F").Interior.Color = zcolour
        Cells(r, "F") = Ztext
    End If
Next r

End Sub

【问题讨论】:

  • 你真的需要保存这些颜色吗?否则,条件格式是一种更简单的方法。
  • 我需要保存那些颜色,因为在我评估的后期阶段我正在使用它们。 @约瑟夫霍普
  • 为什么是 VBA 而不是 Excel 公式 :)
  • 因为我想用vb练习。这就是为什么:) @SiddharthRout
  • 顺便说一句,DateDiff("w", Cells(r, "D"), Cells(r, "E")) 几周内你必须使用“ww”而不是“w”

标签: vba excel


【解决方案1】:

案例 1. 如果源日期小于开始日期的 4 周,则按时打印 Project。

=IF(IFERROR(DATEDIF(D2,E2,"d")/7,5)<4,"Project in Time","-")

案例 2:如果源日期是开始日期的 > 8 周,则打印 Project delay。

=IF(IFERROR(DATEDIF(E2,D2,"d"),7)/7>8,"Project Delay","-")

案例 3:如果 A 列和 B 列中存在 Id,并且 E 列中没有找到开始日期,则应打印剩余项目。

=IF(AND(A2<>"",B2<>""),IF(E2="","Project remaining",""),"")

案例4:B列中没有id,也没有找到源日期,那么什么都不打印。

=IF(AND(B2="",D2=""),"Nothing","")

现在您有 4 个公式。只需加入他们,您将获得

=IF(AND(B2="",D2=""),"Nothing",IF(AND(A2&lt;&gt;"",B2&lt;&gt;""),IF(E2="","Project remaining",IF(IFERROR(DATEDIF(E2,D2,"d"),7)/7&gt;8,"Project Delay",IF(IFERROR(DATEDIF(D2,E2,"d")/7,5)&lt;4,"Project in Time",""))),""))

要在 VBA 中使用它,只需这样做

With Range("F2:F" & zLastRow)
    .Formula = "=IF(AND(B2="""",D2=""""),""Nothing"",IF(AND(A2<>"""",B2<>"""")," & _
               "IF(E2="""",""Project remaining"",IF(IFERROR(DATEDIF(E2,D2,""d"")," & _
               "7)/7>8,""Project Delay"",IF(IFERROR(DATEDIF(D2,E2,""d"")/7,5)<4" & _
               ",""Project in Time"",""""))),""""))"
    .Value = .Value
End With

用以下场景测试

截图

用于测试的代码

Sub Sample()
    zLastRow = 5
    With Range("F2:F" & zLastRow)
        .Formula = "=IF(AND(B2="""",D2=""""),""Nothing"",IF(AND(A2<>"""",B2<>"""")," & _
                   "IF(E2="""",""Project remaining"",IF(IFERROR(DATEDIF(E2,D2,""d"")," & _
                   "7)/7>8,""Project Delay"",IF(IFERROR(DATEDIF(D2,E2,""d"")/7,5)<4" & _
                   ",""Project in Time"",""""))),""""))"
        .Value = .Value
    End With
End Sub

注意:我确信可以有比我想出的更好的公式,但您会了解在 VBA 中使用公式的要点。它减少了代码行数。

编辑

其实第四个条件并不重要。这个公式也行

=IF(AND(A2&lt;&gt;"",B2&lt;&gt;""),IF(E2="","Project remaining",IF(IFERROR(DATEDIF(E2,D2,"d"),7)/7&gt;8,"Project Delay",IF(IFERROR(DATEDIF(D2,E2,"d")/7,5)&lt;4,"Project in Time",""))),"")

所以 VBA 等价物是

Sub Sample()
    zLastRow = 5
    With Range("F2:F" & zLastRow)
        .Formula = "=IF(AND(A2<>"""",B2<>""""),IF(E2="""",""Project remaining""," & _
                    "IF(IFERROR(DATEDIF(E2,D2,""d""),7)/7>8,""Project Delay""," & _
                    "IF(IFERROR(DATEDIF(D2,E2,""d"")/7,5)<4,""Project in Time"",""""))),"""")"
        .Value = .Value
    End With
End Sub

如果你想按照自己的方式去做,那就这样做

Sub Sample()
    Dim ws As Worksheet
    Dim lRow As Long, i As Long
    Dim zWeeks As Double, zcolour As Long
    Dim Ztext As String

    Set ws = Sheet1 '<~~ Change this to the relevant code

    With ws
        lRow = .Range("D" & .Rows.Count).End(xlUp).Row

        For i = 2 To lRow
            zWeeks = DateDiff("ww", .Range("E" & i).Value, .Range("D" & i).Value)

            If .Range("A" & i).Value <> "" And .Range("B" & i).Value <> "" And .Range("E" & i).Value = "" Then
                Ztext = "Project remaining"
                zcolour = vbYellow
            ElseIf zWeeks < 4 Then
                Ztext = "Project on time"
                zcolour = vbGreen
            ElseIf zWeeks > 8 Then
                Ztext = "Project delayed"
                zcolour = vbRed
            End If

            With .Range("F" & i)
                .Value = Ztext
                .Interior.Color = zcolour
            End With
        Next i
    End With
End Sub

注意:在几周内,您必须在 DateDiff 中使用 ww 而不是 w

截图

【讨论】:

  • 没有测试它,但我喜欢“简单”的部分;)确实是一个非常简短的公式。但是,您需要为 Project Delay 设置红色
  • 我确信红色部分可以通过条件格式处理;)同样对于Simple部分,您可能错过了帖子末尾的Note:D跨度>
  • +1 只是为了让这个长公式工作,我处理不当,太多",我发现上面的 VBA 解决方案更容易实现和编辑,事实上它是我的 ;)
  • @ShaiRado:我对 OP 发布的代码(您提到的)没有任何意见。我相信SO中有很多公式专家。 Barry houdini 和 Scott Craner 是配方专家,我相信他们能想出比我更好的配方。这个想法是在 VBA 上使用公式,如果仍然需要使用 VBA,那么将该公式移植到 VBA。比在代码中循环更少的代码和更快的速度。就像我说的.. 没有反对发布的 VBA 代码:D
  • 大声笑@ShaiRado。不知道,因此不想让你感觉不好;)
【解决方案2】:
  If Cells(r, "A") <> "" And Cells(r, "B") <> "" And Cells(r, "E") = "" Then
    ' do something

  End If

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    相关资源
    最近更新 更多