首页 > 解决方案 > 如何登记产品在工厂停留的时间?

问题描述

我需要知道产品在设施中的停留时间。

它适用于国际机场的主要地勤人员。

数据集与此类似:

航空公司代码 航班 飞行法。约会时间 类型 数字 所有者 飞行方向
AB AB1234 2021 年 10 月 10 日 美国广播公司 12345 AB 出境
AB AB1234 13-10-2021 美国广播公司 12345 AB 入站
AB AB1234 15-10-2021 美国广播公司 12345 AB 出境
光盘 CD3456 2021 年 9 月 10 日 高手 54321 光盘 入站
光盘 CD3456 2021 年 14 月 10 日 高手 54321 光盘 出境
光盘 CD3456 15-10-2021 高手 54321 光盘 入站

我混合和匹配的代码。

Sub MultipleSearch()

Sheet9.Activate

Dim ULD As String:
Dim ULD_Procedure As Variant
Dim i As Long
Dim rgSearch As Range
Dim ILastCol As Long
Dim cell As Range
Dim ColumnResult As Variant
Dim Result As Variant
Dim DateFlight As Variant

With Sheet9

    LastRow = WorksheetFunction.CountA(Range("B:B"))
            
    For i = 1 To LastRow
        
        ULD = Cells(i, 2).Value

        Sheet3.Activate
       ' Get search range
        Set rgSearch = Range("I:I")
        Set cell = rgSearch.Find(ULD)
    
        ' Store first cell address
        Dim firstCellAddress As Variant
        firstCellAddress = cell.Address

        ' Find all cells containing set ULD number
        Do
            Sheet9.Activate                  
            ILastCol = (1 + Cells(i, Columns.Count).End(xlToLeft).Column)
                                              
            'Adjust CellAdres to only give me the correct Row number
                            
            RowResult = cell.Address
            Result = Replace(RowResult, "$I$", "")
                            
            Sheet3.Activate
            DateFlight = Cells(Result, 4).Value
                            
            Sheet9.Activate
            Cells(i, ILastCol).Value = DateFlight
                            
            Set cell = rgSearch.FindNext(cell)

        Loop While firstCellAddress <> cell.Address
    
    Next i

    If cell Is Nothing Then
        Debug.Print "Not found"
    End If

End With

End Sub

此代码获取 ULD 进入系统或离开的日期,并且使用“基本”Excel 公式,我可以测量 ULD 之间的时间。但顺序不正确,这是因为并非所有 ULD 都以 Inbound 方式进入系统。有些已经在这里,并且这些 ULD 的第一条记录是出站的。还有一些 ULD 错过了出站或入站的注册。因此,说他们遵循入站出站入站出站的标准顺序是不正确的。

我正在寻找的解决方案是粘贴专注于入站和出站的日期。

我希望结果表看起来如何。

ULD 编号 第一次进入 入站 出境 入站 出境 入站 出境 入站 出境
12345 出境 2021 年 10 月 10 日 2021 年 11 月 10 日 2021 年 12 月 10 日 2021 年 14 月 10 日 17-10-2021 19-10-2021
12345 入站 2021 年 8 月 10 日 2021 年 8 月 10 日 2021 年 12 月 10 日 15-10-2021 16-10-2021 17-10-2021 20-10-2021

它目前的样子。

ULD 编号 第一次进入 入站 出境 入站 出境 入站 出境 入站 出境
12345 出境 2021 年 10 月 10 日 2021 年 11 月 10 日 2021 年 12 月 10 日 2021 年 14 月 10 日 17-10-2021 19-10-2021
12345 入站 2021 年 8 月 10 日 2021 年 8 月 10 日 2021 年 12 月 10 日 15-10-2021 16-10-2021 17-10-2021 20-10-2021

我不是要你写我的整个代码,但如果你能概述一个我可以使用的可能的公式/代码段。

标签: excelvba

解决方案


如果我正确理解了这个问题,我什至认为你不需要费心使用 VBA 来解决它。

数据透视表/查找和一些日期/时间数学应该能够为您解决它。

如果您真的想使用 VBA,尽管您想开始更像程序员/开发人员一样思考。

了解问题,将其分解为非常小的问题,然后孤立地解决所有这些非常小的问题。

因此,首先您希望您的数据离开工作表并进入内存(理想情况下,您只想与工作表交互两次,一次在开始时提取数据,一次在结束时输出结果)。

因此,您需要一种从工作表中提取数据并将其放入代表航班的方法,我会为每个航班选择一个类对象,以便可以通过其唯一代码来识别它。

因此,如果该方法从一个空集合开始,并通过查看每一行的工作表进行解析,它将首先通过检查工作表上的唯一代码是否存在来检查该航班是否存在于集合中,如果不存在则使用唯一代码创建航班类的新实例,如果确实如此,则从集合中获取现有航班类的保留。

然后将该行中的数据提取到飞行对象中。你的飞行对象类无疑需要一个集合来保存所有可能的入站/出站细节。

提取数据后,如果需要,您可以在每个类对象中对其进行排序(因此您需要一个函数来接受来自对象的数据,对其进行正确排序,然后将其作为排序集合传回)。

转换数据后,您将需要在其中执行计算,因此可以再次将数据传递给函数以获得所需的结果。

最后,您将需要一个输出方法来从每个对象中获取数据并以所需格式将其输出到工作表中。

希望这会有所帮助。


推荐阅读