#excel #vba
#преуспеть #vba
Вопрос:
Мне нужно создать комбинацию уникальных кодов, разделенных запятой.
То, что мне действительно нужно
Я бы хотел, чтобы сообщество stack помогло мне сделать процесс БЫСТРЕЕ и эффективнее… Возможно, с использованием только VBA…
Пример базы данных
AB | Переменный ток | КОМБИНАЦИЯ |
---|---|---|
41771067424895000677550010000477911436409011 | 2556 | 2556 |
77161087658787000161550010000677811133532252 | 2556 | 2407, 2556 |
77161087658787000161550010000677811133532252 | 2407 | 2407, 2556 |
AB
уникальные ключи из базы данных;AC
это код, в котором уникальный ключ может иметь один или несколько;AD
Что я хочу показать;
Формула
Для этого я создал формулу, которая работает…
=TEXTJOIN(", "; TRUE; (UNIQUE(FILTER(AC:AC;AB:AB=AB7))))
Мой макрос
sub myMacro()
Sheets("ANEXO 7").Range("AD6").Value = "LISTA CFOP ÚNICOS POR NF"
Range("AD7").Formula2 = "=TEXTJOIN("", "", TRUE, (UNIQUE(FILTER(AC:AC,AB:AB=AB7))))"
Sheets("ANEXO 7").Range("AD7").Copy
ultima_linha = Sheets("ANEXO 7").Range("AB6").End(xlDown).Row
Sheets("ANEXO 7").Range("AD7" amp; ultima_linha).Select
Sheets("ANEXO 7").Range(Selection, Selection.End(xlUp)).Select
ActiveSheet.Paste
End Sub
В чем проблема
Весь этот процесс…
- Использует 100% процессора;
- Занимает слишком много времени (5 мин)
Комментарии:
1. Итак, вы говорите, что эта КОМБИНАЦИЯ представляет все значения переменного тока с соответствующими значениями AB? Есть ли у вас контроль над SQL, который попадает в БД для получения этих данных? Вы, вероятно, получите наилучшую производительность, попросив БД организовать результирующий набор по-другому в инструкции SQL. Как правило, формулы Excel очень плохо справляются с такого рода операциями. Если у вас нет контроля над SQL, следующая лучшая вещь — обрабатывать в памяти через VBA
2. Привет… Это одна из многих вещей, которые мы сделали с этими ДАННЫМИ. У нас есть данные из нескольких источников. Я пытаюсь повысить эффективность этого анализа.
3. Первое, что приходит на ум (если вы хотите пройти этот маршрут с помощью формулы), что сэкономит массу времени, — это удалить ссылки на целые столбцы. Особенно с этими тяжелыми формулами типа массива почти никогда не рекомендуется запускать их для целых столбцов.
Ответ №1:
Метод FillDown должен быть значительно быстрее, чем копирование / вставка. Попробуйте этот код и дайте нам знать.
Sub myMacro()
Application.Calculation = xlCalculationManual
Sheets("ANEXO 7").Range("AD6").Value = "LISTA CFOP ÚNICOS POR NF"
Range("AD7").Formula2 = "=TEXTJOIN("", "", TRUE, (UNIQUE(FILTER(AC:AC,AB:AB=AB7))))"
ultima_linha = Sheets("ANEXO 7").Range("AB6").End(xlDown).Row
Sheets("ANEXO 7").Range("AD7:AD" amp; ultima_linha).FillDown
Application.Calculation = xlCalculationAutomatic
End Sub
Комментарии:
1. Я жду последних процессов, которые находятся в фоновом режиме… Как только это закончится, я постараюсь дать вам обратную связь! Спасибо за ваше предложение.
2. @AndreNevares Я хотел добавить к этому, что вы могли бы извлечь дополнительную выгоду, переведя вычисления в ручной режим перед заполнением формул, а затем снова переведя вычисления в автоматический режим (если это то, на что они обычно настроены)