2016-02-22 2 views
0

У меня есть шесть рабочих листов, которые я хочу взять с уникального идентификатора из определенного столбца и объединить их в 1 мастер (чтобы сделать некоторый анализ и другое представление данных).Уникальная консолидация данных на нескольких рабочих листах

Данные все начинаются с одной и той же ячейки C17, но заканчиваются в разных строках (например, C180, C268 и т. Д.). Я хочу иметь возможность консолидировать уникальные идентификаторы из всех шести таблиц еженедельно.

Есть ли решение, которое не будет использовать формулы массива, поскольку это СЕРЬЕЗНО вызывает проблему из-за большого количества строк и ресурсов, необходимых для вычисления списка. Предпочтительна автоматизация VBA, где диапазоны ячеек для консолидации могут быть динамическими, а имена листов указаны со специфических ячеек на листе мастер-листа (он никогда не будет удален или изменен в пределах шести других)?

Итак, я бы выполнил макрос, который объединит все данные, основанные либо на именованных диапазонах, либо на определенных ячейках с именами листов & в них (используя косвенные для использования этих строк) и вставляя их в новый диапазон.

UDF также будет приемлемым, я просто не хочу, чтобы Excel «замораживал» выполнение вычислений.

BTW, я прочитал Getting unique values in Excel by using formulas only, но эти решения работают только в том случае, если данные находятся на одном листе или в очень специфических условиях. Также формулы массива не будут работать эффективно, так как мои данные имеют буквально тысячи строк.

Edit:

Вот тест макро я использовал, чтобы получить данные из одного листа, но проблема в том, что я не могу использовать динамику, ни добавить остальные имена из других листов, так как диапазон скопировать его я не могу вытащить первую пустую ячейку после копирования 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)) 
+0

Что вы пробовали до сих пор? Люди просят кода ** ** ожидается в показать оригинальное усилие – Jeeped

+0

Хорошо, не проблема. Я не хотел забивать исходный пост, но я его отредактирую. – B1313

+0

Я не уверен, почему это получилось, поскольку он не нарушает правил и не получил шанс ответить на любые запросы комментариев. – B1313

ответ

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/

+1

Ответы только на ссылку идут против рекомендаций сайта для SO, являющегося сайтом Q & A, - всю информацию на самом сайте, не полагаясь на внешние ссылки. Это помогло бы повысить ценность вашего вклада, если бы вы могли представить пример скелета, как ваше предложение поможет решить проблему. –

+0

Извините. Я не понимал, что это неприемлемо. Я рассмотрю и попробую создать специальный шаблон для OP –

+0

@DougCoats, почему вы закрываете структуру _with_ вне структур _for_? – B1313