Функции не актуализируются - PullRequest
0 голосов
/ 19 августа 2011

Я выполняю код VBA, который берет базу данных, обрабатывает ее и экспортирует в лист.Это работает нормально.Тем не менее, у меня есть лист, который создает графики в зависимости от данных в конкретном листе.Данные не актуализируются.Я должен войти в ячейку и нажать кнопку ввода, чтобы актуализировать его.Я уверен, что есть более простой способ сделать это.Расчет установлен на автоматический, но это ничего не меняет.

В моей ячейке есть собственная функция vba, которую нужно обновить после завершения отчета.Когда я щелкаю по ячейке и затем вхожу, результат обновляется, но я бы хотел, чтобы это делалось автоматически.Я надеюсь, что это понятнее!

Заранее спасибо,

Etienne NOEL

Вот код моей функции

   Public Function number_of_appearances(term As String, sheet As String, column As Integer) As Integer


Application.Volatile
    Dim number_of_rows As Integer
    Dim appearances As Integer
    Dim row As Integer

    appearances = 0
    row = 1
    number_of_rows = Worksheets(sheet).UsedRange.Rows.Count

    Do While row <= number_of_rows
        If Worksheets(sheet).Cells(row, column).Value = term Then
            appearances = appearances + 1
        End If
         row = row + 1
    Loop


    number_of_appearances = appearances

End Function

Aпример ячейки пользователя функции

=number_of_appearances('test';'sheet1'; 3)

1 Ответ

3 голосов
/ 19 августа 2011

Похоже, ваш UDF может не зависеть от каких-либо ячеек, которые изменяют значение при обработке вашей БД.
См. Эта ссылка MSDN

Опубликовать ваш UDF (или только его заголовок, есливы предпочитаете) и пример его использования ...

РЕДАКТИРОВАТЬ:
Да, ни один из параметров UDF не являются ссылками на ячейки, поэтому UDF не запускается для пересчета при изменении данных на листе.

У вас есть два варианта:
1. переписать свой UDF, чтобы включить параметр (ы), которые ссылаются на ячейки, которые изменяют значение при обработке БД, 2. сделать ваш UDF энергозависимым (включите Application.Volatile вКод UDF) ПРЕДУПРЕЖДЕНИЕ: это может быть очень неэффективно, в зависимости от того, сколько времени используется UDF и насколько интенсивно его вычисление

РЕДАКТИРОВАТЬ 2:
Вот рефакторинг вашего udfиспользуя первую упомянутую опцию:

Public Function number_of_appearances(term As String, rng As Range) As Integer
    Dim v As Variant
    Dim i As Long, j As Long
    Dim appearances As Long

    v = Intersect(rng, rng.Worksheet.UsedRange)
    For j = LBound(v, 2) To UBound(v, 2)
    For i = LBound(v, 1) To UBound(v, 1)
        If v(i, j) = term Then
            appearances = appearances + 1
        End If
    Next i, j
    number_of_appearances = appearances

End Function

используйте как =number_of_appearances("test";Sheet1!C:C)

РЕДАКТИРОВАТЬ 3:
Если все, что вы делаете, это подсчет количества вхождений строки в диапазоне, рассмотритеиспользуя
=COUNTIF(Sheet1!C:C;"test")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...