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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2010, 18:15   #1
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию Собственная функция поиска тормозит Эксель

Добрый день!

Смысл в следующем:
- на листе Data есть список котировок ценных бумаг
- на листе Trading с помощью собственной функции поиска, помещенной в отдельном модуле, формируется таблица.

Функция:
Код:
Function mySearch(Table As Range, StartSearchDate As Variant, SearchDate As Variant, SearchStock As String, SearchPrice As String)

Dim i, r As Long
Dim iCount, SearchColumn As Integer
          
If SearchPrice = "OPEN" Then SearchColumn = 3
If SearchPrice = "HIGH" Then SearchColumn = 4
If SearchPrice = "LOW" Then SearchColumn = 5
If SearchPrice = "CLOSE" Then SearchColumn = 6

For i = StartSearchDate To Table.Rows.Count
 If Table.Cells(i, 2) <> SearchDate Then
  Exit For
 Else:
  If Table.Cells(i, 1) = SearchStock Then
   mySearch = Table.Cells(i, SearchColumn): Exit For
  End If
 End If
Next i

End Function
Все бы ничего, но во вложении я прикрепил всего лишь часть котировок. На самом деле на листе Data около 300 000 строк, да и на листе Trading надо формировать таблицы по 16 бумагам.
И получается, что при редактировании любой ячейки этой книги (да и другой тоже), моя функция начинает все пересчитывать, что занимает время.
Как оптимизировать функцию, или как сделать, чтоб она срабатывала только при изменении данных на листе Trading???


Код:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Row > 1 And Target.Column > 1 Then
 mySearch
 End If
End Sub
ругается.
Вложения
Тип файла: rar Поиск.rar (544.5 Кб, 11 просмотров)
Maxx вне форума Ответить с цитированием
Старый 19.01.2010, 19:23   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Возможно так,что бы не отключать и подключать пересчет формул

Код:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "Trading" And Target.Row > 1 And Target.Column > 1 Then
Moshno = True
Else
Moshno = False
End If
End Sub
Код:

Public Moshno As Boolean

Function mySearch(Table As Range, StartSearchDate As Variant, SearchDate As Variant, SearchStock As String, SearchPrice As String)
If Moshno = False Then Exit Function
Dim i, r As Long
Dim iCount, SearchColumn As Integer
---------------------------------------
End Function
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 19.01.2010 в 19:32.
doober вне форума Ответить с цитированием
Старый 20.01.2010, 09:57   #3
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

Разместил
Код:
Public Moshno As Boolean

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "Trading" And Target.Row > 1 And Target.Column > 1 Then
Moshno = True
Else
Moshno = False
End If
End Sub
в модуле Эта Книга, а
функцию оставил где была (в модуле1).

Получилось следующее:
при редактировании любой ячейки Книги, пересчет все равно происходит, но функция уже вставляет не выбранные с Листа Data значения, а нули
Maxx вне форума Ответить с цитированием
Старый 20.01.2010, 10:42   #4
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Код:
Public Moshno As Boolean
Разместите в Модуле с функцией,а не в модуле с книгой
Код:
If Sh.Name = "Trading" And Target.Row > 1 And Target.Column > 1 Then
разрешаете работу с второй строки и второго столбца

Если
Код:
 If Sh.Name = "Trading"  And  Target.Cells.Count  >1 Then
разрешает работу,если выбрано более одной ячейки
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 20.01.2010, 10:51   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Сообщение от doober Посмотреть сообщение
Код:
Public Moshno As Boolean
Разместите в Модуле с функцией,а не в модуле с книгой
Даже в этом случае функция будет запускаться.
Другое дело, что она тут же будет заканчивать свою работу, возвращая 0...

Я бы порекомендовал использовать один из сделующих вариантов:

1) Временно отключать автоматический пересчёт формул
2) Заменить пользовательскую функцию стандартными (ВПР + СМЕЩ) - наверняка, работать будет быстрее.
EducatedFool вне форума Ответить с цитированием
Старый 20.01.2010, 11:15   #6
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

Цитата:
Даже в этом случае функция будет запускаться.
Другое дело, что она тут же будет заканчивать свою работу, возвращая 0...
, и возвращает очень долго!

Цитата:
1) Временно отключать автоматический пересчёт формул
я не умею. Как это сдолать?
Разобрался Application.Calculation = xlManual

Цитата:
2) Заменить пользовательскую функцию стандартными (ВПР + СМЕЩ) - наверняка, работать будет быстрее.
Думаю, так и будет. Но если посмотреть вложение в первом посте, то с помощью (ВПР + СМЕЩ + ИНДЕКС + ПОИСКПОЗ + еще всяких там функций) я не смог построить поиск Весь день промучился!

Последний раз редактировалось Maxx; 20.01.2010 в 11:17.
Maxx вне форума Ответить с цитированием
Старый 20.01.2010, 12:31   #7
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

Сделал так:
модуль Листа Trading
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Row > 2 And Target.Column = 1 Then
  Moshno = True
 Else:
  Moshno = False
 End If
End Sub
Модуль 1
Код:
Public Moshno As Boolean
Function mySearchUP(Table As Range, StartSearchDate As Variant, SearchDate As Variant, SearchStock As String, SearchPrice As String)

If Moshno = False Then Exit Function

Application.ScreenUpdating = False

Dim i, r As Long
Dim iCount, SearchColumn As Integer
          
If SearchPrice = "OPEN" Then SearchColumn = 3
If SearchPrice = "HIGH" Then SearchColumn = 4
If SearchPrice = "LOW" Then SearchColumn = 5
If SearchPrice = "CLOSE" Then SearchColumn = 6

For i = StartSearchDate To Table.Rows.Count
 If Table.Cells(i, 2) <> SearchDate Then
  Exit For
 Else:
  If Table.Cells(i, 1) = SearchStock Then
   mySearchUP = Table.Cells(i, SearchColumn): Exit For
  End If
 End If
Next i
Application.ScreenUpdating = True

End Function
Теперь всё работает "0" возвращается быстро!!!

Но вопрос с формулами ВПР и пр. остается открытым, хотя я думаю - это сложно!

EducatedFool, doober СПАСИБО!
Maxx вне форума Ответить с цитированием
Старый 20.01.2010, 15:46   #8
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

И все же я сделал это формулами.
Вот решение, кому интересно:
Вложения
Тип файла: rar Поиск.rar (306.4 Кб, 16 просмотров)
Maxx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++. Строки. Собственная реализация стандартной функции itoa. |arch| Помощь студентам 0 25.11.2009 00:04
Нужна функция поиска в строке Kib Общие вопросы Delphi 3 19.04.2009 21:05
Собственная операционная система kraftwerk Помощь студентам 0 15.04.2009 15:36
Собственная компонента: будильник redred Компоненты Delphi 1 13.05.2008 06:48
функция поиска в диапазоне Neonoff Microsoft Office Excel 1 18.02.2008 03:52