如何在使用特定VBA代码的Excel中自动更新单元格?

问题描述 投票:0回答:1

我在Excel中有一个包含使用此VBA宏的单元格的工作表(使用两个参数,它计算所有工作表中Arg#2范围内arg#1的出现次数,并返回总数):

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更新时都进行更新?

excel vba
1个回答
1
投票

我重构了一些代码,因此变量更易于理解

关键是添加Application.Volatile,因此在每次工作簿更改中都会重新计算它。

请注意,如果工作簿中的公式过多(此方法将减慢您的工作簿计算速度)

代码:

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

让我知道是否可行

© www.soinside.com 2019 - 2024. All rights reserved.