2,726
社区成员
发帖
与我相关
我的任务
分享
#define xlDown -4121
#define xlToLeft -4159
#define xlToRight -4161
#define xlUp -4162
3. Range("A65536").End(-4162).Row
就是从第一列第65536行开始往上(-4162 即xlUp)查找直到遇到第一个包含数据的单元格,并返回它的行号
同样,Range(‘IV5’).End(-4159).Column 是从第 IV 列第5行开始往左查找第一个包含数据的单元格并返回列号
4. 多数时候,用 End 方法会好一些,因为它只判断单元格的值和公式是否包含数据,但也不要过度迷信这种方法,它同样存在许多缺陷
首先,单元格的值(或公式计算结果)只有空格或不可见字符时,它同样认为非空,这不难理解,确实是有值,就像 vfp 中 !(space(1) == "") 一样
其次,如果最后一列中有空值,你就不得不遍历所有行来判断最大可见列数,例如,Range(‘IV5’),可能第 5 行最后一个有值的单元格是第 10 列,而第 6 行最后一个有值的单元格却是第 11 列
。。。(此处略去 500 字)
最后,65536 这个值(也就是 64K)是 2007 之前版本的最大行号,IV(= 256)列也同样;从 Excel 2007 开始,它们的值变成了 1024K(1024*1024 = 1048576)行及 16K (16384)列,所以 Range("A65536"),Range("IV?") 这种写法只适用于 2007 以前的版本,2013 以后的版本是多少还不可知,换句话说,你的代码得判断 Excel 的版本并做不同处理
Excel 是个相当复杂的对象,要完全弄清楚得花很多功夫,对 VBA 使用者是必备的,咱们 foxer 只要会用,会录制宏就基本够用了。需要时可以查阅 VBA 的帮助,你打开 Excel 后按 Alt+F11 调出 VB 编辑器,查看它帮助中的语言参考部分