从逗号分隔和 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
我们导出了一位客户的 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