Доброго времени суток. Помогите пожалуйста откорректировать код. я его записал с помощью рекордера, т.к. не владею теорией VBA. Макрос работает и результат удоволетворяет, но отрабатывает очень долго. Для 40 строк 30 секунд. Задача у него простая: залезть в файл и скопировать уникальные значения из А:С в файл, из которого запускается макрос. [vba]
Код
Sub Вставить() Application.DisplayAlerts = False Workbooks.Open Filename:="C:\Users\Александр\Desktop\Desktop\Макрос по банкротам\Выгрузка.xlsx" Columns("A:C").AdvancedFilter Action:=xlFilterInPlace, Unique:=True Columns("A:C").Copy Windows("Письма по банкротам.xlsm").Activate Range("Таблица1[ИНН]").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("Выгрузка.xlsx").Activate ActiveWindow.Close Range("A2").Select Application.DisplayAlerts = True End Sub
[/vba]
[moder]Почему тема в разделе Готовых решений? перенесла.[/moder]
Доброго времени суток. Помогите пожалуйста откорректировать код. я его записал с помощью рекордера, т.к. не владею теорией VBA. Макрос работает и результат удоволетворяет, но отрабатывает очень долго. Для 40 строк 30 секунд. Задача у него простая: залезть в файл и скопировать уникальные значения из А:С в файл, из которого запускается макрос. [vba]
Код
Sub Вставить() Application.DisplayAlerts = False Workbooks.Open Filename:="C:\Users\Александр\Desktop\Desktop\Макрос по банкротам\Выгрузка.xlsx" Columns("A:C").AdvancedFilter Action:=xlFilterInPlace, Unique:=True Columns("A:C").Copy Windows("Письма по банкротам.xlsm").Activate Range("Таблица1[ИНН]").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("Выгрузка.xlsx").Activate ActiveWindow.Close Range("A2").Select Application.DisplayAlerts = True End Sub
[/vba]
[moder]Почему тема в разделе Готовых решений? перенесла.[/moder]drblasster88
Сообщение отредактировал Manyasha - Воскресенье, 21.02.2016, 18:19
Из них 29,8 секунд открывается файл "C:\Users\Александр\Desktop\Desktop\Макрос по банкротам\Выгрузка.xlsx" Если интересует ускорение на 0,1 сек., тогда, оно, конечно ...
Из них 29,8 секунд открывается файл "C:\Users\Александр\Desktop\Desktop\Макрос по банкротам\Выгрузка.xlsx" Если интересует ускорение на 0,1 сек., тогда, оно, конечно ...RAN
Быть или не быть, вот в чем загвоздка!
Сообщение отредактировал RAN - Воскресенье, 21.02.2016, 18:34
RAN, Если копировать все значения (не только уникальные) то макрос работает быстро. Я подозреваю все дело в копировании диапазона уникальных значений [vba]
[/vba] Но другого способа копировать мне не приходит в голову, по той причине что количество значений каждый раз разное. А копировать диапазон заведомо больший чем нужно не хотелось бы
RAN, Если копировать все значения (не только уникальные) то макрос работает быстро. Я подозреваю все дело в копировании диапазона уникальных значений [vba]
[/vba] Но другого способа копировать мне не приходит в голову, по той причине что количество значений каждый раз разное. А копировать диапазон заведомо больший чем нужно не хотелось быdrblasster88
Сообщение отредактировал drblasster88 - Воскресенье, 21.02.2016, 18:48
StoTisteg, Пробовал удалять дубликаты, но в этом случае не могу скопировать "все" значения, копируется только определенный диапазон, чего бы мне не хотелось. Нужно что бы копировалось столько строчек из диапазон А:С, сколько осталось после удаления дубликатов. Если подскажет как это сделать, буду благодарен
StoTisteg, Пробовал удалять дубликаты, но в этом случае не могу скопировать "все" значения, копируется только определенный диапазон, чего бы мне не хотелось. Нужно что бы копировалось столько строчек из диапазон А:С, сколько осталось после удаления дубликатов. Если подскажет как это сделать, буду благодаренdrblasster88
StoTisteg, Простите, я просто макрос рекордером записал...разбираться в коде еще только учусь, можете наглядно показать как должно быть? Дубликаты я удалял из интерфейса экселя, после чего выделял содержимое посредством CTRL +A, но когда я так делаю в коде прописывается диапазон А1:С15
StoTisteg, Простите, я просто макрос рекордером записал...разбираться в коде еще только учусь, можете наглядно показать как должно быть? Дубликаты я удалял из интерфейса экселя, после чего выделял содержимое посредством CTRL +A, но когда я так делаю в коде прописывается диапазон А1:С15drblasster88
А зачем у вас диапазоны такие большие от все строки листа А:С. Нельзя их ограничить A1:C10000, например? И есть ли формулы которые могут пересчитываться, каждый раз при удалении дубликатов. Может на момент удаления дубликатов, отключать еще и пересчет формул?
А зачем у вас диапазоны такие большие от все строки листа А:С. Нельзя их ограничить A1:C10000, например? И есть ли формулы которые могут пересчитываться, каждый раз при удалении дубликатов. Может на момент удаления дубликатов, отключать еще и пересчет формул?gling
gling, На счет диапазонов, я их выставляю потому что не знаю как по другому сделать. Просто в файле всегда будет разное количество значений. А в файле из которого запускается макрос есть формулы, поэтому мне хочется что бы копировалось всегда столько строк из А:С, сколько осталось заполнено после удаления дубликатов. Вкладываю пример. может быть так будет наглядней
gling, На счет диапазонов, я их выставляю потому что не знаю как по другому сделать. Просто в файле всегда будет разное количество значений. А в файле из которого запускается макрос есть формулы, поэтому мне хочется что бы копировалось всегда столько строк из А:С, сколько осталось заполнено после удаления дубликатов. Вкладываю пример. может быть так будет нагляднейdrblasster88
StoTisteg, Спасибо большое, теперь очень быстро работает. Я только не понял по поводу перечисления строк. (Array(1, 2, 3, 4, 5, 6, 7)) - перечисление каких строк? Я просто не подставлял ничего, но макрос работает как надо, хотя строк больше чем 7. Извините если вопрос глупый, просто хочется понимать
StoTisteg, Спасибо большое, теперь очень быстро работает. Я только не понял по поводу перечисления строк. (Array(1, 2, 3, 4, 5, 6, 7)) - перечисление каких строк? Я просто не подставлял ничего, но макрос работает как надо, хотя строк больше чем 7. Извините если вопрос глупый, просто хочется пониматьdrblasster88
Это перечисление тех колонок, в которых ищутся совпадения. Если Вам нужны дубликаты по первой колонке, то Columns:=1, по 1 и 2 — Columns:=Array(1, 2), по 3 и 5 — Columns:=Array(3, 5) и т. д. Если у Вас колонок больше 7, то работать будет, только от двух строк АБВГ 123 ДЕЖЗ 456 asdf 6890 klasd ASDФЫВ АБВГ 123 ДЕЖЗ 456 asdf 6890 klasd DFGрол останется только первая. Впрочем, если Вам нужны уники из первых трёх колонок, то правильнее будет Columns:=Array(1, 2, 3).
Это перечисление тех колонок, в которых ищутся совпадения. Если Вам нужны дубликаты по первой колонке, то Columns:=1, по 1 и 2 — Columns:=Array(1, 2), по 3 и 5 — Columns:=Array(3, 5) и т. д. Если у Вас колонок больше 7, то работать будет, только от двух строк АБВГ 123 ДЕЖЗ 456 asdf 6890 klasd ASDФЫВ АБВГ 123 ДЕЖЗ 456 asdf 6890 klasd DFGрол останется только первая. Впрочем, если Вам нужны уники из первых трёх колонок, то правильнее будет Columns:=Array(1, 2, 3).StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.
Впрочем, Вам бы я посоветовал Columns:=(1,3), потому что ИНН — уникальный идентификатор предприятия, в третьей колонке у Вас, НЯП, сидит уникальный идентификатор решения. А какие очепятки могут встречаться в названиях, ведомо только тем, кто их ручками вбивает
Впрочем, Вам бы я посоветовал Columns:=(1,3), потому что ИНН — уникальный идентификатор предприятия, в третьей колонке у Вас, НЯП, сидит уникальный идентификатор решения. А какие очепятки могут встречаться в названиях, ведомо только тем, кто их ручками вбивает StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.