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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2014, 16:44   #1
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию Vlookup

Добрый день, попытался реализовать аналог ВПР, но с автоматическим открытием файла. Почему это так медленно работает? Простой ВПР который вручную займет 10-30 секунд, в VBA работает аж 120-130 секунд. Как это можно ускорить? Спасибо.

Код:
Function vp()
t = Timer
Dim i As Long
i = 1
Dim wb As Workbook
Set wb = Workbooks.Open("F:/File1.xls")
Do While Not (IsEmpty(Workbooks("File2.xls").Sheets(1).Cells(i, 1)))
On Error Resume Next
Workbooks("File2.xls").Sheets(1).Cells(i, 2) = WorksheetFunction.VLookup(Workbooks("File2.xls").Sheets(1).Cells(i, 1), wb.Sheets(1).Range("A1:CB50000"), 80, False)
i = i + 1
Loop
wb.Close
MsgBox "Обработка данных продолжалась  " & Timer - t & " сек.", vbInformation
End Function
CWD вне форума Ответить с цитированием
Старый 18.05.2014, 17:06   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Ускорить можно, только полностью переписав код
(вы выбрали самый медленный способ из всех возможных)

были бы примеры файлов, - глядишь, кто-нибудь и подкинул бы готовый код.
Думаю, время обработки реально сократить до 2-3 секунд


Кстати, можете попробовать мою надстройку, - аналог ВПР:
http://excelvba.ru/programmes/Lookup
Интересно узнать, за какое время она справится с задачей
EducatedFool вне форума Ответить с цитированием
Старый 18.05.2014, 17:23   #3
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию

ВПР надо делать к File2 из File1, необходимые значения находятся в File1 колонка CB или номер 80. Буду признателен если подскажите как сделать быстрее.
Вложения
Тип файла: rar File1.rar (483.4 Кб, 8 просмотров)
Тип файла: rar File2.rar (236.7 Кб, 7 просмотров)
CWD вне форума Ответить с цитированием
Старый 18.05.2014, 20:28   #4
RAN.
Форумчанин
 
Аватар для RAN.
 
Регистрация: 05.07.2011
Сообщений: 208
По умолчанию

Подгонять под ваши файлы желания нет
Код:
Sub Мяу()
[b1:b7].FormulaR1C1 = "=VLOOKUP(RC[16383],[Книга1.xlsx]Лист1!R1C1:R7C2,2,0)"
[b1:b7].Value = [b1:b7].Value
End Sub
RAN. вне форума Ответить с цитированием
Старый 19.05.2014, 00:13   #5
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию

Цитата:
Сообщение от RAN. Посмотреть сообщение
Подгонять под ваши файлы желания нет
Код:
Sub Мяу()
[b1:b7].FormulaR1C1 = "=VLOOKUP(RC[16383],[Книга1.xlsx]Лист1!R1C1:R7C2,2,0)"
[b1:b7].Value = [b1:b7].Value
End Sub
Здравствуйте. Реализовал ваш вариант

Код:
Function vp()
t = Timer
Dim i As Long
i = 1
Dim wb As Workbook
Set wb = Workbooks.Open("F:/File1.xls")

Workbooks("File2.xls").Sheets(1).Range("B:B").FormulaR1C1 = "=VLOOKUP(RC[-1],[File1.xls]Лист1!R1C1:R40000C80,80,0)"
Workbooks("File2.xls").Worksheets(1).Range("B:B") = Workbooks("File2.xls").Worksheets(1).Range("B:B").Value

wb.Close
MsgBox "Обработка данных продолжалась  " & Timer - t & " сек.", vbInformation
End Function
Время составило около 200 секунд, против 120-130 секунд выше изложенного варианта, что есть хуже на 50%. Спасибо.
CWD вне форума Ответить с цитированием
Старый 19.05.2014, 01:03   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Ну так конечно - у себя может всего десяток ячеек формулой забили, а тут аж целиком столбец!
Вы сперва определите диапазон, затем конкретно его и заполните.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 19.05.2014, 10:06   #7
RAN.
Форумчанин
 
Аватар для RAN.
 
Регистрация: 05.07.2011
Сообщений: 208
По умолчанию

Провел эксперимент
Код:
Sub qq()
Dim t!
Dim wb As Workbook
t = Timer
ThisWorkbook.Sheets(1).Range("B1:B40000").FormulaR1C1 = "=VLOOKUP(RC[-1],[Книга3.xlsx]Лист1!R1C1:R40000C80,80,0)"
ThisWorkbook.Worksheets(1).Range("B1:B40000").Value = ThisWorkbook.Worksheets(1).Range("B1:B40000").Value
Debug.Print "t1:  "; Format(Timer - t, "0.0000")
ThisWorkbook.Worksheets(1).Range("B1:B40000").Clear
t = Timer

Set wb = Workbooks.Open("D:\a\Книга3.xlsx")
Debug.Print "t2:  "; Format(Timer - t, "0.0000")
t = Timer

ThisWorkbook.Sheets(1).Range("B1:B40000").FormulaR1C1 = "=VLOOKUP(RC[-1],[Книга3.xlsx]Лист1!R1C1:R40000C80,80,0)"
ThisWorkbook.Worksheets(1).Range("B1:B40000").Value = ThisWorkbook.Worksheets(1).Range("B1:B40000").Value
Debug.Print "t3:  "; Format(Timer - t, "0.0000")
'ThisWorkbook.Worksheets(1).Range("B1:B40000").Clear
wb.Close
End Sub
t1: 28,5469
t2: 0,5938
t3: 12,4531

Но почему, когда без явного открытия книги тянет, время чуть не втрое больше?

Последний раз редактировалось RAN.; 19.05.2014 в 10:10.
RAN. вне форума Ответить с цитированием
Старый 19.05.2014, 11:00   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

чтобы посмотреть данные - файл все равно открыть надо, и если это не далает явно программист, то делают какие-то внутренние процессы ексель, и уже какая разница какие...
когда эмпирическим путем установлено, как быстрее.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 19.05.2014, 12:42   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Я не понял - а откуда ВПР() в первом варианте берёт данные? Если такая книга не открыта - следует запрос файла, может поэтому время больше - Вы медленно мышом шевелили? ?)
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 19.05.2014, 14:29   #10
RAN.
Форумчанин
 
Аватар для RAN.
 
Регистрация: 05.07.2011
Сообщений: 208
По умолчанию

Если книгу с макросом и книгу с данными бросить в одну папку, то первый вариант вполне успешно работает. И никакого запроса нет.
Из разных папок, правда, не хочет.
RAN. вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
с vlookup-ом не получается user7789 Microsoft Office Excel 3 06.06.2013 13:55
VLOOKUP - второй, третий результат? jungo Microsoft Office Excel 2 23.11.2009 13:42
Опять vlookup Belokuraya Microsoft Office Excel 11 30.07.2009 20:16
Поиск в тексте и VLookup jungo Microsoft Office Excel 4 27.04.2009 09:53
Не работает фотрмула VLOOKUP mirawoo Microsoft Office Excel 3 06.08.2008 12:22