将分隔的条目拆分为Access中的新行

时间:2013-11-05 19:37:24

标签: sql vba ms-access access-vba delimiter

所以有人给了我订单电子表格,每个订单的唯一价值是PO,给我电子表格的人是懒惰的,并决定订单有多个PO,但相同的信息,他们只是将它们分开“/”。所以例如我的表看起来像这样

PO             Vendor   State
123456/234567  Bob      KY
345678         Joe      GA
123432/123456  Sue      CA
234234         Mike     CA

我希望使用“/”符号作为分隔符将PO分开,所以它看起来像这样。

    PO         Vendor   State
123456         Bob      KY
234567         Bob      KY
345678         Joe      GA
123432         Sue      CA
123456         Sue      CA
234234         Mike     CA

现在,我已经集思广益了几个方法来解决这个问题。最终我想要Access中的这些数据。原始格式的数据在Excel中。我想要做的是在Access中编写一个vba函数,我可以将其与SQL语句结合使用来分隔值。我现在正在努力,因为我不知道从哪里开始。

3 个答案:

答案 0 :(得分:5)

关于此:

1)将源数据导入名为SourceData的新Access表。

2)创建一个新查询,直接进入SQL视图并添加以下代码:

SELECT * INTO ImportedData
FROM (
  SELECT PO, Vendor, State
  FROM SourceData
  WHERE InStr(PO, '/') = 0
  UNION ALL
  SELECT Left(PO, InStr(PO, '/') - 1), Vendor, State
  FROM SourceData
  WHERE InStr(PO, '/') > 0
  UNION ALL
  SELECT Mid(PO, InStr(PO, '/') + 1), Vendor, State
  FROM SourceData
  WHERE InStr(PO, '/') > 0) AS CleanedUp;

这是Access术语中的'make table'查询(尽管有嵌套的联合查询);对于'追加'查询,改为将前两行改为

INSERT INTO ImportedData
SELECT * FROM (

(其余部分不会改变。)不同之处在于,重新运行make表查询将清除目标表中已有的内容,而追加查询会添加到任何现有数据。

3)运行查询。

答案 1 :(得分:1)

如果我必须这样做,我会

  • 将原始数据导入名为[TempTable]的表格。
  • 使用“仅结构”选项将[TempTable]复制到名为[ActualTable]的新表。

然后,在VBA例程中我会

  • 为[TempTable]打开两个DAO记录集rstIn,为[ActualTable]打开rstOut
  • 循环浏览rstIn记录集。
  • 使用VBA Split()功能将“/”上的[PO]值拆分为数组。
  • For Each数组项我会用rstOut.AddNew将记录写入[ActualTable]

答案 2 :(得分:0)

在Excel中,试试这个:

IF(ISERROR(FIND("/",A1,1))=TRUE,A1, Left(A1, 6))

在旁边的单元格中,输入以下内容:

IF(ISERROR(FIND("/",A1,1))=TRUE,"", Right(A1, 6))

这会将您的PO分成两列。从那里开始写一个循环,在适当的时候创建一个新的记录。