我有一个宏将一系列工作表中的数据复制到主数据库中,以便我可以在一个地方分析数据。导入的数据存在于明确定义的列中,因此我可以使用sumproduct公式生成报告。
我使用命名范围为每列数据命名,因此我不必在每个sum产品中使用Sheets!A1引用。但是,由于数据将根据导入的内容更改大小,因此我将命名范围设置为A2列的整个大小:A1048576。这意味着sumproduct需要永远运行。
有没有办法将命名范围限制为仅包含数据的单元格?它们将始终位于前n行(取决于每次运行时导入的数据量)。
或者我有更好/更简单的方法来实现此功能吗?
答案 0 :(得分:1)
您可以使用公式代替直接单元格引用使范围名称动态化。
如果您希望范围名称在A2中开始并延伸到A列中的最后一行数据,则可以使用此公式
如果A栏有文字,请使用
=Sheet1!$A$2:INDEX(Sheet1!$A:$A,MATCH("zzzzzzz",Sheet1!$A:$A,1))
如果A栏有数字,请使用
=Sheet1!$A$2:INDEX(Sheet1!$A:$A,MATCH(99^99,Sheet1!$A:$A,1))
这些公式中的Match()函数将返回包含数据的最后一行的行号,而Index函数将返回A列中该行的单元格引用。
答案 1 :(得分:1)
首先,我使用了teylyn's推荐的方法(感谢你!)工作正常,并将其调整为包含任意长度的文本,而不是仅限于多少" z&# 34;你投入
其次,我扩展了代码,以便人们(比如我的用例)需要/喜欢使用命名表和标题。
希望这可以帮助。
使用与teylyn相同的方法,而不是:
=Sheet1!$A$2:INDEX(Sheet1!$A:$A,MATCH("zzzzzzz",Sheet1!$A:$A,1))
尝试使用""作为文本的最小语句,因此放入文本框的任何内容都将计为大于该值,告诉Match函数对其进行计数:
=Sheet1!$A$2:INDEX(Sheet1!$A:$A,MATCH("",Sheet1!$A:$A,-1))
这应该起作用的原因是MATCH最后一次看到该值在该列中不是真的(所以不是一个空白的antyhing)作为它将计数的行号。
注意:此方法不适用于数字。
注意:如果 之前 ,则该列中的值为的单元格随机空白仍将显示在列表中!
要删除仍可能显示随机空白单元格的问题,请按照我的下一个方法操作:
为了过滤一列值,以便所有文本显示在列的顶部,您可以将列表设为一个表,为其命名(例如" Table_Name"),并为列表中的列提供标题(例如" Column_Header")。
如果您希望命名范围包含您的列标题,并忽略所有空格,请尝试使用:
=INDEX(Table_Name[[#Headers],[Column_Header],1):INDEX(Table_Name[Column_Header],MATCH("",Table_Name[Column_Header],-1))
如果您希望从列数据的第一行开始,请尝试使用:
=INDEX(Table_Name[[#Data],[Column_Header],1):INDEX(Table_Name[Column_Header],MATCH("",Table_Name[Column_Header],-1))
我希望这是有意义的。我只是将表中每个选项的第一行定义为名称范围的起点。
注意: Numbers不会使用这些特定版本的MATCH,所以不要忘记使用以下版本的MATCH:
MATCH(99^99,Table_Name[Column_Header],1)
如果我错过任何东西,请告诉我!
旁注:
还有一个方法我已经被其他StackOverflow Excel专家使用,我会尝试找到并链接到这个评论,对于那些有兴趣拥有自动更新值列表的人,基于用户自己的值输入..