在 VBA 中,拆分单元格,将数据添加到适当的列并根据需要递增

问题描述 投票:0回答:1

我正在寻找 VBA 解决方案。我的手机里有一个联系人和几个电话号码。 我需要将每个数字移动到每种类型的列中。顶部是数据的样子。 底部就是我需要的。 我不知道从哪里开始。这必须在数百个工作簿中的数十个单元格上完成。 所以任何手动操作都无法解决问题。

example data

我不知道从哪里开始。

excel vba
1个回答
0
投票

我会提供一些帮助你入门的东西。

我对 Excel 的了解不够,无法建议是否可以严格使用公式来完成此操作。这是我可以使用 Excel 2021 和 Power Query 执行的操作。

  1. 选择包含标题的数据范围,启动 Power Query:数据 > GetData > 来自表/范围(在弹出窗口中,确保选中“我的表有标题”)

  2. 在 PQ 中将 ,( 替换为 (

  3. 继续在 PQ 中根据特殊字符进行分割 - 换行:#(lf)

  4. 在 PQ 中继续 - 选择所有电话信息列 > 变换 > 逆透视 (可以删除创建的不需要的属性列)

  5. 继续在 PQ 中以逗号分隔电话信息

  6. 到目前为止结果如下(关闭保存到工作表或在PQ中继续)

联系方式1 价值.1 价值.2
简·多伊 44 (101)999-2657 无线
简·多伊 44 (101)999-3907 固定电话
简·多伊 44 (101)999-5059 其他手机
简·多伊 44 (101)999-0766 固定电话

PQ 根据我在功能区上的选择生成的代码如下所示:

let
    Source = Excel.CurrentWorkbook(){[Name="Table11"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Contact", type text}}),
    #"Replaced Value" = Table.ReplaceValue(#"Changed Type",",(","(",Replacer.ReplaceText,{"Contact"}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Replaced Value", "Contact", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), {"Contact.1", "Contact.2", "Contact.3", "Contact.4", "Contact.5"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Contact.1", type text}, {"Contact.2", type text}, {"Contact.3", type text}, {"Contact.4", type text}, {"Contact.5", type text}}),
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Changed Type1", {"Contact.1"}, "Attribute", "Value"),
    #"Removed Columns" = Table.RemoveColumns(#"Unpivoted Columns",{"Attribute"}),
    #"Split Column by Delimiter1" = Table.SplitColumn(#"Removed Columns", "Value", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), {"Value.1", "Value.2"}),
    #"Changed Type2" = Table.TransformColumnTypes(#"Split Column by Delimiter1",{{"Value.1", type text}, {"Value.2", type text}})
in
    #"Changed Type2"
  1. 现在将重复的电话类型放入多个标题中是很棘手的。这是一篇讨论在 PQ 中添加递增索引的文章https://answers.microsoft.com/en-us/msoffice/forum/all/power-query-get-transform-add-an-incrementing/b4fd7532-7627 -4c22-a699-d051587b8718。可能能够适应联系人和价值的分组。2。然后将 Value.2 与索引连接以在数据透视表中生成列标题。我还没试过。我已经知道如何在 Access 查询中执行最后一步,就像:
    TRANSFORM First(Contacts.PhoneNum) AS FirstOfPhoneNum
    SELECT Contacts.Contact
    FROM Contacts
    GROUP BY Contacts.Contact
    PIVOT [PhoneType] & DCount("*","Contacts","Contact='" & [Contact] & "' AND PhoneType='" & [PhoneType] & "' AND ID<=" & [ID])
    IN("Wireless1","Wireless2","Landline1","Landline2","Otherphone1","Otherphone2");

我能想到的任何其他事情都会涉及 VBA。

© www.soinside.com 2019 - 2024. All rights reserved.