ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6820|回复: 23

[分享] [技巧]避免Target.Count导致的“溢出”错误

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-5-2 21:14 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 ggmmlol 于 2018-5-2 22:44 编辑

在编写Worksheet_SelectionChange代码时,为了使代码只在单选一个单元格时才能运行,通常会用到类似这样的代码:
  1. If Target.Count > 1 Then Exit Sub
复制代码
这个代码,在xls格式的工作薄中,是可以正常运行,没有一点问题的;
但如果在xlsm格式的工作薄中,很可能就出现如下图所示的“溢出”错误。这是因为,在xlsm等EXCEL2007工作薄中,当全选一个工作表时,Target.Count的值是1048576*16384,也就是2的34次方,而EXCEL自身能常规处理的最大值是2的32次方,由于超出其计算范围而产生“溢出”错误。



那么,如何避免这个错误而同样达到原来的效果呢?
——这里介绍一个很简单的技巧,用下面的这个代码来替代就可以了:
  1. If Target.Address Like "*[:,]*" Then Exit Sub
复制代码


原理分析:当选择的单元格的数量不是一个时,那么,一种可能是选择了一个连续的长方形单元格区域,另一种可能是选择了多个不连续的单元格区域。第一种情况下,则所选择的区域的地址中会包含“:”,而第二种情况下,则地址中会包含“,”。所以,只要所选择的单元格区域的地址中了包含“:”、“,”中的任意一个,就可以判定所选区域中的单元格个数是大于1的。

换句话说,“Target.Address Like "*[:,]*"” 是能充分等效于 “Target.Count > 1”的,而Target.Address的值是一个简短的字符串,不会出现超出EXCEL处理范围的情况。所以,这样一个小技巧,就可以解决前述的溢出错误了!
溢出错误.png

评分

8

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-5-2 21:22 | 显示全部楼层
学习了。新版本也可以使用CountLarge来代替Count。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-5-2 22:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
构思很妙。。。。。。。

TA的精华主题

TA的得分主题

发表于 2018-5-3 08:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这方法好像也可以:
If CDec(Target.Rows.Count) * Target.Columns.Count > 1 Then Exit Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-5-3 09:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
一把小刀闯天下 发表于 2018-5-3 08:32
这方法好像也可以:
If CDec(Target.Rows.Count) * Target.Columns.Count > 1 Then Exit Sub

是的。只要注意到Target.CounT的“溢出”现象,就可能找到很多种的解决方案。
比如,下面的这句代码也是可以达到效果的:
If Target.Rows.Count > 1 Or Target.Columns.Count > 1 Or Target.Areas.Count > 1 Then Exit Sub
2楼所说的 用CountLarge来代替Count,也是可以的。(但这个代码,反过来另存为xls格式的工作薄时,还得修改代码,仍是不能通用。)

所谓的“技巧”,就是在能够完成同一目标的众多方案之中,操作更简便、更通用的那一种。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-5-3 11:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ggmmlol 发表于 2018-5-3 09:33
是的。只要注意到Target.CounT的“溢出”现象,就可能找到很多种的解决方案。
比如,下面的这句代码也是 ...

嗯,方法确实不少。我把它改成加试了一下也是可以的:
If Target.Rows.Count + Target.Columns.Count > 2 Then Exit Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-5-3 11:16 | 显示全部楼层
本帖最后由 ggmmlol 于 2018-5-3 11:21 编辑
一把小刀闯天下 发表于 2018-5-3 11:08
嗯,方法确实不少。我把它改成加试了一下也是可以的:
If Target.Rows.Count + Target.Columns.Count >  ...

这个修改是不成功的,嘿嘿!
捕获.PNG

TA的精华主题

TA的得分主题

发表于 2018-5-3 11:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一把小刀闯天下 发表于 2018-5-3 08:32
这方法好像也可以:
If CDec(Target.Rows.Count) * Target.Columns.Count > 1 Then Exit Sub

这种方法最理想

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-5-3 12:07 | 显示全部楼层
microyip 发表于 2018-5-3 11:47
这种方法最理想

4楼和6楼 给出的两种方法,都只解决了只选择一个连续的单元格区域的问题。
而如果用按住Ctrl方式选择了两个不连续的单元格时,这两种方式的判定都是不够充分的。

事实上,包括Target.Row、Target.Column、Target.Count、Target.Rows、Target.Columns,都是默认 以Target.Areas(1)的区域来取相应的属xing值的。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-5-3 12:32 | 显示全部楼层
ggmmlol 发表于 2018-5-3 12:07
4楼和6楼 给出的两种方法,都只解决了只选择一个连续的单元格区域的问题。
而如果用按住Ctrl方式选择了 ...

这个很好解决啊,你对每个Area进行相加处理就是啦

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 07:31 , Processed in 0.051958 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表