excel - 自动扩大Excel数组公式的范围(无需宏)

标签 excel excel-formula

问题

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

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

过滤数据验证设置

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

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

第二个表具有三个相关列:可见类别测试过程。该表使用“类别”列上的切片器进行过滤,并且数据验证从“测试过程”列中返回值。使用三步过程来防止过滤值出现在数据验证中:

  1. 如果表格行被过滤掉,则可见列中的单元格将显示空白;如果未过滤掉,则显示测试过程的值。其公式为:
    =IF(AGGREGATE(3, 5,[@[测试过程]])>0,[@[测试过程]],"")

  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)

潜在的解决方案

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

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

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

最佳答案

感谢@OldUgly,让我们朝着正确的方向前进。

从 OneDrive 下载示例工作簿:https://1drv.ms/x/s!Ak4Lq2gGjO8hleIyd60JuPkctlDhGw ,但请注意,在线预览不支持数据验证!您必须下载文件才能看到它的运行情况。

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

  1. 在表格上创建一个可见列以确定当前隐藏的行。这是一个普通公式,不是 CSE 公式。
    =IF(AGGREGATE(3, 5,[@[测试过程]])>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 创建定义名称​​Testing_Processes_for_Data_Validation(公式->定义名称) , MATCH("*",Validation[Filtered List],-1), 1) 这样数据验证就不会有一堆#NUM!末尾有错误。

    在单元格上激活数据验证时,将“Allow”设置为“List”,将“Source”设置为=Testing_Processes_for_Data_Validation

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

关于excel - 自动扩大Excel数组公式的范围(无需宏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36924483/

相关文章:

excel - 查找值 - #N/A 结果

excel - 索引/匹配公式中的动态工作表名称

vba - 删除列中所有有错误的行

c# - 在实时(未保存)Excel 数据和 C# 对象之间建立接口(interface)的最快方式

excel - 从单元格中删除字符串的前 '11' 个字符 - excel

excel - 如何按 "numerical"顺序对大纲数字进行排序?

excel - 如何比较excel中不同列的多个值?

arrays - 范围联合无序

Excel公式: List headers where cell has value

python - python中的等效 "yield"excel函数?