首页 > 解决方案 > 当列标题名称的顺序不同时,将一个表插入另一个表

问题描述

我想将一个表中的所有数据插入到copy_tbl另一个表的末尾,paste_tbl它们都在不同的工作表中,但在同一个工作簿中。

具有相同标题名称的列在两个表中的顺序不会相同,因此我需要重新排列插入数据列的顺序以匹配目标。

copy_tbl可能有在 中不存在的列标题名称,paste_tbl并且我希望将这些列添加到paste_tbl(这是可选的,并且可以忽略目标表中没有匹配的列,如果这样做很头疼)。

我一直在尝试阅读 ListObjects 并尝试在插入数据之前编写某种与列标题名称匹配的循环,但我被卡住了。

这似乎是一个相当简单的任务,我确信我至少会在谷歌的帮助下解决这个问题,但我已经在这里坐了 6 个小时,但我什么也没有。

我确实通过使用 Power Query 找到了解决方案,但我在 Mac 上,它还没有在 Excel for Mac 中实现:|

有没有人愿意帮我解决这个问题?

提前致谢!

编辑:

我放弃了尝试使用 ListObjects 并尝试了其他方法。这是我到目前为止提出的代码:

    Dim r As Range, c As Range, msg As String
    
    Application.ScreenUpdating = False
        
    With Sheets("copy_sht").Range("1:1").CurrentRegion
        For Each r In Sheets("paste_sht").Range("1:1")
            Set c = .Rows(1).Find(r.Value, , , xlWhole, , 0)
            If Not c Is Nothing Then
                .Columns(c.Column).copy
                r.PasteSpecial xlPasteValues
            Else
                msg = msg & vbLf & r.Value
            End If
        Next
        
        Application.CutCopyMode = False
        Application.ScreenUpdating = True
                
    End With

End Sub

这会将一些值替换到正确的单元格中,并且还会用第二个表中的数据覆盖整个第一列。

这就是我想要发生的事情:

╔════════════╦═══════╦═══════╦═══════╦═══════╗
║     Number ║ info1 ║ info2 ║ info3 ║ info4 ║
╠════════════╬═══════╬═══════╬═══════╬═══════╣
║          1 ║ abc   ║       ║ xyz   ║   456 ║
║          2 ║       ║ 123   ║       ║       ║
║          3 ║       ║       ║ 456   ║       ║
║          4 ║       ║       ║       ║       ║
║          5 ║ abc   ║ asd   ║ zxc   ║       ║
╚════════════╩═══════╩═══════╩═══════╩═══════╝
╔════════════╦═══════╦═══════╦═══════╦═══════╗
║     Number ║ info1 ║ info3 ║ info4 ║ info5 ║
╠════════════╬═══════╬═══════╬═══════╬═══════╣
║          1 ║ def   ║ www   ║   123 ║ a     ║
║          3 ║       ║       ║       ║ b     ║
║          5 ║       ║       ║       ║ c     ║
║          6 ║       ║       ║       ║ d     ║
║          7 ║ 123   ║       ║       ║ e     ║
╚════════════╩═══════╩═══════╩═══════╩═══════╝
╔════════════╦════════╦═══════╦════════╦════════╦═══════╗
║     Number ║ info1  ║ info2 ║ info3  ║ info4  ║ info5 ║
╠════════════╬════════╬═══════╬════════╬════════╬═══════╣
║          1 ║ abcdef ║       ║ xyzwww ║ 456123 ║ a     ║
║          2 ║        ║ 123   ║        ║        ║       ║
║          3 ║        ║       ║  456   ║        ║ b     ║
║          4 ║        ║       ║        ║        ║       ║
║          5 ║ abc    ║ asd   ║ zxc    ║        ║ c     ║
║          6 ║        ║       ║        ║        ║ d     ║
║          7 ║ 123    ║       ║        ║        ║ e     ║
╚════════════╩════════╩═══════╩════════╩════════╩═══════╝

paste_tbl从第二个表添加数据后,第一个表将成为第三个表copy_tbl

这就是代码对第一个表所做的实际操作:

╔═════════╦═══════╦═══════╦═══════╦═══════╗
║  Number ║ info1 ║ info2 ║ info3 ║ info4 ║
╠═════════╬═══════╬═══════╬═══════╬═══════╣
║       1 ║ def   ║       ║ www   ║   123 ║
║       3 ║       ║ 123   ║       ║       ║
║       5 ║       ║       ║       ║       ║
║       6 ║       ║       ║       ║       ║
║       7 ║ 123   ║ asd   ║       ║       ║
╚═════════╩═══════╩═══════╩═══════╩═══════╝

所以我仍然缺少的是:


编辑 2:意识到 VBA 的某些部分我永远无法理解,我尝试用老式的公式来做到这一点,我成功了。

它可能不是很优化,因为填充表格需要一段时间,而且当我完成它时我已经很累了。但它可以完成它。

抱歉,如果它有点乱,但它的作用是根据其他两个表的值tabell1tabell2. 它将所有现有单元格数据与相同的唯一 ID 合并,该唯一 ID$A2需要位于所有表格的第一列中。您必须收集所有唯一 ID 并将它们放置在要填充的表中而不重复。然后只需将以下公式粘贴到表格每一列的第一行。

=IFERROR(
IF(
      IF(
            COUNTIF(tabell1;$A2)=1;
                   VLOOKUP($A2;tabell1;MATCH(B$1;tabell1[#Headers];0);FALSE);""
            )
                     =
        IF(
                             COUNTIF(tabell2;$A2)=1;
                             VLOOKUP($A2;tabell2;MATCH(B$1;tabell2[#Headers];0);FALSE);""
            );
                   IF(
                           AND(COUNTIF(tabell1;$A2)=1;COUNTIF(tabell2;$A2)=1);
                           IFERROR(
                                 VLOOKUP($A2;tabell1;MATCH(B$1;tabell1[#Headers];0);FALSE);
                                  VLOOKUP($A2;tabell2;MATCH(B$1;tabell2[#Headers];0);FALSE));
CONCATENATE(VLOOKUP($A2;tabell1;MATCH(B$1;tabell1[#Headers];0);FALSE);" ";VLOOKUP($A2;tabell2;MATCH(B$1;tabell2[#Headers];0);FALSE)));
IF(
                             COUNTIF(tabell2;$A2)=1;
                             VLOOKUP($A2;tabell2;MATCH(B$1;tabell2[#Headers];0);FALSE);VLOOKUP($A2;tabell1;MATCH(B$1;tabell1[#Headers];0);FALSE)
            ));" ")

标签: excelvbamacoslistobject

解决方案


推荐阅读