繁体   English   中英

跨多个工作表的独特数据整合

[英]Unique data consolidation across multiple Worksheets

我有六个工作表,我想从特定列中获取唯一的ID,并将其合并为1个主表(以便进行一些分析和不同的数据表示)。

数据全部从相同的单元格C17开始,但在不同的行(即C180,C268等)处结束。 我希望能够每周合并所有六个电子表格中的唯一ID。

是否存在不使用数组公式的解决方案,因为由于行数和计算列表所需的资源过多,会严重导致问题。 如果要合并的单元格范围可以是动态的,并且工作表名称是从主表中的特定单元格引用的(永远不会删除或更改为其他六个范围),则VBA自动化是首选

因此,我将运行一个宏,该宏将基于命名的范围或其中包含工作表名称和范围的特定单元格(使用间接使用这些字符串)合并所有数据,并将其粘贴到新的范围中。

UDF也可以接受,我只是不希望Excel“冻结”进行计算。

顺便说一句,我确实读过仅通过使用公式在Excel中获取唯一值,但是这些解决方案仅在数据位于同一张纸上或在非常特定的条件下才有效。 另外,由于我的数据实际上是数千行,因此数组公式不能有效地工作。

编辑:

这是我用来从一张工作表中获取数据的测试宏,但问题是我无法使用动态功能,也无法添加其他工作表中的其余名称,因为我将其复制到的范围无法提取第一个空白单元格复制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))

我认为循环和集合的组合可能会解决您的问题:)

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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM