0

我们导出了一个客户的表格,该表格正在使用 AirTable来跟踪其客户的信息和位置,以尝试将其导入 SQL 数据库。由于 AirTable 导出的方式,在其“AirTable Base”中对其他表的引用不是通过 ID 的,而是在单个列中导出为基本上是电源标签,因为缺乏更好的解释。

此表中有大约 4,000 个客户端行。客户可以有一个或多个位置。排除许多其他列,它看起来像:

| Client_ID | Client_Name   | ... | Locations
| 3456      | Acme Grocery  | ... | "Memphis, TN","Orlando, FL","Philadelphia, PA"
| 3457      | Addition Financial  | ... | "Miami, FL","Plano, TX","New York, NY"
| 3458      | Barros Pizza  | ... | "Queen Creek, AZ"

我们正试图让数据准备好导入 SQL,因此我们正试图找到一个公式/方法,它可以采用 Client_ID,然后将其插入到由逗号分隔列制成的新数据表中的行中。使用上面的示例,新数据应如下所示:

| ClientInLocation_ID | Client_ID | Location         |
| 10000               | 3456      | Memphis, TN      |
| 10001               | 3456      | Orlando, FL      |
| 10002               | 3456      | Philadelphia, PA |
| 10003               | 3457      | Miami, FL        |
| 10004               | 3457      | Plano, TX        |
| 10005               | 3457      | New York, NY     |
| 10006               | 3458      | Queen Creek, AZ  |

这样做将允许我们获取唯一的位置,为它们分配 ID,然后将 Location 文本替换为 Location_ID 字段。

我在考虑数据透视表、文本到行等,但也许我对它们的经验不足以实现这一点。此外,任何解决方案显然都可以排除 ClientInLocation_ID 自动增量,因为一旦填充了其他两个字段,我们总是可以自动填充。非常感谢任何帮助。

4

1 回答 1

1

有很多方法可以解决这个问题。如果您有合适的 Excel 版本,您可以使用 PowerQuery (PQ) 来完成一些工作。PQ 内置于最近发布的 Excel 版本中,是 Excel 2013 和 2010 的免费插件,但不适用于 Excel 2010 之前的任何版本。如果您在功能区上看到 Power Query 选项卡,那么您就可以开始使用了。

使用您的数据作为新查询的源并按分隔符拆分位置","列为了澄清,您使用三个字符作为分隔符:位置的最后一个引号,分隔两个位置的逗号,以及第二个位置的第一个引号. 这会将一个位置放在一个单元格中,随后的位置放在右侧的列中。

第一列中的每个单元格在文本前面都有一个引号,并且保存该行最终位置的单元格将在文本末尾有一个引号。这在 PQ 中很容易清除,但我们在这里完成了,因此单击 Save & Load 关闭编辑器并在 Excel 中使用 Ctrl+H 清除它们可能会更快。

您的数据将自动转换为连接到源数据的表。这意味着刷新表格会做两件事:它会擦除您所做的任何编辑,并使用源数据中的任何更改来更新表格。因此,要么删除查询(如果这是一个已完成的项目),要么将表复制到新工作表(如果您想使用新的源数据快速重建)

从那里,我会转向 VBA 并使用三个嵌套For循环。外部循环自下而上 ( Step -1) 迭代数据中的每一行。中间循环迭代列以添加新行。内部循环填充行。

这很快,很脏,做了几个假设,并且没有经过测试,因为它是写在我的手机上的:

Option Explicit

Sub TransformTable ()
    Dim ws As Worksheet
    Dim myTable As ListObject
    Dim rng As Range
    Dim j As Long
    Dim k As Long
    Dim l as Long

    Set ws = ActiveSheet
    Set myTable = ws.ListObjects(1)

    Application.ScreenUpdating = False

    For j = myTable.ListRows.Count to 2 Step -1
        For k = 1 to Application.WorksheetFunction.CountA(ws.Range(ws.Cells(j,1),ws.Cells(j,myTable.ListColumns.Count) - 3
            Set rng = ws.Cells(j,1)
            myTable.ListRows.Add j+k
            For l = 0 to 1
                rng.Offset(k,l) = rng.Offset(0,l)
            Next l
            rng.Offset(k,3) = rng.Offset(0,3+k)
            rng.Offset(0,3+k).Cells.Clear
        Next k
    Next l

    Application.ScreenUpdating = True

End Sub
于 2019-08-08T09:26:24.693 回答