从逗号分隔和 ID 列创建 Excel 查找 Table Sheet

Creating an Excel Lookup Table Sheet from a Comma Delimited and ID column

我们导出了一位客户的 table,他正在 使用 AirTable 来跟踪他们客户的信息和位置,以试图导入到 SQL 数据库中.由于 AirTable 导出的方式,在它们的 "AirTable Base" 中对其他 table 的引用不是通过 ID 的 ,而是在单个列中作为基本的电源标签导出缺乏更好的解释。

此 table 中大约有 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,因此我们试图找到一个 formula/method 可以接受 Client_ID,然后将其插入行由逗号分隔的列生成的新数据 sheet。使用上面的示例,新数据应如下所示:

| 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_ID 字段替换位置文本。

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

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

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

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

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

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

这是快速的,肮脏的,做了几个假设并且没有经过任何测试,因为它写在我的 phone:

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