自动扩展公式范围
Auto-Extend Formula Range
我有以下公式:
=IF(MAX(C2:F2)>0,COUNTIF(C2:F2,">1")/COUNT(C2:F2),0)
此公式位于结构化 table 的第二列中,并通过右侧 table 中的其余列。该公式基本上说明有多少实例满足特定条件,并将其占实例总数的一小部分。因此,如果满足条件 2 次并且有 3 个实例,我将获得 2/3 作为输出。
我已经研究了一个小时了,我想不通。有没有办法让公式中的单元格范围在添加新列时自动扩展?
您应该利用 Structured Referencing 和 Index
来获取您需要的 table 部分
=IFERROR( COUNTIF(
INDEX(YourTableName[@],1,(COLUMN([@FormulaColumn])-COLUMN(YourTableName[@])+2)):
INDEX(YourTableName[@],1,COLUMNS(YourTableName[@])),
">1") /
COUNT(
INDEX(YourTableName[@],1,(COLUMN([@FormulaColumn])-COLUMN(YourTableName[@])+2)):
INDEX(YourTableName[@],1,COLUMNS(YourTableName[@])))
,0)
这将计算公式列右侧 >1
的单元格数量,并将其除以公式列右侧非空白的单元格数量。
这里的重点是COLUMNS(YourTableName[@])
。这将随着您添加列而自动增加
注意:如果要在除数中包含空格,可以调整公式以适应
只需更改 YourTableName
和 FormulaColumn
以适合您的数据
根据我对数据的了解,可以通过创建引用的命名范围来解决问题:
=OFFSET($C,0,0,1, COLUMNS(myTable))
公式修改为:
=IF(MAX(myRange)>0,COUNTIF(myRange,">1")/COUNT(myRANGE),0)
- 其中
myTABLE
是您的 table 和 的名称
- 其中
myRANGE
是新命名范围的名称
工作原理:
命名范围计算 table 中的列数,并在添加一列时更新并删除。偏移锚定到 table 的左侧,并向右延伸 table 中的列数。该公式删除了单元格引用以支持命名范围以提高易读性。它可以被复制、拖动、粘贴和移动到各处,并且仍然指向正确的范围。如果范围足够大,您可以毫无问题地将它放在工作簿中的任何位置。
注意: 当我将 sheet 复制到新工作簿时,我对这种方法最大的不满。命名范围非常棒,工作簿范围内的范围将指向原始工作簿,即使它已被复制到新工作簿。有时这是一件好事,但对我们来说,这通常是一件令人讨厌的事。
我相信另一个答案会补充第一个答案,因为在无数情况下,人们可能需要动态范围但同时又不想要 table。
这就是线索,有关更多信息,您可以搜索动态范围。或者更具体地说:动态命名范围。
回答你的问题:
是的,这是可能的,而且非常方便。例如,打印区域可以根据您的数据进行扩展和收缩,并且非常容易与之交互,因为您可以按名称而不是地址进行操作。当使用 VBA 时,我发现在命名范围内工作通常比 table 更容易,也就是说,除非 table 绑定到一个变量,否则它们将是相等的在我眼里。打字有一种根本上的厌恶 listobject("table name").listcolum("table colum name").datapropertyrange
当我不得不打字时,我几乎有一种本能的反应。
创建动态命名范围的要点很简单。打开名称编辑器,命名一个范围,然后使用 offset()
和 counta()
来定义您的范围。计算非空单元格有双重责任。它是重新计算范围的触发器,它提供了一个索引,可以与偏移量一起使用来改变范围区域。
这是一个例子:=OFFSET($A,0,0,COUNTA($A:$A),1)
非常简单。除了一个例外,打印范围。
无论出于何种原因,打印范围的行为方式都不一样,也不像正常的命名范围那样更新。要使其动态化,您可以像往常一样创建一个命名范围。这将是您的打印范围,因此请务必考虑。然后使您的打印范围引用该命名范围。这里的所有都是它的。第一个命名范围指向您要打印的区域,范围内的打印指向该命名范围。
我有以下公式:
=IF(MAX(C2:F2)>0,COUNTIF(C2:F2,">1")/COUNT(C2:F2),0)
此公式位于结构化 table 的第二列中,并通过右侧 table 中的其余列。该公式基本上说明有多少实例满足特定条件,并将其占实例总数的一小部分。因此,如果满足条件 2 次并且有 3 个实例,我将获得 2/3 作为输出。
我已经研究了一个小时了,我想不通。有没有办法让公式中的单元格范围在添加新列时自动扩展?
您应该利用 Structured Referencing 和 Index
来获取您需要的 table 部分
=IFERROR( COUNTIF(
INDEX(YourTableName[@],1,(COLUMN([@FormulaColumn])-COLUMN(YourTableName[@])+2)):
INDEX(YourTableName[@],1,COLUMNS(YourTableName[@])),
">1") /
COUNT(
INDEX(YourTableName[@],1,(COLUMN([@FormulaColumn])-COLUMN(YourTableName[@])+2)):
INDEX(YourTableName[@],1,COLUMNS(YourTableName[@])))
,0)
这将计算公式列右侧 >1
的单元格数量,并将其除以公式列右侧非空白的单元格数量。
这里的重点是COLUMNS(YourTableName[@])
。这将随着您添加列而自动增加
注意:如果要在除数中包含空格,可以调整公式以适应
只需更改 YourTableName
和 FormulaColumn
以适合您的数据
根据我对数据的了解,可以通过创建引用的命名范围来解决问题:
=OFFSET($C,0,0,1, COLUMNS(myTable))
公式修改为:
=IF(MAX(myRange)>0,COUNTIF(myRange,">1")/COUNT(myRANGE),0)
- 其中
myTABLE
是您的 table 和 的名称
- 其中
myRANGE
是新命名范围的名称
工作原理:
命名范围计算 table 中的列数,并在添加一列时更新并删除。偏移锚定到 table 的左侧,并向右延伸 table 中的列数。该公式删除了单元格引用以支持命名范围以提高易读性。它可以被复制、拖动、粘贴和移动到各处,并且仍然指向正确的范围。如果范围足够大,您可以毫无问题地将它放在工作簿中的任何位置。
注意: 当我将 sheet 复制到新工作簿时,我对这种方法最大的不满。命名范围非常棒,工作簿范围内的范围将指向原始工作簿,即使它已被复制到新工作簿。有时这是一件好事,但对我们来说,这通常是一件令人讨厌的事。
我相信另一个答案会补充第一个答案,因为在无数情况下,人们可能需要动态范围但同时又不想要 table。
这就是线索,有关更多信息,您可以搜索动态范围。或者更具体地说:动态命名范围。
回答你的问题:
是的,这是可能的,而且非常方便。例如,打印区域可以根据您的数据进行扩展和收缩,并且非常容易与之交互,因为您可以按名称而不是地址进行操作。当使用 VBA 时,我发现在命名范围内工作通常比 table 更容易,也就是说,除非 table 绑定到一个变量,否则它们将是相等的在我眼里。打字有一种根本上的厌恶 listobject("table name").listcolum("table colum name").datapropertyrange
当我不得不打字时,我几乎有一种本能的反应。
创建动态命名范围的要点很简单。打开名称编辑器,命名一个范围,然后使用 offset()
和 counta()
来定义您的范围。计算非空单元格有双重责任。它是重新计算范围的触发器,它提供了一个索引,可以与偏移量一起使用来改变范围区域。
这是一个例子:=OFFSET($A,0,0,COUNTA($A:$A),1)
非常简单。除了一个例外,打印范围。
无论出于何种原因,打印范围的行为方式都不一样,也不像正常的命名范围那样更新。要使其动态化,您可以像往常一样创建一个命名范围。这将是您的打印范围,因此请务必考虑。然后使您的打印范围引用该命名范围。这里的所有都是它的。第一个命名范围指向您要打印的区域,范围内的打印指向该命名范围。