无忧启动论坛

标题: 论坛有研究VBA的吗?发现定位最后一个单元格SpecialCells(xlCellTypeLastCell)的Bug [打印本页]

作者: likeyouli    时间: 2023-6-12 09:35
标题: 论坛有研究VBA的吗?发现定位最后一个单元格SpecialCells(xlCellTypeLastCell)的Bug
本帖最后由 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 却必须要先保存一下才可以判断出正确边界。






作者: 邪恶海盗    时间: 2023-6-12 09:56
说实话没看懂,你都用VBA了为啥要用CTRL+G来定位...
作者: likeyouli    时间: 2023-6-12 10:32
邪恶海盗 发表于 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
likeyouli 发表于 2023-6-12 10:32
我主要是测试这样copy表格内容:Range("a1", Selection.SpecialCells(xlCellTypeLastCell)).copy
体会一 ...

如果是我地话,我会先把源区域的值读取到变量,然后再将变量写入到目标区域...
作者: likeyouli    时间: 2023-6-12 11:16
邪恶海盗 发表于 2023-6-12 10:47
如果是我地话,我会先把源区域的值读取到变量,然后再将变量写入到目标区域...

源区域用什么读取 ? currentregion 还是usedrange ?
  set 变量= ?
作者: Climbing    时间: 2023-6-12 12:28
我印象中,删除操作之后,要做一个存盘的操作,操作才真的生效。
作者: 邪恶海盗    时间: 2023-6-12 12:33
likeyouli 发表于 2023-6-12 11:16
源区域用什么读取 ? currentregion 还是usedrange ?
  set 变量= ?

比如iData=range("A1:E1").value,不过这种都要提前dim iData as range
作者: 2011ohte    时间: 2023-6-12 14:00
保存一下文件就好了。

最后一个单元格应该在XML文件中有一个记号,编辑后不会回到左上单元格,只会记住最远的单元格。
作者: likeyouli    时间: 2023-6-12 14:28
Climbing 发表于 2023-6-12 12:28
我印象中,删除操作之后,要做一个存盘的操作,操作才真的生效。

恩,保存一下,立马可以了,
  但在vba里用ActiveSheet.UsedRange.Rows.Count 不用保存,也可以正确的判断出rows的数量
作者: likeyouli    时间: 2023-6-12 14:29
本帖最后由 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却必须要先保存一下才能正确的判断出选中的范围。
作者: 邪恶海盗    时间: 2023-6-12 15:15
likeyouli 发表于 2023-6-12 14:29
谢谢,保存一下,立马可以了,
  但在vba里用ActiveSheet.UsedRange.Rows.Count 不用保存,也可以正确的 ...

我觉得既然都用VBA了,应该放弃键盘鼠标操作那个模式...
作者: 2011ohte    时间: 2023-6-12 15:31
习惯用Sheets(1).Range("A65536").End(3).Row
没错过
作者: likeyouli    时间: 2023-6-12 15:53
2011ohte 发表于 2023-6-12 15:31
习惯用Sheets(1).Range("A65536").End(3).Row
没错过

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




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3