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

Вход

Регистрация

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

 

= Мир MS Excel/Как ускорить работу макроса или по другому решить проблему? - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: китин, _Boroda_  
Как ускорить работу макроса или по другому решить проблему?
Дмитрий87 Дата: Среда, 20.02.2013, 21:06 | Сообщение № 21
Группа: Пользователи
Ранг: Новичок
Сообщений: 19
Репутация: 0 ±
Замечаний: 0% ±

Формуляр, решение с sql запросом в excel выполнило условие - по времени минут 40-50...что очень много
 
Ответить
СообщениеФормуляр, решение с sql запросом в excel выполнило условие - по времени минут 40-50...что очень много

Автор - Дмитрий87
Дата добавления - 20.02.2013 в 21:06
Дмитрий87 Дата: Среда, 20.02.2013, 21:09 | Сообщение № 22
Группа: Пользователи
Ранг: Новичок
Сообщений: 19
Репутация: 0 ±
Замечаний: 0% ±

СПАСИБО ВСЕМ КТО ОТОЗВАЛСЯ НА ПРОСЬБУ!!!
САМОЕ БЫСТРОЕ РЕШЕНИЕ ПОДСКАЗАЛ ЧЕЛОВЕК С ДРУГОГО ФОРУМА ПОД НИКОМ ------ nilem -------
вот код может кому ещё пригодится
[vba]
Код

Sub ertert()
Dim tm!: tm = Timer
Dim x, y(), i&, j&
x = Range("A1", Cells(Rows.Count, 1).End(xlUp)).Value
ReDim y(1 To UBound(x), 1 To 1)
With CreateObject("Scripting.Dictionary")
     For i = 1 To UBound(x)
         .Item(x(i, 1)) = Empty
     Next i
     x = Range("C1", Cells(Rows.Count, 3).End(xlUp)).Value
     For i = 1 To UBound(x)
         If .Exists(x(i, 1)) Then j = j + 1: y(j, 1) = x(i, 1)
     Next i
End With
If j > 0 Then Range("B1").Resize(j).Value = y() Else MsgBox "???????? ???", 64
MsgBox Timer - tm
End Sub

[/vba]
 
Ответить
СообщениеСПАСИБО ВСЕМ КТО ОТОЗВАЛСЯ НА ПРОСЬБУ!!!
САМОЕ БЫСТРОЕ РЕШЕНИЕ ПОДСКАЗАЛ ЧЕЛОВЕК С ДРУГОГО ФОРУМА ПОД НИКОМ ------ nilem -------
вот код может кому ещё пригодится
[vba]
Код

Sub ertert()
Dim tm!: tm = Timer
Dim x, y(), i&, j&
x = Range("A1", Cells(Rows.Count, 1).End(xlUp)).Value
ReDim y(1 To UBound(x), 1 To 1)
With CreateObject("Scripting.Dictionary")
     For i = 1 To UBound(x)
         .Item(x(i, 1)) = Empty
     Next i
     x = Range("C1", Cells(Rows.Count, 3).End(xlUp)).Value
     For i = 1 To UBound(x)
         If .Exists(x(i, 1)) Then j = j + 1: y(j, 1) = x(i, 1)
     Next i
End With
If j > 0 Then Range("B1").Resize(j).Value = y() Else MsgBox "???????? ???", 64
MsgBox Timer - tm
End Sub

[/vba]

Автор - Дмитрий87
Дата добавления - 20.02.2013 в 21:09
Michael_S Дата: Среда, 20.02.2013, 21:32 | Сообщение № 23
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
Цитата (Дмитрий87)
САМОЕ БЫСТРОЕ РЕШЕНИЕ ПОДСКАЗАЛ ЧЕЛОВЕК С ДРУГОГО ФОРУМА
Жаль, не знал, что это кросс - не терял бы время.
У меня макрос на этом же принципе и быстродействие практически одинаковое (на примере с "Залил" - ок. 30 сек), правда в том примере повторов нет - сделал принудительно. Единственное отличие - у меня не надо отбирать уникальные. и не важно, в каком столбце больше записей.

[vba]
Код
Sub myDuplikat()
Dim oDict: Set oDict = CreateObject("Scripting.Dictionary")  ' Создаем словарь
Dim Arr(), i
Dim t: t = Timer:
Arr = Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
With oDict
     On Error Resume Next
          
     For i = 1 To UBound(Arr)
         .Add Key:=Arr(i, 1), Item:=True
     Next
      
     Arr = Range("C1:C" & Cells(Rows.Count, 3).End(xlUp).Row)
     For i = 1 To UBound(Arr)
         If .exists(Arr(i, 1)) Then .Item(Arr(i, 1)) = False
     Next
      
     Arr = .keys
      
     For i = 0 To UBound(Arr)
         If .Item(Arr(i)) Then .Remove Arr(i)
     Next
      
     If .Count Then
         Arr = .keys
         If UBound(Arr) < 63000 Then
                Range("B1").Resize(UBound(Arr) + 1) = WorksheetFunction.Transpose(Arr)
         Else
             ReDim mArr(UBound(Arr), 0)
             For i = 0 To UBound(Arr)
                 mArr(i, 0) = Arr(i)
             Next
             Range("B1").Resize(UBound(mArr) + 1) = mArr
         End If
     End If
