Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Уменьшение времени работы макроса - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Уменьшение времени работы макроса (Макросы/Sub)
Уменьшение времени работы макроса
drblasster88 Дата: Воскресенье, 21.02.2016, 17:07 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 18
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Доброго времени суток. Помогите пожалуйста откорректировать код. я его записал с помощью рекордера, т.к. не владею теорией 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]


Сообщение отредактировал Manyasha - Воскресенье, 21.02.2016, 18:19
 
Ответить
СообщениеДоброго времени суток. Помогите пожалуйста откорректировать код. я его записал с помощью рекордера, т.к. не владею теорией 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
Дата добавления - 21.02.2016 в 17:07
RAN Дата: Воскресенье, 21.02.2016, 18:34 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Для 40 строк 30 секунд

Из них 29,8 секунд открывается файл "C:\Users\Александр\Desktop\Desktop\Макрос по банкротам\Выгрузка.xlsx"
Если интересует ускорение на 0,1 сек., тогда, оно, конечно ...


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Воскресенье, 21.02.2016, 18:34
 
Ответить
Сообщение
Для 40 строк 30 секунд

Из них 29,8 секунд открывается файл "C:\Users\Александр\Desktop\Desktop\Макрос по банкротам\Выгрузка.xlsx"
Если интересует ускорение на 0,1 сек., тогда, оно, конечно ...

Автор - RAN
Дата добавления - 21.02.2016 в 18:34
drblasster88 Дата: Воскресенье, 21.02.2016, 18:45 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 18
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
RAN, Если копировать все значения (не только уникальные) то макрос работает быстро. Я подозреваю все дело в копировании диапазона уникальных значений
[vba]
Код
Columns("A:C").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
     Columns("A:C").Copy
[/vba]
Но другого способа копировать мне не приходит в голову, по той причине что количество значений каждый раз разное. А копировать диапазон заведомо больший чем нужно не хотелось бы


Сообщение отредактировал drblasster88 - Воскресенье, 21.02.2016, 18:48
 
Ответить
СообщениеRAN, Если копировать все значения (не только уникальные) то макрос работает быстро. Я подозреваю все дело в копировании диапазона уникальных значений
[vba]
Код
Columns("A:C").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
     Columns("A:C").Copy
[/vba]
Но другого способа копировать мне не приходит в голову, по той причине что количество значений каждый раз разное. А копировать диапазон заведомо больший чем нужно не хотелось бы

Автор - drblasster88
Дата добавления - 21.02.2016 в 18:45
StoTisteg Дата: Воскресенье, 21.02.2016, 19:22 | Сообщение № 4
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
Ну если для получения уников применять AdvancedFilter вместо RemoveDuplicates, то конечно...


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
СообщениеНу если для получения уников применять AdvancedFilter вместо RemoveDuplicates, то конечно...

Автор - StoTisteg
Дата добавления - 21.02.2016 в 19:22
drblasster88 Дата: Воскресенье, 21.02.2016, 19:37 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 18
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
StoTisteg, Пробовал удалять дубликаты, но в этом случае не могу скопировать "все" значения, копируется только определенный диапазон, чего бы мне не хотелось. Нужно что бы копировалось столько строчек из диапазон А:С, сколько осталось после удаления дубликатов. Если подскажет как это сделать, буду благодарен
 
Ответить
СообщениеStoTisteg, Пробовал удалять дубликаты, но в этом случае не могу скопировать "все" значения, копируется только определенный диапазон, чего бы мне не хотелось. Нужно что бы копировалось столько строчек из диапазон А:С, сколько осталось после удаления дубликатов. Если подскажет как это сделать, буду благодарен

Автор - drblasster88
Дата добавления - 21.02.2016 в 19:37
StoTisteg Дата: Воскресенье, 21.02.2016, 19:43 | Сообщение № 6
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
Дайте угадаю. Вы копируете из UsedRange, RemoveDuplicates его не меняет?
Копируйте с 1 по Cells(Rows.Count, 1).End(xlUp).Row


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
СообщениеДайте угадаю. Вы копируете из UsedRange, RemoveDuplicates его не меняет?
Копируйте с 1 по Cells(Rows.Count, 1).End(xlUp).Row

Автор - StoTisteg
Дата добавления - 21.02.2016 в 19:43
drblasster88 Дата: Воскресенье, 21.02.2016, 19:53 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 18
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
StoTisteg, Простите, я просто макрос рекордером записал...разбираться в коде еще только учусь, можете наглядно показать как должно быть?
Дубликаты я удалял из интерфейса экселя, после чего выделял содержимое посредством CTRL +A, но когда я так делаю в коде прописывается диапазон А1:С15
 
Ответить
СообщениеStoTisteg, Простите, я просто макрос рекордером записал...разбираться в коде еще только учусь, можете наглядно показать как должно быть?
Дубликаты я удалял из интерфейса экселя, после чего выделял содержимое посредством CTRL +A, но когда я так делаю в коде прописывается диапазон А1:С15

Автор - drblasster88
Дата добавления - 21.02.2016 в 19:53
gling Дата: Воскресенье, 21.02.2016, 20:10 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2519
Репутация: 674 ±
Замечаний: 0% ±

