Excel — VBA — создать комбинацию уникальных кодов каждого первичного ключа

#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 Я хотел добавить к этому, что вы могли бы извлечь дополнительную выгоду, переведя вычисления в ручной режим перед заполнением формул, а затем снова переведя вычисления в автоматический режим (если это то, на что они обычно настроены)