End With
Debug.Print Timer - t
End Sub
[/vba]
 
Ответить
Сообщение
Цитата (Дмитрий87)
САМОЕ БЫСТРОЕ РЕШЕНИЕ ПОДСКАЗАЛ ЧЕЛОВЕК С ДРУГОГО ФОРУМА
Жаль, не знал, что это кросс - не терял бы время.
У меня макрос на этом же принципе и быстродействие практически одинаковое (на примере с "Залил" - ок. 30 сек), правда в том примере повторов нет - сделал принудительно. Единственное отличие - у меня не надо отбирать уникальные. и не важно, в каком столбце больше записей.

[vba]
Код
Sub myDuplikat()
Dim oDict: Set oDict = CreateObject("Scripting.Dictionary")  ' Создаем словарь
Dim Arr(), i
Dim t: t = Timer:
Arr = Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
With oDict
     On Error Resume Next
          
     For i = 1 To UBound(Arr)
         .Add Key:=Arr(i, 1), Item:=True
     Next
      
     Arr = Range("C1:C" & Cells(Rows.Count, 3).End(xlUp).Row)
     For i = 1 To UBound(Arr)
         If .exists(Arr(i, 1)) Then .Item(Arr(i, 1)) = False
     Next
      
     Arr = .keys
      
     For i = 0 To UBound(Arr)
         If .Item(Arr(i)) Then .Remove Arr(i)
     Next
      
     If .Count Then
         Arr = .keys
         If UBound(Arr) < 63000 Then
                Range("B1").Resize(UBound(Arr) + 1) = WorksheetFunction.Transpose(Arr)
         Else
             ReDim mArr(UBound(Arr), 0)
             For i = 0 To UBound(Arr)
                 mArr(i, 0) = Arr(i)
             Next
             Range("B1").Resize(UBound(mArr) + 1) = mArr
         End If
     End If
End With
Debug.Print Timer - t
End Sub
[/vba]

Автор - Michael_S
Дата добавления - 20.02.2013 в 21:32
Serge_007 Дата: Четверг, 21.02.2013, 10:01 | Сообщение № 24
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Цитата (Дмитрий87)
ЧЕЛОВЕК С ДРУГОГО ФОРУМА ПОД НИКОМ ------ nilem -------

Трудно назвать Николая "человеком с другого форума"
Он вообще-то вторым (после меня) зарегистрировался на ЭТОМ форуме на следующий день после его открытия wink


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Цитата (Дмитрий87)
ЧЕЛОВЕК С ДРУГОГО ФОРУМА ПОД НИКОМ ------ nilem -------

Трудно назвать Николая "человеком с другого форума"
Он вообще-то вторым (после меня) зарегистрировался на ЭТОМ форуме на следующий день после его открытия wink

Автор - Serge_007
Дата добавления - 21.02.2013 в 10:01
gling Дата: Пятница, 22.02.2013, 21:38 | Сообщение № 25
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2563
Репутация: 706 ±
Замечаний: 0% ±

2010

Есть вопрос по этой же теме.
Документ прилагаю. На листе материал запустить макрос.
Всё лишнее убрано.
Листов из которых берется инфа >10, строк в каждом листе от 300 д о 500
При полной версии документа макрос работает не менее 5 минут, точно не считал, но иногда комп виснет.
Можно ли ускорить работу макроса. Может через массив пробовать. Макрос писал не сам.
Если есть предложения намекните. Или вашу версию решения.
К сообщению приложен файл: 12.xlsm (91.4 Kb)


ЯД-41001506838083
 
Ответить
Сообщение
Есть вопрос по этой же теме.
Документ прилагаю. На листе материал запустить макрос.
Всё лишнее убрано.
Листов из которых берется инфа >10, строк в каждом листе от 300 д о 500
При полной версии документа макрос работает не менее 5 минут, точно не считал, но иногда комп виснет.
Можно ли ускорить работу макроса. Может через массив пробовать. Макрос писал не сам.
Если есть предложения намекните. Или вашу версию решения.

Автор - gling
Дата добавления - 22.02.2013 в 21:38
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

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