首页 > 解决方案 > 查找与所需日期最接近的日期而不超过匹配序列号

问题描述

我有一个“I 列”,其中包含返工日期的数据和“G 列”的装配日期。在“J 列”中,我希望使用“返工日期”来查找最接近“装配日期”列的日期,而无需重复。它可以与集会的日期相同,也可以在尚未结束之前。要将其绑定在一起,“返工序列”必须与“E 列”中的“序列”完全相同。注意:我需要那里的时间以及同一天发生的某些情况会有不同的时间。

我试图使用“返工日期”来查看整个“组装日期”列,然后在比较每一个之后,只要它不超过并且序列相同,它就会返回最大值。我不知道如何使用一个返工来查看另一列的这些细节,然后进入下一个返工日期并做同样的事情。

我确实创建了一些查看数据的列,然后对最大值进行了 vlookup,但这会导致为列中的每个返工创建一个列,这太多了。我可能想多了,但我们将不胜感激。

在此处输入图像描述

该图像显示了我尝试的一段代码以及我正在使用的整个 excel。它显示了为每个“返工日期”实例创建列的方法。

尝试使用 VBA 遍历 Serial 的整个列,看看它是否等于 Rework Serial,然后在“L”列中连接该值。
从这里我也希望比较日期并返回最大值而不超过的日期值。此代码适用于返回一个单元格,每次返工如何为每个单元格完成?

我走得更远,但由于某种原因,每三次循环一次,它就会出错

AssemD = DateValue(Cells(x,7))

类型不匹配。我不明白这一点,因为它在没有 For Each j 循环的情况下运行,但我试图嵌套它,以便在它进行所有比较并找到最大值之后,它将最大值写入 Cells(y,12),即y 计数器跟上 j。

Sub RecentDate()
    Dim i As Range, j As Range, x As Integer, y As Integer, AssemD As Date, ReworkD As Double, AssemTi As Double, ReworkTi As Double, AssemTot As Double, ReworkTot As Double, MaxDate As Date
    x = 1
    y = 1
    'Set i = Range("E1:E12")
    For Each j In Range("I1:I12")
        For Each i In Range("G1:G12")
            AssemD = DateValue(Cells(x, 7))
            ReworkD = DateValue(Cells(1, 9))
            AssemTi = TimeValue(Cells(x, 7))
            ReworkTi = TimeValue(Cells(1, 9))
            AssemTot = CDbl(AssemD) + CDbl(AssemTi)
            ReworkTot = CDbl(ReworkD) + CDbl(ReworkTi)

            If ReworkTot >= AssemTot And Cells(1, 8) = Cells(x, 5) Then
                MaxDate = Cells(x, 7)
            End If
            Cells(x, 13) = MaxDate
            x = x + 1
        Next i
        Cells(y, 12) = MaxDate
        y = y + 1
    Next j
End Sub

标签: excelvba

解决方案


我不得不使用 VBA,但使用以下代码得到了它。

Sub RecentDate()
    Dim i As Range, j As Range, x As Integer, y As Integer, AssemD As Date, ReworkD As Double
    Dim AssemTi As Double, ReworkTi As Double, AssemTot As Double, ReworkTot As Double, MaxDate As Date, LineFault As String
    x = 1
    y = 1
    'Set i = Range("E1:E12")
    For Each j In Range("I1:I12")
        For Each i In Range("G1:G12")
            AssemD = DateValue(Cells(x, 7))
            ReworkD = DateValue(Cells(y, 9))
            AssemTi = TimeValue(Cells(x, 7))
            ReworkTi = TimeValue(Cells(y, 9))
            AssemTot = CDbl(AssemD) + CDbl(AssemTi)
            ReworkTot = CDbl(ReworkD) + CDbl(ReworkTi)

            If ReworkTot >= AssemTot And Cells(y, 8) = Cells(x, 5) Then
                MaxDate = Cells(x, 7)
                LineFault = Cells(x, 6)
            End If
            Cells(x, 13) = MaxDate
            x = x + 1
        Next i
        x = 1
        Cells(y, 12) = MaxDate
        Cells(y, 14) = LineFault
        y = y + 1
        MaxDate = "1/1/1900 12:00"
        LineFault = ""
    Next j
End Sub

这个肯定是想多了。


推荐阅读