如何将一个列中的多个日期与多个循环进行比较?

时间:2017-03-01 14:50:08

标签: vba excel-vba excel

我非常绝望,希望你能帮助我。

我有这个问题:对于我在"资源"中的每个名字。表,我需要看一个"开始日期"。 "开始日期"来自"需求"片。它是距离G列的今天最近的日期。

含义:对于X先生,我有10个不同的日期。今天是2017/03/01。因此,在此之前的所有日期都超出了范围。它仍然是5个日期(2017年3月至12月)。我希望看到最接近今天的日期,即2017年3月31日。

但是,对于每个名字,我显然没有相同数量的日期(每个名称1到10个日期,或多或少)。这就是为什么我创建循环所以我可以浏览整个日期列表。

我的问题是,如果我尝试为我希望看到的特定日期设置变量,我的循环将只删除先前保存的值。我不知道该怎么做......首先我的单元格是空白的,所以即使我把今天的日期进行比较并编码出循环,它仍然无法工作......

示例:http://www.cjoint.com/c/GCbpoFz64P2

Sub ICStart()

    Sheets("Resources").Select
    Nb_tot1 = 5
    While Cells(Nb_tot1, 1).Value <> ""
        Nb_tot1 = Nb_tot1 + 1
    Wend
    Nb_tot1 = Nb_tot1 - 5
    MsgBox "Total Lines is : " & Nb_tot1 & "."

    Sheets("Demande").Select

    Nb_tot2 = 3
    While Cells(Nb_tot2, 14).Value <> ""
        Nb_tot2 = Nb_tot2 + 1
    Wend
    Nb_tot2 = Nb_tot2 - 3
    MsgBox "Total Lines is : " & Nb_tot2 & "."

    For i = 5 To Nb_tot1 + 5 - 1
        Sheets("Resources").Select
        Name = Cells(i, 1)
        Sheets("Demande").Select
        End_date_temp = Worksheets("Demande").Cells(3, 7)
        For j = 3 To Nb_tot2
            Sheets("Demande").Select
            Worksheets("Resources").Cells(i, 8) = End_date_temp
            Commit = Cells(j, 12)
            An = Year(Cells(j, 7))
            End_date = Cells(j, 7)
            If Cells(j, 14) = Name And Commit = "Y" And An <> "2100" And An >= Year(Now) And End_date >= Date Then
                End_date_temp = End_date
            End If
        Next
    Next

End Sub

主要问题是我无法找到如何写这一行:

End_date_temp = Worksheets("Demande - Projets").Cells(3, 7)

1 个答案:

答案 0 :(得分:0)

这可能有助于您入门。

Sub test()
    Dim person As String

    person = Worksheets("Resources").Range("A2")
    Debug.Print GetClosestDate(person)
End Sub

Function GetClosestDate(person As String)
    Dim cl As Range, today As Date, closestDate As Date

    today = VBA.Now

    For Each cl In Worksheets("Demand").Range("G1:G8")
        If cl.Offset(0, 7) = person Then           // this picks up name column N

            If cl >= today Then
                If closestDate = "00:00:00" Then   //Default value for uninitialised date object
                    closestDate = cl.Value
                Else
                    If CInt(cl - today) < CInt(closestDate - today) Then
                        closestDate = cl.Value
                    End If
                End If
            End If
        End If
    Next cl

    GetClosestDate = closestDate

End Function
  • 我使用函数GetClosestDate查找最近的人日期
  • 假设可以忽略比今天更早的任何日期
  • 它循环显示日期并比较它是否比存储日期更接近今天

您需要修改代码以处理Resources等中的名称循环,但我认为 - 至少在原则上 - 此代码是您所需要的。