自动扩展Excel数组公式的范围(不含宏)

时间:2016-04-28 20:04:14

标签: excel excel-formula

问题

当我手动向表中添加行时,如何自动将行添加到数组公式中?类似的功能似乎由Google文档在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 表(如下所述)。当用户添加表行时,我的数据验证范围及其数组公式的长度不会自动增加,并且数据验证很可能不再显示所有可接受的值。

过滤数据验证的设置

您可以在禁用宏here的情况下查看我的精简工作表。 Main 表中Process列的数据验证仅显示当前在 Validation 表的Testing Process列中显示的值。包括切片器以便于过滤。

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

第二个表有三个相关列,可见类别测试流程。该表使用 Category 列上的切片器进行过滤,数据验证将返回 Testing Process 列中的值。三步过程用于防止过滤值出现在数据验证中:

  1. Visible 列中的单元格如果表格行被过滤掉则显示空白,如果未过滤掉,则显示测试过程的值。其公式为:
    =IF(AGGREGATE(3, 5,[@[Testing Process]])>0,[@[Testing Process]],"")
  2. 直接位于表格左侧但不是表格一部分的数组公式从 Visible 中取出范围并对其进行排序,以便所有空白单元格位于底部范围,所有具有值的单元格都在顶部。它填充宽度为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)

  4. 潜在解决方案

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

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

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

1 个答案:

答案 0 :(得分:1)

感谢@OldUgly向正确的方向发展。

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

  1. 在表格上创建可见列,以确定当前隐藏的行。这是一个正常的公式,而不是CSE公式 =IF(AGGREGATE(3, 5,[@[Testing Process]])>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 (公式 - >定义名称),以便数据验证没有一堆#NUM !最后的错误。

    在单元格上激活数据验证时,将允许设置为&#34;列表&#34;和来源为=Testing_Processes_for_Data_Validation

  4. 那就是它!这将根据表的筛选列创建自动扩展的动态列表,并从该列表中删除空白和错误。