excel - 当列标题名称的顺序不同时,将一个表插入另一个表
问题描述
我想将一个表中的所有数据插入到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 ║ ║ ║
╚═════════╩═══════╩═══════╩═══════╩═══════╝
所以我仍然缺少的是:
copy_tbl
从到中添加缺失的列paste_tbl
。- 确保从中粘贴的数据
copy_tbl
与位于 中第一列的相同唯一 ID 匹配paste_tbl
,如果该唯一 ID 不存在,则将整行粘贴到表格底部。 - 如果目标单元格中已经存在数据,我想将其与来自
copy_tbl
.
编辑 2:意识到 VBA 的某些部分我永远无法理解,我尝试用老式的公式来做到这一点,我成功了。
它可能不是很优化,因为填充表格需要一段时间,而且当我完成它时我已经很累了。但它可以完成它。
抱歉,如果它有点乱,但它的作用是根据其他两个表的值tabell1
和tabell2
. 它将所有现有单元格数据与相同的唯一 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)
));" ")
解决方案
推荐阅读
- html - 使用 CSS 悬停时无法在文本下方显示列表
- php - PHP,WordWrap如何只剪切文本而不剪切html代码
- python - 无法从 django 管理面板上传大文件
- python - 如何用pyside切换qml渲染器
- sql - 如何屏蔽 SQL SERVER 中的前几位和后几位?
- http - 主机名中超过 3 级的“子域”和“子域”是什么?
- css - 为什么在 Sencha Themer 中点击 Publich -> Apply to Theme App 后样式没有变化?
- java - 如何在 docker-compose 中为 Flink 设置 HADOOP_CLASSPATH
- excel - Excel VBA 打印到 PDF
- html - 如何使用 flex 显示将导航栏固定到顶部