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"
输入A1
,TEXT(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 中进行计算! :)
我正在整理一个仪表板以快速查看来自供应商的订单数量 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 他们希望跟踪的供应商。
更新:
我正在尝试通过添加
来使用我的引用tableTEXT(EvaluateString("Reference!$B6"&"[[openDate]:[openDate]])"),"YYYY")=$B)
其中“EvaluateString”是:
Function EvaluateString(strTextString As String)
Application.Volatile
EvaluateString = Evaluate(strTextString)
End Function
感觉差不多了,此时可能只是语法错误。我需要找到一种方法将字符串识别为结构化引用。
您可以使用 INDIRECT
。例如。 "Table1"
输入A1
,TEXT(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 中进行计算! :)