Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с выполнением процедуры. / 4 сообщений из 4, страница 1 из 1
28.10.2011, 09:52
    #37502016
Feanaro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с выполнением процедуры.
Имею следующий код на VBA для работы на расчетных листаз, содержит функцию и процедуру.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
Function QualGroup(InResRate As Double) As Integer
    Dim i As Integer
    Dim sup As Range
    
    Worksheets("Таблица соответствий").Activate
    
    i =  0 
    For Each sup In Range("QualGroups")
        If (InResRate > sup.Value) Then
            i = i +  1 
        End If
    Next
    
    QualGroup = i +  1 
    
End Function

Sub CheckPortfs()
    Dim i As Integer
    Dim j As Integer
    Dim col_portf_beg As Integer
    Dim serv_col As Integer
    
    Columns("A:C").Insert Shift = xlLeft
    
    'Собираем данные о проанализированных портфелях
    i = Worksheets("Суждение").Cells.Find("$begin_data").Row
    j =  0 
    serv_col = Worksheets("Суждение").Range("Service_Data").Column +  1 
    col_portf_beg = Worksheets("Суждение").Range("No_Portf_Area").Column
    
    Do While (Worksheets("Суждение").Cells(i, serv_col) <> "$end_data")
        If (Worksheets("Суждение").Cells(i, serv_col) = "$no_portf") Then
            For k =  0  To  7 
                Worksheets("Проверка").Cells(j +  1 ,  1 ) = Worksheets("Суждение").Cells(i, col_portf_beg + k)
                j = j +  1 
            Next
        End If
        i = i +  1 
    Loop
    
    'Собираем данные о портфелях, подлежащих анализу
    i =  2 
    j =  1 
    
    Do While (Worksheets("5.9.2.5 Информация по ПОС").Cells(i,  1 ) <> "")
        Worksheets("Проверка").Cells(j,  2 ) = Worksheets("5.9.2.5 Информация по ПОС").Cells(i,  1 )
        Worksheets("Проверка").Cells(j,  3 ) =  0 
        j = j +  1 
        i = i +  1 
    Loop
    
    'Производим проверку
    Worksheets("Проверка").Activate
    i =  1 
    Do While (Cells(i,  1 ) <> "")
        j = Range("B:B").Find(Cells(i,  1 ).Value).Row
        Cells(j,  3 ).Value = Cells(j,  3 ).Value +  1 
        i = i +  1 
    Loop
    
    'Выписываем необходимое
    i =  1 
    j =  0 
    Do While (Cells(i,  3 ) <> "")
        If (Cells(i,  3 ) <>  0 ) Then
            Range("mistaken_portf").Cells(j +  5 ,  1 ) = Cells(i,  2 )
            Range("mistaken_portf").Cells(j +  5 ,  2 ) = Cells(i,  3 )
            j = j +  1 
        End If
    Loop
    
End Sub


Функция написана для присуждения определенных категорий в зависимости от принимаеемого парметра.
Процедура же написана для проверки совсем других чисел. Но почему-то, когда я в отладчике исправлял один косячок (в коде его уже нет), то с удивлением обнаружил, что каждый раз, когда в ходе выполнения кода процедуры встречается команда, отвечающая за присвоение значения ячейке, то выполняется функция.

Вопрос в том, почему она выполняется, а также как этого избежать
...
Рейтинг: 0 / 0
28.10.2011, 19:37
    #37503385
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с выполнением процедуры.
> Автор: Feanaro
> Вопрос в том, почему она выполняется, а также как этого избежать


скорее всего эта функция стоит в какой-то ячейке на листе и при присвоении в макросе производится пересчет листа. Хотя
функция и не объявлена как "летучая"(которая должна пересчитыватся при каждом чихе) она стоит видимо в связке(сумма,
например) с другой, которая и вызывает пересчет.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
29.10.2011, 02:44
    #37503680
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с выполнением процедуры.
автори не объявлена как "летучая"
А можно с этого места подробнее?
А как объявляется "летучая" функция?
Я по своей неопытности считал, что пересчёт листа производится при любом изменении(если включён автопересчёт)
...
Рейтинг: 0 / 0
29.10.2011, 11:23
    #37503757
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с выполнением процедуры.
alex77755,

Для декларации функции как "летучей" используется метод объекта Application - Volatile, вызов которого ставится первой строкой пользовательской функции:Справка к VBAThis example marks the user-defined function "My_Func" as volatile. The function will be recalculated whenever calculation occurs in any cells on the worksheet on which this function appears.

Код: plaintext
1.
2.
3.
4.
5.
Function My_Func()
    Application.Volatile
    ' 
    '    Remainder of the function
    ">
End Function
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с выполнением процедуры. / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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