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

时间:2016-02-22 01:50:42

标签: database excel vba unique udf

我有六个工作表,我想从特定列中获取唯一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))

1 个答案:

答案 0 :(得分: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/

相关问题