【问题标题】:How to Automatically update cells in Excel that uses a particular VBA Code?如何自动更新 Excel 中使用特定 VBA 代码的单元格?
【发布时间】:2020-02-10 18:12:11
【问题描述】:

我在 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的单元格作为参数:

当我更改 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 时,如何使使用此宏的单元格更新?

【问题讨论】:

  • 使用Workbook_SheetChange 事件。
  • 我尝试使用它但它不起作用,我不明白如何将它应用于这个问题。我看过诸如this one 之类的页面,但无法将其应用于我的问题(在特定 Excel 单元格中调用的函数)。你有适用于这个特定问题的示例代码吗?例如。如何提及更新使用该功能的单元格?
  • 我推荐 workbook 级别的事件,该事件在 any 工作表更改时发生。您使用了工作表级别的事件。
  • 我确实使用了我在 VBAProject 的“ThisWorkbook”部分中提供的 URL 中的代码,但我不知道如何将它应用于这个特定问题,因为我不能只调用 WBCountString 函数一个“workbook_sheetchange”函数,因为它接受在 F 列的 Excel 工作表中指定的参数,并且每个单元格都不同。你有适用于这个特定问题的示例代码吗?例如。如何提及更新使用该功能的单元格?
  • 您可以将计算限制在相关范围内。

标签: excel vba


【解决方案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

让我知道它是否有效

【讨论】:

  • Application.Volatile 应尽可能避免......这通常会导致大量不必要的开销(如答案中所述)。
猜你喜欢
  • 2015-10-23
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多