2010
А зачем у вас диапазоны такие большие от все строки листа А:С. Нельзя их ограничить A1:C10000, например? И есть ли формулы которые могут пересчитываться, каждый раз при удалении дубликатов. Может на момент удаления дубликатов, отключать еще и пересчет формул?


ЯД-41001506838083
 
Ответить
СообщениеА зачем у вас диапазоны такие большие от все строки листа А:С. Нельзя их ограничить A1:C10000, например? И есть ли формулы которые могут пересчитываться, каждый раз при удалении дубликатов. Может на момент удаления дубликатов, отключать еще и пересчет формул?

Автор - gling
Дата добавления - 21.02.2016 в 20:10
drblasster88 Дата: Воскресенье, 21.02.2016, 20:22 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 18
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
gling, На счет диапазонов, я их выставляю потому что не знаю как по другому сделать. Просто в файле всегда будет разное количество значений. А в файле из которого запускается макрос есть формулы, поэтому мне хочется что бы копировалось всегда столько строк из А:С, сколько осталось заполнено после удаления дубликатов. Вкладываю пример. может быть так будет наглядней
К сообщению приложен файл: __.xlsm (36.0 Kb) · 1365414.xlsx (22.6 Kb)
 
Ответить
Сообщениеgling, На счет диапазонов, я их выставляю потому что не знаю как по другому сделать. Просто в файле всегда будет разное количество значений. А в файле из которого запускается макрос есть формулы, поэтому мне хочется что бы копировалось всегда столько строк из А:С, сколько осталось заполнено после удаления дубликатов. Вкладываю пример. может быть так будет наглядней

Автор - drblasster88
Дата добавления - 21.02.2016 в 20:22
StoTisteg Дата: Воскресенье, 21.02.2016, 20:26 | Сообщение № 10
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
[vba]
Код

    ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7), Header:=xlYes
    Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 3)).Copy
    Windows("Письма по банкротам.xlsm").Activate
    Cells(2, 1).PasteSpecial Paste:=xlPasteValues
[/vba]
Перечисление строк (Array(1, 2, 3, 4, 5, 6, 7)) подставьте своё, благо, оно у вас, ЕМНИП, постоянное.


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
Сообщение[vba]
Код

    ActiveSheet.UsedRange.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7), Header:=xlYes
    Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 3)).Copy
    Windows("Письма по банкротам.xlsm").Activate
    Cells(2, 1).PasteSpecial Paste:=xlPasteValues
[/vba]
Перечисление строк (Array(1, 2, 3, 4, 5, 6, 7)) подставьте своё, благо, оно у вас, ЕМНИП, постоянное.

Автор - StoTisteg
Дата добавления - 21.02.2016 в 20:26
drblasster88 Дата: Воскресенье, 21.02.2016, 21:01 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 18
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
StoTisteg, Спасибо большое, теперь очень быстро работает. Я только не понял по поводу перечисления строк. (Array(1, 2, 3, 4, 5, 6, 7)) - перечисление каких строк? Я просто не подставлял ничего, но макрос работает как надо, хотя строк больше чем 7. Извините если вопрос глупый, просто хочется понимать
 
Ответить
СообщениеStoTisteg, Спасибо большое, теперь очень быстро работает. Я только не понял по поводу перечисления строк. (Array(1, 2, 3, 4, 5, 6, 7)) - перечисление каких строк? Я просто не подставлял ничего, но макрос работает как надо, хотя строк больше чем 7. Извините если вопрос глупый, просто хочется понимать

Автор - drblasster88
Дата добавления - 21.02.2016 в 21:01
StoTisteg Дата: Воскресенье, 21.02.2016, 21:21 | Сообщение № 12
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
Это перечисление тех колонок, в которых ищутся совпадения. Если Вам нужны дубликаты по первой колонке, то
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
Дата добавления - 21.02.2016 в 21:21
StoTisteg Дата: Воскресенье, 21.02.2016, 21:26 | Сообщение № 13
Группа: Авторы
Ранг: Старожил
Сообщений: 1161
Репутация: 103 ±
Замечаний: 0% ±

Excel 2010
Впрочем, Вам бы я посоветовал Columns:=(1,3), потому что ИНН — уникальный идентификатор предприятия, в третьей колонке у Вас, НЯП, сидит уникальный идентификатор решения. А какие очепятки могут встречаться в названиях, ведомо только тем, кто их ручками вбивает :)


Интуитивно понятный код - это когда интуитивно понятно, что это код.
 
Ответить
СообщениеВпрочем, Вам бы я посоветовал Columns:=(1,3), потому что ИНН — уникальный идентификатор предприятия, в третьей колонке у Вас, НЯП, сидит уникальный идентификатор решения. А какие очепятки могут встречаться в названиях, ведомо только тем, кто их ручками вбивает :)

Автор - StoTisteg
Дата добавления - 21.02.2016 в 21:26
drblasster88 Дата: Воскресенье, 21.02.2016, 21:35 | Сообщение № 14
Группа: Пользователи
Ранг: Новичок
Сообщений: 18
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
StoTisteg, Теперь все понятно, спасибо что объяснили. Так и поступлю
 
Ответить
СообщениеStoTisteg, Теперь все понятно, спасибо что объяснили. Так и поступлю

Автор - drblasster88
Дата добавления - 21.02.2016 в 21:35
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Уменьшение времени работы макроса (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!