【问题标题】:Ignore blank cells in Excel Named Range忽略 Excel 命名区域中的空白单元格
【发布时间】:2016-05-02 14:35:59
【问题描述】:

我有一个宏,可以将一系列工作表中的数据复制到母版中,以便我可以在一个地方分析数据。导入的数据存在于定义明确的列中,因此我可以使用 sumproduct 公式生成报告。

我已使用命名范围为每列数据命名,因此我不必在每个 sum 产品中使用 Sheets!A1 引用。但是由于数据会根据导入的内容而改变大小,所以我将命名范围设为 A2:A1048576 列的整个大小。这意味着 sumproduct 需要永远运行。

有没有办法将命名范围限制为仅包含数据的单元格?它们将始终位于前 n 行(取决于每次运行导入的数据量)。

或者我有更好/更简单的方法来实现这个功能吗?

【问题讨论】:

  • 我不知道这是否对你有帮助,但在 Excel 中,你可以执行“Goto blanks”,这意味着:按 Ctrl+G、“Special”、“Blanks”。也许您可以复制所有内容并在目标工作表中执行此“转到空白”,然后删除每个结果(右键单击,“删除”,“向上或向左移动单元格”)。
  • @Dominique- OP 想要一个动态命名范围,随着工作表的变化而变化

标签: excel excel-formula excel-2010 vba


【解决方案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 列中该行的单元格引用。

【讨论】:

    【解决方案2】:

    关于我为什么发帖的随机信息

    首先,我使用了teylyn's 推荐的方法(谢谢!),它工作得很好,并对其进行了调整以包含任何长度的文本,而不是仅限于输入多少“z”。

    其次,我扩展了当人们(比如我的用例)需要/喜欢使用命名表和标题时的代码。

    希望这可以帮助。

    忽略命名范围中的空白 - 版本 1

    使用与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 将最后一次看到该值在该列中不为真(因此它不是空白)作为它将计算的行号。
    注意:此方法不适用于数字。

    注意:如果在最后一个单元格有一个值之前有一个单元格的空白之前 strong> 在该列中,随机空白仍将显示在列表中!

    要消除可能仍会显示随机空白单元格的问题,请按照我的下一个方法:

    忽略命名范围中的空白 - 版本 2

    为了过滤一列值,以便所有文本都显示在列的顶部,您可以将列表设为表格,给它一个名称(例如“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))
    

    我希望这是有道理的。我只是将表中每个选项的第一行定义为名称范围的起点。

    注意:数字不适用于这些特定版本的 MATCH,所以不要忘记使用以下版本的 MATCH:

    MATCH(99^99,Table_Name[Column_Header],1)
    



    让我知道我是否遗漏了什么!

    旁注: 另一位 StackOverflow Excel 专家使用了另一种方法,我将尝试查找并链接到此评论,对于那些有兴趣根据用户自己输入的值自动更新值列表的人..

    【讨论】:

      【解决方案3】:

      我已经尝试了上面的方法,并且每个部分都可以在工作表上正常工作,并且在将单元格内容一起粘贴到工作表中时会返回一个范围内的单元格内容。但是,当我尝试将它作为一个范围应用到数据验证中时,它会引发一个公式错误,没有什么特别的,只是看起来你正在尝试输入一个公式。

      =INDEX(tDPO[#Data],1,MATCH("ListName",tDPO[#Headers],0)):INDEX(tDPO[ListName],MATCH("",tDPO[ListName],-1))
      

      【讨论】:

        猜你喜欢
        • 2018-11-20
        • 2011-04-19
        • 2021-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多