因此,每天我都会收到带有订单的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很满意,但我很难找到解决冲突的办法。那我该怎么做呢?
答案 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 '*;*'
。获取这些记录并将其解析为两个或多个记录。第三,识别任何不包含';'的记录并将其解析为单个记录。所有生成的(干净的)记录可以进入目的地表进行进一步分析。