找到最接近所需日期的日期,而不必经过并匹配序列号

时间:2018-05-28 22:19:23

标签: excel excel-vba vba

我有一个"列I"其中有数据用于返工日期和" G&#34列;为集会日期。 在"列J"我想要使​​用"返工日期"找到最接近"组装日期的日期"专栏没有经过。它可以是与装配相同的日期,也可以在未结束之前。将它们绑在一起,"返工系列"必须与" Serial"完全相同在" E"列中。 注意:我需要在那里的时间以及在同一天发生的一些实例将有不同的时间。

我试图使用"返工日期"仔细研究整个"组装日期"列和它比较后,只要它没有超过并且序列号相同,它就返回最大值。我不知道如何使用一次返工来查看具有这些细节的其他列,并进入下一个返工日期并执行相同操作。

我确实创建了一个查看数据的列,然后在最大值上执行了vlookup,但这会导致为列中的每个返工创建一个列,这将太多。我可能会过度思考这个问题,但是我会非常感激一些意见。

enter image description here

图片显示了我正在使用的整个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

1 个答案:

答案 0 :(得分:0)

我不得不使用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

绝对是在思考这个。