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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2009, 15:17   #11
mmx310
 
Регистрация: 04.02.2009
Сообщений: 7
По умолчанию Благодарность

SAS888
Спасибо большое, все отлично работает, и намного быстрее чем с формулами!

Последний раз редактировалось mmx310; 04.02.2009 в 15:48.
mmx310 вне форума Ответить с цитированием
Старый 04.02.2009, 15:50   #12
mmx310
 
Регистрация: 04.02.2009
Сообщений: 7
По умолчанию

А формулу =СЧЁТЕСЛИ($C$4:$C$10003;C5) можно в функцию прописать? с функциями намного быстрее работает
mmx310 вне форума Ответить с цитированием
Старый 05.02.2009, 06:53   #13
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Можно, конечно. Но в данном случае большой вопрос, как будет быстрее.
Смысл писать свою функцию вижу только тогда, когда она отсутствует в стандартном наборе Excel, либо когда требуется применение нескольких стандартных функций, либо когда есть какой-нибудь частный случай (например, в отличии от стандартной функции, рассматривать не все возможные варианты, а только избранные).
Если в функции использовать формулу рабочего листа Excel Application.WorksheetFunction.Count If(...), то быстрее точно не будет.
Мне не известен алгоритм, который использует Excel в этой функции. Если он работает с ячейками листа, то можно попробовать альтернативный способ - создать массив и работать с ячейками памяти, что быстрее. Попробуйте предлагаемую функцию применить к очень большому количеству строк в столбце и сравнить время выполнения со стандартной. Пока, для простоты, в этой функции можно задавать диапазон счета только в виде столбца. Если результат будет положительный - сделаем для произвольного диапазона. Но, думаю, что Microsoft-овскими программистами все функции оптимизированы "до изнеможения".
Код:
Function CountIfInColumn(Диапазон As Range, Критерий As Range) As Long

    Dim i As Long
    a = Диапазон.Value: CountIfInColumn = 0
    For i = LBound(a, 1) To UBound(a, 1)
        If a(i, 1) = Критерий.Value Then CountIfInColumn = CountIfInColumn + 1
    Next

End Function
Вставьте этот код в любой стандартный программный модуль.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 05.02.2009, 10:50   #14
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

По поводу поиска в текстовой строке 11-значного номера, начинающегося с 80 - вместо предложенной ранее функции, лучше применить следующую:
Код:
Function Num(Cell As Range)

    Dim i As Integer, j As Integer, a
    a = Split(Application.Trim(Cell.Value), " ")
    For i = LBound(a) To UBound(a)
        If a(i) Like "*80#########" Then
            j = InStr(1, a(i), "80")
            Num = Right(a(i), Len(a(i)) - j + 1)
            Exit For
        End If
    Next

End Function
В этом случае, будет корректно определяться номер, не зависимо от того, какие символы находятся непосредственно перед номером ("т.моб.", "тел.", Моб.Тел" и т.п.).
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 05.02.2009, 11:19   #15
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Код:
Function CountIfInColumn(Диапазон As Range, Критерий As Range) As Long

    Dim i As Long
    a = Диапазон.Value: CountIfInColumn = 0
    For i = LBound(a, 1) To UBound(a, 1)
        If a(i, 1) = Критерий.Value Then CountIfInColumn = CountIfInColumn + 1
    Next

End Function
Вставьте этот код в любой стандартный программный модуль.
мне кажется, что обращение к диапазону стоит вынести из цикла:
crv=Критерий.Value

а вцикле использовать эту переменную:
If a(i, 1) = crv Then

да и чуть быстрее использовать for each цикл
slan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в строке xspider Общие вопросы C/C++ 5 04.02.2009 21:46
написать программу, которая считает количество цифр в введенной строке 111111 Общие вопросы C/C++ 2 17.12.2008 11:30
Поиск слов в строке Neymexa Общие вопросы C/C++ 3 16.12.2008 18:33
Поиск с строке.. Rom1k06 Microsoft Office Excel 2 15.10.2008 07:42
Поиск текста в строке CoDeR Общие вопросы Delphi 8 02.10.2007 01:01