Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2010, 11:21   #1
borik120
Пользователь
 
Регистрация: 17.01.2010
Сообщений: 30
По умолчанию ускорить работу макроса

здравствуйте, я в VBA новичек, но тут выпала надобность написать маленький макрос. В документе три листа, "Юля" - наименоваания с ценами, "Т-А" - таблица соответствия (о ней расскажу дальше), "П-А1" - выходной лист для переноса цен из листа "Юля". Таблица соответствия - это таблица из двух столбцов в сторках которой прописаны соответствия между наименованиями в листах "Юля" и "П-А1".

макрос работает так: берет первое наименование на Листе "Т-А" и ищет его на листе "Юля", когда находит, он из соседнего столбца, той же строки, на Листе "Юля" копирует цену. Потом переходит на лист "П-А1", и ищет первое наименование из листа соответствия на листе "П-А1" и вставляет цену в соседний столбец. помимо этого макрос еще подсвечивает на листе "юля" те ячейки из которых он копировал цену. вот как то так . А проблема состоит в том, что макрос выполняется слишком долго, на листе на каждом листе примерно по 1000 наименований. но я не думаю, что из-за этого. подскажите пожалуста как можно оптимизировать данный код. буду благодарен всей душой.

Код:
Sub разноскаЮля()

k = 1

For i = 1 To 1000
If Worksheets("Т-А").Range("AM" & k).Text = Worksheets("Юля").Range("B" & i).Text Then Worksheets("Юля").Range("C" & i).Copy Else GoTo 1

If Worksheets("Т-А").Range("AM" & k).Text = "стоп" Then GoTo 2



    For j = 1 To 1000
    If (Worksheets("П-А1").Range("J" & j).Text = Worksheets("Т-А").Range("J" & k).Text) And (Worksheets("П-А1").Range("K" & j).Text = Worksheets("Т-А").Range("K" & k).Text) And (Worksheets("П-А1").Range("L" & j).Text = Worksheets("Т-А").Range("L" & k).Text) Then
    Worksheets("П-А1").Range("AN" & j).PasteSpecial
    End If
   

    Next j

Worksheets("Юля").Range("B" & i).Interior.Color = RGB(200, 160, 35)

k = k + 1
i = 4
1
Next i
2

End Sub
borik120 вне форума Ответить с цитированием
Старый 17.01.2010, 11:37   #2
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Как минимум перед выполнением макроса необходимо отключить обновление экрана и автоперсчет формул:
Код:
Sub разноскаЮля()
Application.Screenupdating = false
Application.calculation = xlManual
А перед завершением вернуть все на место
Код:
Application.Screenupdating = true
Application.calculation = xlautomatic
End Sub
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Старый 17.01.2010, 11:57   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Ваш макрос можно ускорить в десятки раз - достаточно отказаться от вложенных циклов.
Для поиска совсем необязательно перебирать все ячейки в цикле.

Прикрепите пример файла с исходными данными и тем, что должно получиться в результате работы макроса.
PS: Можно попробовать обойтись без макроса - по крайней мере, бОльшую часть работы можно выполнить простейшими формулами.
EducatedFool вне форума Ответить с цитированием
Старый 17.01.2010, 19:11   #4
borik120
Пользователь
 
Регистрация: 17.01.2010
Сообщений: 30
По умолчанию

Цитата:
Для поиска совсем необязательно перебирать все ячейки в цикле.
Можно попробовать обойтись без макроса
а можно поподробней про эти два случая?
borik120 вне форума Ответить с цитированием
Старый 17.01.2010, 19:58   #5
The_Prist
Участник клуба
 
Аватар для The_Prist
 
Регистрация: 17.07.2009
Сообщений: 1,088
По умолчанию

Цитата:
Сообщение от borik120 Посмотреть сообщение
а можно поподробней про эти два случая?
Вам написали, что для этого надо сделать.
WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
www.excel-vba.ru
The_Prist вне форума Ответить с цитированием
Старый 17.01.2010, 20:21   #6
borik120
Пользователь
 
Регистрация: 17.01.2010
Сообщений: 30
По умолчанию

вот файл. в принципе то что мне нужно написано в первом посте. а если вкратце, нужно чтобы цены из прайса "юля", забивались в прайс "П-А1". а таблица соответствий названий находится на листе "Т-А".
в коде который я отправил в первом посте, не совпадают названия столбцов с тем файлом который я сюда скинул, т.к. из этого файла я удалил все ненужные столбцы. мне бы идею, как сделать без цикла, а то получается что макрос работает минут 30(
в качестве небольшого вознаграждения, т.к. вебмани номер забыт, могу кинуть денег на телефон) лишь бы работало. заранее спасибо. извиняюсь что сразу не выложил исходники.
Вложения
Тип файла: rar в инет.rar (2.51 Мб, 8 просмотров)
borik120 вне форума Ответить с цитированием
Старый 18.01.2010, 06:24   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Посмотрите вложение. Запустите макрос "Main". При нахождении данных, в лист "Т-А" заносится цена, а в лист "П-А1" - в столбец "Z" - запись, найденная в листе соответствий, а в столбец "AA" - цена. Сделал так, как понял. Если что-то не нужно - уберите из кода.
P.S. Для "облегчения" файла, удалены лишние листы.
Вложения
Тип файла: rar в инет_2.rar (732.1 Кб, 18 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 18.01.2010, 14:33   #8
borik120
Пользователь
 
Регистрация: 17.01.2010
Сообщений: 30
По умолчанию

SAS888, спасибо большое, в принципе то что нужно, только не надо было удалять столбцы на листе П-А1, там где были написаны обьем и M\W(мужской женский), они ведь тоже участвуют в соответствии. Хотелось бы понять как это работает, то есть комментарии к макросу.
borik120 вне форума Ответить с цитированием
Старый 19.01.2010, 06:22   #9
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

В приложении тот же файл с комментариями.
Цитата:
не надо было удалять столбцы на листе П-А1, там где были написаны обьем и M\W(мужской женский), они ведь тоже участвуют в соответствии
Каким образом они это делают? Я считал, что соответствие - это записи в строках на листе "Т-А" в столбцах "J" и "AM". Не так?
Вложения
Тип файла: rar в инет_2_comments.rar (732.9 Кб, 23 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 19.01.2010, 11:53   #10
borik120
Пользователь
 
Регистрация: 17.01.2010
Сообщений: 30
По умолчанию

Да, соответствие на листе "Т-А" столбцы J,K,L в документе П-А1 соответствуют единственному столбцу на листе "Юля". В документе "Т-А" так и идет, - 4 столбца. Но не стоит ничего исправлять, я сам постараюсь, все сделать. Большое спасибо SAS888
borik120 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как ускорить работу этого макроса? Neo007 Microsoft Office Excel 1 22.06.2009 18:14
Как ускорить работу программы SibBear Общие вопросы Delphi 7 27.03.2009 14:40
помогите ускорить работу программы... Pashtet Паскаль, Turbo Pascal, PascalABC.NET 5 25.11.2008 22:12
Как ускорить работу с сетевой БД Ramires БД в Delphi 3 21.08.2008 12:16
Помогите пожалуйста ускорить работу по реконструкции моста Геодезистка Помощь студентам 10 07.10.2007 00:05