【问题标题】:Is it possible to create an excel 3D formula with dynamic sheet bookmarks?是否可以使用动态工作表书签创建 excel 3D 公式?
【发布时间】:2021-07-13 10:11:36
【问题描述】:

我正在尝试创建一个 3d excel 公式,其中包含对书签表的动态引用(范围的开始和结束)。最终目标是拥有一个标准化的计算表,可用于根据提供的特定表输入来合并不同的分组(每个分组很可能有许多表)。

我曾考虑使用CHOOSE 函数,但这感觉不那么动态和笨重。我还考虑过使用INDIRECT 函数(并且只生成特定的工作表名称而不是书签),但我宁愿避免波动和需要尽可能识别单个工作表。

我附上了我要达到的目标的简化屏幕截图。

我尝试使用的公式如下:

=SUM("'"&$E$4&">:<"&$E$4&"'!A1")

当我F9(使用屏幕截图中的变量)时,我得到以下信息:

=SUM("'A>:<A'!A1")

而我试图复制的静态类型公式是这样的:

=SUM('A>:<A'!A1)

【问题讨论】:

  • 您可以动态引用具有命名范围的工作表 ..refer this .. 和 ..this link
  • 嗨 Naresh,为 GET.WORKBOOK 建议欢呼。这也是我之前实际上在玩的东西,并且后来被纳入我的解决方案(基于 JMP 的响应)。

标签: excel excel-formula


【解决方案1】:

如果您的书签已经是连续的,并且其中的工作表具有一致的命名架构,那么您可以找到书签的位置

=SHEET("a>")

=SHEET("<a")

然后您可以使用INDIRECTSEQUENCE 遍历其间的每张纸。

=SUM(INDIRECT("Sheet"&(A3+SEQUENCE(A4-A3-1))&"!A1"))

在示例中,A3A4 保存书签的工作表编号,工作表是同名的,Sheet3Sheet4 等...,我们将 A1 单元格相加每张纸。

【讨论】:

  • 不幸的是,里面的表格不一定具有一致的命名架构,但我已经能够调整您提供的示例以产生所需的结果。作为参考,这是我采用的方法:=SUM(INDIRECT(INDEX(sheets,A3+SEQUENCE(A4-A3-1))&"!A1"))。其中“工作表”是具有以下公式的命名范围:=REPLACE(GET.WORKBOOK(1),1,FIND("]",GET.WORKBOOK(1)),"")&T(NOW())#。非常感谢您的贡献,非常感谢!
【解决方案2】:

您不能在多个工作表中使用SUM:每个范围的整体都必须在一个工作表中。 SUM('A&gt;:&lt;A'!A1) 是一个无效的公式——你需要使用 SUM('A&gt;'!A1,'1'!A1,'2'!A1,'&lt;A'!A1) 来获得你想要的结果。 (即指定多个范围)

INDIRECTCHOOSE 将忽略 Sheet Order 之类的内容,因此也不能用于此。

可能能够使用 VBA 解决问题,使用 Worksheet.Index 引用,但不能使用普通的 Excel 公式。这是一个用户定义的函数(将其放在 VBA 中的新模块中,而不是在工作表中!)应该可以满足您的需求:

Option Explicit
Option Private Module

Public Function SUM3D(reference1 As Range, reference2 As Range) As Variant
    Application.Volatile
    
    SUM3D = CVErr(xlErrNA) 'Default to an Error
    On Error GoTo FunctionError
    
    Dim SumRange As String, TotalSum As Double, TempSum As Variant, StartIndex As Long, EndIndex As Long, CurrIndex As Long
    TotalSum = 0
    TempSum = 0
    
    'Create the 2D range bounded by the 2 references, which will extend through the sheets
    SumRange = Worksheets(1).Range(Worksheets(1).Range(reference1.Address(True, True, xlA1, False)), _
        Worksheets(1).Range(reference2.Address(True, True, xlA1, False)) _
        ).Address(True, True, xlA1, False)
    
    StartIndex = reference1.Worksheet.Index
    EndIndex = reference2.Worksheet.Index
    
    
    If StartIndex = EndIndex Then
        'Same sheet, no need to make it 3D
        SUM3D = Application.Sum(reference1, reference2)
    Else
        'Different sheets, so cycle through them.
        For CurrIndex = StartIndex To EndIndex Step Sgn(EndIndex - StartIndex)
            'Ignore Charts, DialogSheets, MacroSheets, etc
            If Sheets(CurrIndex).Type = xlWorksheet Then
                TempSum = Application.Sum(Sheets(CurrIndex).Range(SumRange))
                
                If IsError(TempSum) Then
                    SUM3D = TempSum 'Return the Error
                    Exit Function
                Else
                    TotalSum = TotalSum + TempSum 'Add this sheet's sum to the total
                    TempSum = 0
                End If
            End If
        Next CurrIndex
    End If
    
    SUM3D = TotalSum
FunctionError:
    On Error GoTo -1 'Clear error handler
End Function

【讨论】:

  • 使用普通的 excel,我们可以使用命名范围动态引用具有索引的工作表 ..refer this .. 和 ..this link .. 但有重新排列工作表顺序的风险 :) 我猜
  • @Naresh 嗯……我想知道是否可以设置 ArrayFormula/SUMPRODUCT 来处理“这两个索引之间的每张纸”?
  • 抱歉,我可能没有正确理解您。如果在这种情况下,每张纸上的单元格都相同,A1,我认为可以使用这种命名范围来完成。如果不同工作表上的单元格不同,则不会。
  • 您好 Chronocidal,实际上我已经设法通过 JMPs 建议的修改版本解决了我的问题,但也感谢您的意见,非常感谢。但是,我可以确认 "SUM('A>:
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多