Excel - 在完全限定的结构化引用中使用单元格引用作为 TableName

Excel - Using a cell reference as a TableName in a fully qualified structured reference

我正在整理一个仪表板以快速查看来自供应商的订单数量 image of dashboard

我使用的公式简化版如下:

=IFERROR(
        SUMPRODUCT(
              (TEXT(Table1[[openDate]:[openDate]],"YYYY")=$B)
               *
              (TEXT(Table1[[openDate]:[openDate]],"MMMM")=C)
              /
              COUNTIF(Table1[[orderNum]:[orderNum]],Table1[[orderNum]:[orderNum]]&"")
               )
        ,"")

每个 table 是每个供应商的单独工作表。我想要完成的是让 table 引用(本例中的表 1)能够成为单元格引用。这将允许在仪表板中预先填充公式,并且不需要在每次创建新 table 时手动更新 table 名称。

我创建了一个 VBA 模块,它提取所有 table 名称并将它们放入参考工作表 image of reference table:

的 table 中
  Sub GetTableNameList()
    
        Dim x As ListObject
    
        Dim y As Worksheet
      
        Dim z As Long
        
            z = -1
           
            For Each y In Worksheets
            
            For Each x In y.ListObjects
            
                z = z + 1
        Sheets("Reference").Range("B3").Offset(z).Value = x.Name
        
        Next x
        
        Next
         
    End Sub

我的想法是,当创建新的 table 时,公式中的单元格将引用引用 table 的下一行。我愿意接受有关如何完成此任务的所有其他建议。我唯一的规定是最终用户需要很少或不需要交互才能正常工作。

注意:仪表板开始为空白,没有 table 可供参考。 Tables/worksheets 由用户添加,因为他们 select 他们希望跟踪的供应商。


更新:

我正在尝试通过添加

来使用我的引用table
TEXT(EvaluateString("Reference!$B6"&"[[openDate]:[openDate]])"),"YYYY")=$B)

其中“EvaluateString”是:

   Function EvaluateString(strTextString As String)
    
        Application.Volatile
    
        EvaluateString = Evaluate(strTextString)

    End Function

感觉差不多了,此时可能只是语法错误。我需要找到一种方法将字符串识别为结构化引用。

您可以使用 INDIRECT。例如。 "Table1"输入A1TEXT(INDIRECT(A1&"[[openDate]:[openDate]]"),"YYYY")会被理解为TEXT(Table1[[openDate]:[openDate]],"YYYY")

但是请记住,太多的 INDIRECT 公式会大大降低 Excel 的速度。既然你也在使用 VBA,你也可以考虑这样的事情:

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("A1")) Is Nothing Then
    
        TableString = Target.Value
    
        Built_Formula = "=IFERROR(SUMPRODUCT((TEXT(" & TableString & "[[openDate]:[openDate]],""YYYY"")=$F)*(TEXT(" & TableString & "[[openDate]:[openDate]],""MMMM"")=F)/" _
    + "COUNTIF(" & TableString & "[[orderNum]:[orderNum]]," & TableString & "[[orderNum]:[orderNum]]&"""")),"""")"

        Range("A2").Formula = Built_Formula

    Else
    End If
End Sub

每次更改 A1 中的值(例如,将其设为 table 名称的下拉列表)时都会重建公​​式。

甚至可以在 VBA 中进行计算! :)