跨多个工作表的独特数据整合
Posted
技术标签:
【中文标题】跨多个工作表的独特数据整合【英文标题】:Unique data consolidation across multiple Worksheets 【发布时间】:2016-02-22 01:50:41 【问题描述】:我有六个工作表,我想从特定列中获取唯一 ID,并将它们合并到 1 个主文件中(以便进行一些分析和不同的数据表示)。
数据都从同一个单元格 C17 开始,但在不同的行结束(即 C180、C268 等)。我希望能够每周合并所有六个电子表格中的唯一 ID。
是否有不使用数组公式的解决方案,因为计算列表所需的行数和资源数量庞大,这会严重导致问题。 VBA 自动化是首选,其中用于合并的单元格范围可以是动态的,并且工作表名称是从主工作表中的特定单元格引用的(它永远不会被删除或更改到其他六个的范围)?
因此,我将运行一个宏,它将基于命名范围或特定单元格与其中的工作表名称和范围合并所有数据(使用间接使用这些字符串)并将其粘贴到新范围中。
UDF 也是可以接受的,我只是不希望 Excel “冻结”进行计算。
顺便说一句,我确实读过Getting unique values in Excel by using formulas only,但这些解决方案只有在数据在同一张纸上或在非常特定的条件下才有效。此外,数组公式也不能有效地工作,因为我的数据实际上是数千行。
编辑:
这是我用来从一张表中获取数据的测试宏,但问题是我不能使用动态,也不能添加其他表中的其余名称,因为我将其复制到的范围我无法提取复制 ID 后的第一个空白单元格。
Sub ConsolidateDATA()
'yStr = Evaluate("=ADDRESS(MIN(IF($C$10:$C$9999 = "", ROW($C$10:$C$9999))), 3, 1, 1)")
'Attempted dynamic range copy ^ - failed
yStr = "C10"
Range("Sheet1!$B$5:$B$29").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:="", CopyToRange:=Range(yStr), Unique:=True
End Sub
我也对数组公式进行了成功的尝试,但不幸的是它们是资源密集型的,它们是非常糟糕的解决方案。
-- 将列表合并为 1 个主列表的数组公式
=IFERROR(INDEX(INDIRECT($B$6, TRUE), ROWS(B$13:$B14)), IFERROR(INDEX(INDIRECT($B$7, TRUE), ROWS(B$13:$B14) - ROWS(INDIRECT($B$6, TRUE))), IFERROR(INDEX(INDIRECT($B$8, TRUE), ROWS(B$13:$B14) - ROWS(INDIRECT($B$6, TRUE)) - ROWS(INDIRECT($B$7))), IFERROR(INDEX(INDIRECT($B$9, TRUE), ROWS(B$13:$B14) - ROWS(INDIRECT($B$6, TRUE)) - ROWS(INDIRECT($B$7)) - ROWS(INDIRECT($B$8))), IFERROR(INDEX(INDIRECT($B$10, TRUE), ROWS(B$13:$B14) - ROWS(INDIRECT($B$6, TRUE)) - ROWS(INDIRECT($B$7)) - ROWS(INDIRECT($B$8)) - ROWS(INDIRECT($B$9, TRUE))), IFERROR(INDEX(INDIRECT($B$11, TRUE), ROWS(B$13:$B14) - ROWS(INDIRECT($B$6, TRUE)) - ROWS(INDIRECT($B$7)) - ROWS(INDIRECT($B$8)) - ROWS(INDIRECT($B$9, TRUE)) - ROWS(INDIRECT($B$10, TRUE))),IFERROR(INDEX(INDIRECT($B$12, TRUE), ROWS(B$13:$B14) - ROWS(INDIRECT($B$6, TRUE)) - ROWS(INDIRECT($B$7)) - ROWS(INDIRECT($B$8)) - ROWS(INDIRECT($B$9, TRUE)) - ROWS(INDIRECT($B$10, TRUE)) - ROWS(INDIRECT($B$11, TRUE))),"")))))))
-- 获取唯一数据的数组公式
=INDEX(TotalNameListRangeFromFormulaAbove, MATCH(0, COUNTIF($D$16:D16, TotalNameListRangeFromFormulaAbove), 0))
【问题讨论】:
到目前为止你尝试过什么?要求代码的用户预计会表现出最初的努力。 好的,没问题。我不想堵塞原始帖子,但我会编辑它。 我不知道为什么这被否决了,因为它没有违反任何规则,我也没有机会回答任何评论请求。 我否决并投票结束您的原始问题,因为它只是一个 'gimmer teh codez' 类型的问题,没有样本数据,没有预期结果,也没有代码或显示原始努力的公式。在我选择行使我的选择权之前,我不能提醒你,你错过了所有这些重要因素。由你来写一个像样的问题。 至于样本数据集和预期结果,我认为我无法提供过于复杂的问题。我可以提供一份可能可行的示例工作簿,但我不确定文件共享方面的 SE 政策。 【参考方案1】:我认为循环和集合的组合可能会解决您的问题:)
http://excelmacromastery.com/Blog/index.php/the-complete-guide-to-collections-in-excel-vba/
for i = 1 to UBound(worksheetcount, 1)
for j = 1 to UBound(cellrangecount, 1)
With CreateObject("scripting.dictionary")
For Each "Key" In cellrangecount(cellrangecount)
If Not .Exists(Key) Then .Add Key, Key & "_content"
Next j
next i
End With
我相信这足以让您走上正确的道路。我最终使用字典而不是集合,但如果你愿意,你可以改变它。在声明和添加上只有微小的差异,但基本上是相同的(有趣的是,有几个巨大的差异,我认为这并不重要)。给我一些时间,我会带着比“它如何工作的基本概念”更精致/完成的东西回来。
来自同一个人的词典链接(我真的很喜欢这个人阐述内容的方式)
http://excelmacromastery.com/Blog/index.php/vba-dictionary/
【讨论】:
仅链接的答案违反了作为问答网站的网站指南 - 网站本身的所有信息,不依赖于外部链接。如果您能提供一个基本示例,您的建议将如何帮助解决问题,这将有助于提高您贡献的价值。 对不起。我没有意识到这是不可接受的。我将审查并尝试为 OP 制作一个临时可用的模板 @DougCoats,为什么要在 for 结构之外关闭 with 结构? createobject 行中有一个 with 语句。在编写时自动编写 if/end if,with/end with,然后在它们之间提供代码时,这对我来说是一种习惯。类似于 xml 和 html 中你抢先写 等。除非以 isnt 结尾? 我猜在这个特定的例子中它是不需要的。对于那个很抱歉。我想更多的是一种习惯的力量以上是关于跨多个工作表的独特数据整合的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将多个数据框组合成一个 xlsx 工作表和多个数据框跨单独的工作表
Excel表格引用另外一个表的数据,被引用表格不打开,引用表格上就不会显示数据,显示VALUE,急