将 excel 的新动态数组功能与 VBA 相结合

Combine new dynamic array features of excel with VBA

我尝试在 excel 中与 vba 结合使用动态数组。我的问题是我不能 return table-column with vba。这是我想做的一个最小例子:

我有两个 Tables TabFeb 和 TabMar(见下图)。他们每个人都有一个列成本,我想单独总结一下。结果应放入新的Table。这可以在 excel 中分别使用 =SUM(TabFeb[Costs]) 和 =SUM(TabMar[Costs]) 轻松完成。我现在的想法是编写一个 VBA 函数,它接受一个字符串作为输入,在这个例子中它将是月份,并且 return 是 table 根据输入。之后将对其进行总结并将结果放在一个单元格中。 我尝试了以下方法:

Function Selectmon(mon As String) As Range
    If mon = "Feb" Then
        Set Selectmon = Worksheets("Sheet1").ListObjects("TabFeb").ListColumns("Costs").DataBodyRange
    ElseIf mon = "Mar" Then
        Set Selectmon = Worksheets("Sheet1").ListObjects("TabMar").ListColumns("Costs").DataBodyRange
    End If
End Function

这个想法的问题是这个函数只是复制table数据。因此,如果我更改输入 table 数据,则总和不会改变。必须手动重新计算每个单元格。不知何故,我需要 VBA 到 return TabFeb[Costs] 来输入“Feb”。有谁知道如何做到这一点?

Example

它真的只是一个一行(除非你想做一些函数内错误检查)

Function Selectmon(mon As String) As Range
    Set Selectmon = Range("Tab" & mon & "[Costs]")
End Function

正如@ceci 所暗示的那样,此公式不会随着 table 中的更改而更新。根据您作品的其他细节sheet,您可以通过

更新它
  • 嵌入作品sheet更改事件代码;
  • 或者将行 Application.Volatile 添加到函数本身。

后一种方法将在工作发生任何可能导致重新计算的变化时强制重新计算sheet。

第一种方法可以限制只有数据发生变化时才重新计算,但还有其他限制。

作品sheet更改方法的局限性之一是它只会对相关作品起作用sheet。

如果您使用工作簿 sheet 更改方法,则不会有该限制。

无论哪种情况,您都可以将代码限制为 运行,仅当 table 已更改时。

这是一种通用方法:

Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim LOS As ListObjects
    Dim LO As ListObject
    
Set LOS = Sh.ListObjects
For Each LO In LOS

    'could select relevant tables here
    'Could also select relevant worksheets, if you like
    'for example
    Select Case LO.Name
        Case "TabFeb", "TabMar", "TabApr"
            If Not Intersect(LO.DataBodyRange, Target) Is Nothing Then
                Application.EnableEvents = False
                Application.Calculate
            End If
        End Select
Next LO

Application.EnableEvents = True

End Sub

您还可以使用其他代码来查找相关公式并更新该公式——可能不值得付出努力。