【问题标题】:Automatically expand range of Excel array formula (without macro)Excel数组公式自动扩展范围(无宏)
【发布时间】:2016-08-23 19:07:51
【问题描述】:

问题

如何在手动向表中添加行时自动向数组公式中添加行? Google Docs 在https://support.google.com/docs/answer/3093275?rd=1 似乎提供了类似的功能,并且在http://www.wilmott.com/messageview.cfm?catid=10&threadid=62734 上有一个宏适用于Excel。但是,使用此宏需要启用 Microsoft Scripting Runtime,我不希望这样做,而且最终用户也难以维护。我正在运行 Excel 2013。

我正在为可能不了解 VBA 或数组公式但需要将项目添加到 Validation 表(如下所述)的最终用户创建此工作表。随着用户添加表格行,我的数据验证范围及其数组公式不会自动增加长度,并且数据验证可能不再显示所有可接受的值。

过滤数据验证设置

您可以查看我的精简工作表,其中禁用了宏hereMain 表中 Process 列的数据验证将仅显示当前显示在 Validation 表的 Testing Process 列中的值。包含切片器以便于过滤。

使用来自http://www.contextures.com/xlDataVal02.html 和其他一些来源的帮助,我创建了一个名为 Main_HIGHLIGHT 的表,其中的数据验证只允许在名为 的第二个表中的列的可见/过滤值验证

第二个表有三个相关的列,VisibleCategoryTesting Process。该表使用 Category 列上的切片器进行过滤,数据验证从 Testing Process 列返回值。使用三步流程来防止过滤后的值出现在数据验证中:

  1. 如果表格行被过滤掉,Visible 列中的单元格显示空白,如果没有过滤掉,则显示Testing Process 的值。其公式为:
    =IF(AGGREGATE(3, 5,[@[Testing Process]])>0,[@[Testing Process]],"")
  2. 直接在表格左侧但不是表格一部分的数组公式从可见中获取范围并对其进行排序,以使所有空白单元格都位于范围的底部,并且所有具有值的单元格都在顶部。它填充宽度为 1 且高度等于表中条目数的范围。这个范围被赋予了定义名称​​Visible_Tests_with_filtered_removed。像往常一样用 Ctrl-Shift-Enter 输入的公式是:

    =INDEX(Validation[Visible],
            SMALL(
                IF( Validation[Visible]<>"",
                        ROW(INDIRECT("$A$1:$A$"&COUNTA(Validation[Category]))),
                        ""
                ),
                ROW(INDIRECT("A1:A"&COUNTA(Validation[Category])))
            )
    )
    
  3. 创建的定义名称 Visible_Tests_with_blanks_removed 仅包含 Visible_Tests_with_filtered_removed 中的值,不包含任何空白或错误​​。其公式为:=OFFSET(PPRNT!$A$34,0,0,MATCH("*",Visible_Tests_with_filtered_removed,-1),1)

可能的解决方案

理想情况下,我想将数组公式添加到 Validation 表中,因为这会在添加数组公式时自动将数组公式复制到任何新行。但是,当我尝试这样做时,我收到“表格中不允许使用多单元格数组公式”的错误。

或者,也许我可以将整个范围放入另一个定义名称中,例如 Visible_Tests_with_blanks_removed,其值实际上并不位于工作表上的单元格中。我不知道

如果所有其他方法都失败了,我可以使用上面链接的宏,但在我看来它不应该这么难,我可能只是在 HowTo 选项卡中包含扩展数组公式的说明。

【问题讨论】:

  • 您正在寻找的是动态命名范围。 This linkthis link 都展示了不同的创建方式。
  • 我正在使用 Excel 2016,并且能够将 CSE 方程输入到表格中。然而,没有什么比你所看到的更复杂了。
  • @OldUgly 我可以将单单元格 CSE 公式输入到 Excel 2013 的表格中,但不能输入 多单元格 数组公式,如错误消息中所述。然而,你慢跑了我的想法,我得到了一个可以在表格中使用的单细胞 CSE 公式。请参阅下面的答案。

标签: excel excel-formula


【解决方案1】:

感谢@OldUgly 朝着正确的方向前进。

这个三步过程为数据验证创建了正确的列表,并且它是表格的一部分,因此它会自动更新。请注意,我在原始问题中使用的 CSE 公式是多单元格(选择一堆单元格,然后输入公式并按 Ctrl-Shift-Enter),但表格中不允许使用这些公式,因此此解决方案使用单-单元格数组公式,自动复制到表格列中的每个单元格中。

  1. 在表上创建一个可见列以确定当前隐藏的行。这是一个普通公式,不是 CSE 公式。
    =IF(AGGREGATE(3, 5,[@[Testing Process]])&gt;0,TRUE,FALSE)
  2. 在表格中添加一个过滤列表列,然后输入这个单单元格 CSE 公式(应该会自动复制到表格中的其余单元格,就像任何其他表格公式一样) .如果您按 Enter 而不是 Ctrl-Shift-Enter,您将获得 #NUM!除了第一个单元格之外的所有单元格都出错。

            =INDEX([Testing Process],
            SMALL(
                IF([Visible], ROW([Testing Process])-ROW(Validation[[#Headers],[Testing Process]]), ""),
                ROW([@[Testing Process]])-ROW(Validation[[#Headers],[Testing Process]])
            )
    )
    
  3. 使用公式=OFFSET(Validation[[#Headers],[Filtered List]], 1, 0, MATCH("*",Validation[Filtered List],-1), 1) 创建一个定义的名称​​Testing_Processes_for_Data_Validation(Formulas->Define Name),这样数据验证就没有一堆#NUM!结尾有错误。

    在单元格上激活数据验证时,将允许设置为“列表”,将源设置为 =Testing_Processes_for_Data_Validation

就是这样!这会根据表格的过滤列创建一个自动扩展的动态列表,并从该列表中删除空白和错误。

【讨论】:

  • 您能否分享您的文件,其中包含已接受答案中应用的公式?
  • 给你!在线预览不支持数据验证,因此您必须下载文件才能看到它的实际效果。 1drv.ms/x/s!Ak4Lq2gGjO8hleIyd60JuPkctlDhGw
  • 谢谢。尽管您将其整理得井井有条且易于理解,但这个简单问题的整体解决方案非常复杂。
猜你喜欢
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 2021-03-28
  • 2017-05-31
  • 1970-01-01
  • 2012-06-04
相关资源
最近更新 更多