Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Проблема с FindNext и пользовательской функцией / 8 сообщений из 8, страница 1 из 1
21.03.2006, 17:39:20
    #33615146
k-nike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с FindNext и пользовательской функцией
Написал пользовательскую функцию. За основу взял пример из книги по использованию FindNext.
По моей идее эта функция ищет в диапазоне ячейки, в которых формула начинается с "=СУММ(" и суммирует значения этих ячеек.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function SummaSumm(rngInput As Range) As Double
    Dim firstAddress As String
    Dim rng As Range
    
    SummaSumm =  0 
    Set rng = rngInput.Find( _
        What:="=СУММ(", LookIn:=xlFormulas, _
        LookAt:=xlPart, MatchCase:=False)
    
    If Not (rng Is Nothing) Then
        firstAddress = rng.Address
        Do
            SummaSumm = SummaSumm + rng.Value
            Set rng = rngInput.FindNext(rng)

        'Здесь почему-то не воспринимается rngInput.FindNext(rng)

        Loop While Not (rng Is Nothing) And rng.Address <> firstAddress
    End If
End Function
Отлаживаю это дело.
Первая инструкция Find работает нормально. Функции SummaSumm присваивается значение 2.
Потом доходит в первом циклом до строчки
Код: plaintext
Loop While Not...
и вылетает.
...
Рейтинг: 0 / 0
21.03.2006, 17:41:16
    #33615153
k-nike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с FindNext и пользовательской функцией
Поправка. Функции SummaSumm присваивается 3.
...
Рейтинг: 0 / 0
21.03.2006, 23:45:47
    #33615769
Проблема с FindNext и пользовательской функцией
Есть такое мнение, что метод FindNext не работает при вызове из ячейки внутри функции. Воспользуйся альтернативным вариантом.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function SummaSumm(rngInput As Range) As Double
    Dim rng As Range
    
    SummaSumm =  0 
    
    For Each rng In rngInput.Cells
        If rng.HasFormula Then
            If rng.Formula Like "*SUM*" Then
                SummaSumm = SummaSumm + rng
            End If
        End If
    Next rng
End Function
...
Рейтинг: 0 / 0
22.03.2006, 09:40:44
    #33616112
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с FindNext и пользовательской функцией
k-nikeНаписал пользовательскую функцию. За основу взял пример из книги по использованию FindNext.

попробуй
rngInput.Find (What:="бла-бла", Affter:=rng ,LookIn:=xlFormulas,LookAt:=xlPart, MatchCase:=False)

Не верь примерам - в том примере из справке - ошибка на строке
Loop While Not (rng Is Nothing) And rng.Address <> firstAddress
Если будет rng Is Nothing, то rng.Address вызовет ошибку (хотя в данном контексте ошибка навряд ли появиться, но возможна, если например найденные значения на что-то заменять/elfkznm и однажды Find вернет Nothing)

лучше так сделать:
if rng Is Nothing then exit do
Loop While rng.Address <> firstAddress
...
Рейтинг: 0 / 0
22.03.2006, 09:45:07
    #33616123
k-nike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с FindNext и пользовательской функцией
Спасибо. Помогло.
...
Рейтинг: 0 / 0
22.03.2006, 10:00:06
    #33616174
k-nike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с FindNext и пользовательской функцией
Senin ViktorНе верь примерам - в том примере из справке - ошибка на строке
Loop While Not (rng Is Nothing) And rng.Address <> firstAddress
Если будет rng Is Nothing, то rng.Address вызовет ошибку (хотя в данном контексте ошибка навряд ли появиться, но возможна, если например найденные значения на что-то заменять/elfkznm и однажды Find вернет Nothing)

лучше так сделать:
if rng Is Nothing then exit do
Loop While rng.Address <> firstAddress
Да, она появится только если заменять содержимое найденных ячеек, но в данном случае ничего не заменяется, но rng все равно Nothing.
Пользователь2Есть такое мнение, что метод FindNext не работает при вызове из ячейки внутри функции.
Видимо, это действительно так.
Но все равно спасибо за предупреждение, Senin Viktor. Будем иметь ввиду.
Способ Пользователя2 мне показался поуниверсальнее что ли. Им и воспользовался.
...
Рейтинг: 0 / 0
23.03.2006, 09:35:04
    #33619060
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с FindNext и пользовательской функцией
k-nike
Пользователь2Есть такое мнение, что метод FindNext не работает при вызове из ячейки внутри функции.
Видимо, это действительно так.
Но все равно спасибо за предупреждение, Senin Viktor. Будем иметь ввиду.
Способ Пользователя2 мне показался поуниверсальнее что ли. Им и воспользовался.

предупреждение не мое, а Пользователя2

все-таки попробовал бы
rngInput.Find (What:="бла-бла", Affter:=rng ,LookIn:=xlFormulas,LookAt:=xlPart, MatchCase:=False)
Такие рекомендации дается и самим мелкософтом
PSS ID Number: 282151.Macro that uses FindNext to search for specific format finds wrong cell in Excel 2003 or in Excel 2002
...
Рейтинг: 0 / 0
23.03.2006, 11:23:55
    #33619488
k-nike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с FindNext и пользовательской функцией
Senin Viktorпредупреждение не мое, а Пользователя2
Я просто предложение с благодарностью не туда вставил. Надо было повыше чуть-чуть.:-))) Ну и Пользователя2, конечно, тоже благодарю.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Проблема с FindNext и пользовательской функцией / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]