小编Nei*_*lop的帖子

如何在任何工作表中找到真正的最后一个单元格

这个问题现在得到了优雅的回答,感谢Chris Neilsen,请看下面的答案.这是我将从现在开始使用的那个.该解决方案可靠地查找工作表中的最后一个单元格,即使单元格被过滤器,组或本地隐藏行隐藏.

讨论可能对一些人有用,所以我也提供了我自己的代码的优化版本.它演示了如何保存和恢复过滤器,使用@ Chis的想法查找最后一行,并在一个简短的Variant数组中记录隐藏行范围,最终从中恢复它们.

还可以在此处下载探索和测试所讨论的所有解决方案的测试工作簿.

完整的问题和讨论,更新

这里和其他地方有很多关于在Excel工作表中查找最后一个单元格的讨论.该Range.SpecialCells方法有局限性,并不总能找到真正的最后一个单元格.如果Worksheet.AutoFilters处于活动状态,则尤其如此.下面的代码解决了问题并返回了正确的结果,即使过滤器处于活动状态,单元格被分组和隐藏,或者行或列被隐藏使用隐藏/取消隐藏.但是,该方法并不简单.有人知道一种始终可靠的更好的方法吗?

"真正的最后一个单元格"被理解为包含数据或公式的最后一行与包含它们的最后一列的交集.格式化可能会超出它.

积分和感谢好主意:阅读sancho s.

下面的代码在我的Excel 2010应用程序中测试和工作,并要求在VBIDE中引用Scripting.Runtime.它包含内联注释,记录它正在做什么以及为什么.此外,变量名称是故意解释的.对不起,但这让他们很长.

在某些情况下,它可能无法恢复调用时隐藏的确切行.我从未发生过这种情况.

编辑1到问题

感谢2016年1月3日的3种响应者.
这是继brettdj之后标记问题已经回答的问题.遗憾的是,我不相信这是真的.至少,除非UsedRange在所有情况下都可以信任.尽管SpecialCells的问题很难再现,但是之前对SpecialCells提供的价值观的体验不鼓励对它们的依赖.

brettdj的帖子返回从A1到最后一个使用过的单元格的范围提供了一个解决方案GetRange.它是其中之一,但似乎显然是最好的.我已经测试了它以及该线程中提出的所有解决方案.在我的测试中,当过滤器处于活动状态而没有信任时,它们都没有能够找到最后一个单元格UsedRange. brettdj,声誉很高,显然不这么认为,但在我看来,我确实发现了一个真正的问题.

展示:

请参阅以下测试表.在此视图中公开所有行和列.请注意第19行,其中包含H19中"用过滤器隐藏的行"文本.另请注意,B20第20行和J11第J列有信息.(显然,由于这是一个测试,J20中没有任何内容,其参考是该问题的正确答案): 测试工作表是暴露所有行和列

测试在上面的工作表上运行,但过滤器处于活动状态(由下图中的红色圆圈强调),从视图中删除第19行.在测试期间,柱组J:K被折叠,但是19:20的Row Group仍然可见.

这些是结果(真正的答案是J20):

  • Gettrange()brettdj在引用的答案中给出"范围是A1:B20".
  • TrueLastCell()Gary的学生给出"真正的最后一个单元格是B20"并且有时可能非常昂贵,如果UsedRange到达一个很大空的工作表的末尾,则从非常高的行和列数循环.(此外,答案中的屏幕显示C11,应该是F11.)
  • GetTrueLastCell(WS)通过PatrickK获得正确的答案,J20但它完全依赖于UsedRange,我理解这是不可能的,或者我永远不会开始这个!
  • GetTrueLastCell(WS,,) (通过我,下面的代码虽然很复杂)给出$ 20 $.

在此输入图像描述

在不太可能的情况下,这是特定于操作系统,我的测试是在{你不允许笑 - :)} Vista Home Premium.我的理由是它是一台闪电般快速的8核机器上的64Bit操作系统,即使它已经老化了.Excel 2010,32位版本14.0.7166.5000.

编辑2作为回应

为响应chris neilsen的验证请求和测试文件上传,它不再在这里.简短的回答是:在运行Office 2013 15.0.4797.1003以及Vista …

excel vba excel-vba

5
推荐指数
1
解决办法
1401
查看次数

标签 统计

excel ×1

excel-vba ×1

vba ×1