powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с выполнением процедуры.
4 сообщений из 4, страница 1 из 1
Проблема с выполнением процедуры.
    #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
Проблема с выполнением процедуры.
    #37503385
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Feanaro
> Вопрос в том, почему она выполняется, а также как этого избежать


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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с выполнением процедуры.
    #37503680
Фотография alex77755
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автори не объявлена как "летучая"
А можно с этого места подробнее?
А как объявляется "летучая" функция?
Я по своей неопытности считал, что пересчёт листа производится при любом изменении(если включён автопересчёт)
...
Рейтинг: 0 / 0
Проблема с выполнением процедуры.
    #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
4 сообщений из 4, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема с выполнением процедуры.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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