Как автоматически обновить ячейки в Excel, которые используют определенный код VBA? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть лист в Excel с ячейками, который использует этот макрос VBA (используя два параметра, он подсчитывает количество вхождений аргумента № 1 в диапазоне аргумента № 2 по всем листам и возвращает общее количество):

Public Function WBCountString(SearchFor As String, InRange As Range) As Long
Dim wbcs As Long, rng As Range, addr As String
For Each s In Worksheets
    addr = InRange.Address
    Set rng = s.Range(addr)

    wbcs = wbcs + Application.WorksheetFunction.CountIf(rng, SearchFor)
Next s
WBCountString = wbcs
End Function

Макрос используется в качестве функции в ячейке, как показано ниже, в которой в качестве параметров используются ячейки, расположенные в A: A:

enter image description here

Когда я изменяю значение ячейки A: A, значение ячейки, в которой используется сценарий, не изменяется, и мне приходится нажимать на формулу и нажимать «Enter», чтобы значение было обновлено.

Я пытался использовать эту функцию в «ThisWorkbook», я получаю сообщение «Изменить», но ячейки в F: F не обновляют или не изменяют значение:

Private Sub Workbook_SheetChange(ByVal Sh As Object, _
 ByVal Source As Range)
 ' runs when a sheet is changed
    MsgBox "Change."
    Application.Calculate
End Sub

Как я могу сделать так, чтобы ячейки, использующие этот макрос, обновлялись каждый раз при обновлении любой ячейки A: A на любом листе рабочей книги?

1 Ответ

1 голос
/ 10 февраля 2020

Я произвел рефакторинг некоторых кодов, чтобы их было проще понять Тяжелые формулы (этот подход замедлит вычисления в вашей книге)

Код:

Public Function WBCountString(SearchFor As String, InRange As Range) As Long
    Dim targetSheet As Worksheet
    Dim lookupRange As Range

    Dim counter As Long

    Dim lookupAddress As String

    For Each targetSheet In Worksheets
        lookupAddress = InRange.Address
        Set lookupRange = targetSheet.Range(lookupAddress)

        counter = counter + Application.WorksheetFunction.CountIf(lookupRange, SearchFor)

    Next targetSheet

    WBCountString = counter

    ' Recalculate with every change in workbook
    Application.Volatile

End Function

Дайте мне знать, если это работает

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