无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 497|回复: 12
打印 上一主题 下一主题

论坛有研究VBA的吗?发现定位最后一个单元格SpecialCells(xlCellTypeLastCell)的Bug

[复制链接]
跳转到指定楼层
1#
发表于 2023-6-12 09:35:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 likeyouli 于 2023-6-12 14:41 编辑

因为工作关系,需要经常用到excel,所以最近一直学习vba,
excel2016, ctrl+g ,定位条件,选择最后一个单元格,比如选中的是H15单元格,然后整行删除15行、h列,然后再定位最后一个单元格,仍会定位到H15单元格,哪怕多删几整行整列,把15、14、13行都删除,把f、g、h列都删除,还是定位到H15单元格;
   几经摸索,vba里运行以下代码,则可正常,
  1. Sub 判断表格内是否有完整空行或空列()
  2. n1 = ActiveSheet.UsedRange.Rows.Count
  3. n2 = ActiveSheet.UsedRange.Columns.Count
  4. m1 = Range("a1").CurrentRegion.Rows.Count
  5. m2 = Range("a1").CurrentRegion.Columns.Count
  6. End Sub
复制代码
        删除整行或整列后,首先运行上段代码,然后再定位最后一个单元格,就会正常了。
         我用的是excel2016,非常怀疑这是bug,,不知道其他版本的excel会不会这样,,
  答案:感谢后边朋友的回答,保存一下就可以了,也许不能算是bug了,但就算不保存,用ActiveSheet.UsedRange.Rows.Count依旧可以正确的判断出rows的数量,用Range("a1", Selection.SpecialCells(xlCellTypeLastCell)).select 却必须要先保存一下才可以判断出正确边界。





13#
 楼主| 发表于 2023-6-12 15:53:13 | 只看该作者
2011ohte 发表于 2023-6-12 15:31
习惯用Sheets(1).Range("A65536").End(3).Row
没错过

你没见过凌乱的数据,,有些人报给我的数据,中间竟然有空行,或者空列,有的甚至有隐藏行,,
啥情况都有,,所以我要考虑各种情况下都必须准确
回复

使用道具 举报

12#
发表于 2023-6-12 15:31:46 | 只看该作者
习惯用Sheets(1).Range("A65536").End(3).Row
没错过

点评

你没见过凌乱的数据,,有些人报给我的数据,中间竟然有空行,或者空列,有的甚至有隐藏行,, 啥情况都有,,所以我要考虑各种情况下都必须准确  详情 回复 发表于 2023-6-12 15:53
回复

使用道具 举报

11#
发表于 2023-6-12 15:15:08 | 只看该作者
likeyouli 发表于 2023-6-12 14:29
谢谢,保存一下,立马可以了,
  但在vba里用ActiveSheet.UsedRange.Rows.Count 不用保存,也可以正确的 ...

我觉得既然都用VBA了,应该放弃键盘鼠标操作那个模式...
回复

使用道具 举报

10#
 楼主| 发表于 2023-6-12 14:29:12 | 只看该作者
本帖最后由 likeyouli 于 2023-6-12 14:44 编辑
2011ohte 发表于 2023-6-12 14:00
保存一下文件就好了。

最后一个单元格应该在XML文件中有一个记号,编辑后不会回到左上单元格,只会记住 ...

谢谢,保存一下,立马可以了,
  但在vba里用ActiveSheet.UsedRange.Rows.Count 不用保存,也可以正确的判断出rows的数量,用Range("a1",Selection.SpecialCells(xlCellTypeLastCell)).select却必须要先保存一下才能正确的判断出选中的范围。

点评

我觉得既然都用VBA了,应该放弃键盘鼠标操作那个模式...  详情 回复 发表于 2023-6-12 15:15
回复

使用道具 举报

9#
 楼主| 发表于 2023-6-12 14:28:15 | 只看该作者
Climbing 发表于 2023-6-12 12:28
我印象中,删除操作之后,要做一个存盘的操作,操作才真的生效。

恩,保存一下,立马可以了,
  但在vba里用ActiveSheet.UsedRange.Rows.Count 不用保存,也可以正确的判断出rows的数量
回复

使用道具 举报

8#
发表于 2023-6-12 14:00:53 | 只看该作者
保存一下文件就好了。

最后一个单元格应该在XML文件中有一个记号,编辑后不会回到左上单元格,只会记住最远的单元格。

点评

谢谢,保存一下,立马可以了, 但在vba里用ActiveSheet.UsedRange.Rows.Count 不用保存,也可以正确的判断出rows的数量  详情 回复 发表于 2023-6-12 14:29
回复

使用道具 举报

7#
发表于 2023-6-12 12:33:08 | 只看该作者
likeyouli 发表于 2023-6-12 11:16
源区域用什么读取 ? currentregion 还是usedrange ?
  set 变量= ?

比如iData=range("A1:E1").value,不过这种都要提前dim iData as range
回复

使用道具 举报

6#
发表于 2023-6-12 12:28:42 | 只看该作者
我印象中,删除操作之后,要做一个存盘的操作,操作才真的生效。

点评

恩,保存一下,立马可以了, 但在vba里用ActiveSheet.UsedRange.Rows.Count 不用保存,也可以正确的判断出rows的数量  详情 回复 发表于 2023-6-12 14:28
回复

使用道具 举报

5#
 楼主| 发表于 2023-6-12 11:16:01 | 只看该作者
邪恶海盗 发表于 2023-6-12 10:47
如果是我地话,我会先把源区域的值读取到变量,然后再将变量写入到目标区域...

源区域用什么读取 ? currentregion 还是usedrange ?
  set 变量= ?

点评

比如iData=range("A1:E1").value,不过这种都要提前dim iData as range  详情 回复 发表于 2023-6-12 12:33
回复

使用道具 举报

4#
发表于 2023-6-12 10:47:18 | 只看该作者
likeyouli 发表于 2023-6-12 10:32
我主要是测试这样copy表格内容:Range("a1", Selection.SpecialCells(xlCellTypeLastCell)).copy
体会一 ...

如果是我地话,我会先把源区域的值读取到变量,然后再将变量写入到目标区域...

点评

源区域用什么读取 ? currentregion 还是usedrange ? set 变量= ?  详情 回复 发表于 2023-6-12 11:16
回复

使用道具 举报

3#
 楼主| 发表于 2023-6-12 10:32:22 | 只看该作者
邪恶海盗 发表于 2023-6-12 09:56
说实话没看懂,你都用VBA了为啥要用CTRL+G来定位...

我主要是测试这样copy表格内容:Range("a1", Selection.SpecialCells(xlCellTypeLastCell)).copy
体会一下与range("a1").currentregion.copy 或者activesheet.usedrange.copy的区别

点评

如果是我地话,我会先把源区域的值读取到变量,然后再将变量写入到目标区域...  详情 回复 发表于 2023-6-12 10:47
回复

使用道具 举报

2#
发表于 2023-6-12 09:56:35 | 只看该作者
说实话没看懂,你都用VBA了为啥要用CTRL+G来定位...

点评

我主要是测试这样copy表格内容:Range("a1", Selection.SpecialCells(xlCellTypeLastCell)).copy 体会一下与range("a1").currentregion.copy 或者用activesheet.usedrange.copy的区别  详情 回复 发表于 2023-6-12 10:32
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-12-22 00:39

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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