将分隔的字段拆分为不同的行

时间:2013-12-31 15:53:39

标签: sql vba ms-access access-vba

因此,每天我都会收到带有订单的Excel工作表,它们看起来像这样:

Date        Vendor     OrderID/Quantity         Total 
12/28/2013  Nike       1111111-8;2222222-12     20
12/29/2013  Adidas     3333333-5;4444444-10     15
12/30/2013  Wrangler   5555555-3                3  

它适用于我工作的大多数人,但不适用于我,因为我想识别与数量分开的每个OrderID。 7位数字之间的“ - ”用于将ID与与其关联的单元数分开。但实质上,当我将此表导入访问时,我想创建另一个分割这些值的表。

Date        Vendor     OrderID  Quantity        
12/28/2013  Nike       1111111  8               
12/28/2013  Nike       2222222  12              
12/29/2013  Adidas     3333333  5               
12/29/2013  Adidas     4444444  10              
12/30/2013  Wrangler   5555555  3 

这对我来说更有用,但生成两个分隔符(“ - ”和“;”)是一项艰巨的任务。我对VBA很满意,但我很难找到解决冲突的办法。那我该怎么做呢?

2 个答案:

答案 0 :(得分:4)

我能想到的最简单的方法是VBA Split功能。请注意,我设置了tblStaging临时表,其中所有字段都是从Excel导入的文本类型,但我将tblOrders表设置为(我假设的)正确的类型:日期作为日期,供应商作为文本,OrderID作为数字,数量作为数字。有关详细信息,请参阅代码中的注释。

Public Sub SplitOrders()
    Dim rsStaging As Recordset
    Dim rsOrder As Recordset
    Dim arrOrders() As String
    Dim arrOrderDetails() As String

    'Rename these for whatever your tables are called'
    Set rsStaging = CurrentDb.OpenRecordset("tblStaging")
    Set rsOrder = CurrentDb.OpenRecordset("tblOrders")

    rsStaging.MoveFirst
    While Not rsStaging.EOF

        'Split into an array of Orders'
        arrOrders = Split(rsStaging.Fields("OrderID/Quantity"), ";")

        For i = 0 To UBound(arrOrders)

            'Split the OrderID and Quantity for each Order'
            arrOrderDetails = Split(arrOrders(i), "-")

            'Create the new record in tblOrders'
            With rsOrder
                .AddNew
                !Date = CDate(rsStaging!Date)
                !Vendor = rsStaging!Vendor
                !OrderID = CLng(arrOrderDetails(0)) 'If the OrderID can contain letters, symbols or leading zeros, omit the CLng( ... ) call'
                !Quantity = CLng(arrOrderDetails(1))
                .Update
            End With

        Next
        rsStaging.MoveNext
    Wend
End Sub

答案 1 :(得分:2)

我希望将其分解为不同的部分,而不是试图一次性解析数据。例如,步骤1可能是将文件导入到临时表(看起来像您问题中的第一个数据示例)。第2步是查询表以检测包含';'的任何行(可能使用InStr函数或通配符搜索like '*;*'。获取这些记录并将其解析为两个或多个记录。第三,识别任何不包含';'的记录并将其解析为单个记录。所有生成的(干净的)记录可以进入目的地表进行进一步分析。