问题:需要查找sheet中一个区域(a1所在range)的右下角单元格

  • 目标:查找从range("A1")单元格开始的这个区域的右下角的单元格

  • 应该是 cells(102,4) ,但实际上不同方法查出的结果可能会不同
  • 数据表(后面的代码基于这个例子),表里存这样3个不连续的数据区域。

方法1:使用  range().specialcells(xlcelltypelasetcell)

  • 特点:简洁,快
  • 范围:specialcells会在全sheet查找
  • a1随意设定即可,是sheet中的任一单元格,或者用 usedrange() 也是一样
  • 语法
  • range().specialcells(xlcelltypelasetcell)
  • cells().specialcells(xlcelltypelasetcell)
  • activesheet.usedrange.specialcells(xlcelltypelasetcell)
  • 局限性
  • 目标是查全表的所有区域,很简洁好用
  • 目标是查某个区域,而sheet只有一个区域时,和这个方法很方便很快
  • 目标是查某个区域,而 sheet 中不只这一个唯一区域时,这个方法不好用。
Sub test81()
'取某个区域最后一个单元格的方法(右下角的cell)m1 = Range("a1").SpecialCells(xlCellTypeLastCell)Debug.Print Range("a1").SpecialCells(xlCellTypeLastCell).Address
Debug.Print Range("a1").SpecialCells(xlCellTypeLastCell).Row
Debug.Print Range("a1").SpecialCells(xlCellTypeLastCell).Column
Debug.Print "cells(" & Range("a1").SpecialCells(xlCellTypeLastCell).Row & "," & Cells(1, 1).SpecialCells(xlCellTypeLastCell).Column & ")"End Sub

看查找结果,当前sheet里查到的不是 range("a1") 这个区域右下角的单元格

方法2  使用 usedrange().address

  • 用 usedrange 也可以类方法1的方式查
  • activesheet.usedrange().specialcells()
  • 直接取的 usedrange().address
  • 一般是 $A$1:$J$102 ,后面那个就是右下角的单元格cell
  • 取右下角cell 就是 Range(Split(ActiveSheet.UsedRange.Address, ":")(1)).Address  ---$J$102
  • 局限性:因为usedrange 默认也是sheet的全部使用的区域,所以也会查到多个区域
Sub test85()'用usedrange().specialcells() 也一样
Debug.Print ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
Debug.Print ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).ColumnDebug.Print ActiveSheet.UsedRange.Address
Debug.Print Range(Split(ActiveSheet.UsedRange.Address, ":")(1)).AddressEnd Sub

查到的不是 range("a1") 这个区域右下角的单元格

方法3:从区域外部,用缩小范围的方法去查 Range("a65536").End(xlUp).Row

  • Range("a65536").End(xlUp)适合查整个sheet的某一列的最后一个有值的单元格。
  • 用缩小范围的方法去查
  • 从尽量大的行列,往回找,可以找到最后一个有值区域,应对 range 中间有空行空列,不连续的情况
  • 比较实用于,查单列,中间还有空行的情况
  • 下面这种方法,可以方便的查一列的最后一个单元格cells()  中间有空格也无所谓
  • Range("a65536").End(xlUp).Row
  • 局限性
  • 如果 sheet上只有1个区域,没有问题
  • 如果 sheet上有多个区域,
  • 在于选择的起始单元格,所在那行,那列,如果没有其他区域就没问题
  • 如果选择的起始单元格,所在那行,那列,如果没有其他区域就没问题就有问题
Sub test82()   '用缩小范围的方法去查Debug.Print "这样查就会超越1个区域"
m2 = Cells(Range("a65536").End(xlUp).Row, Cells(1, 9999).End(xlToLeft).Column)Debug.Print Range("a65536").End(xlUp).Row
Debug.Print Cells(1, 9999).End(xlToLeft).Column
Debug.Print "cells(" & Range("a65536").End(xlUp).Row & "," & Cells(1, 9999).End(xlToLeft).Column & ")"Debug.Print
Debug.Print "这样查就OK"
m3 = Cells(Range("a65536").End(xlUp).Row, Cells(10, 9999).End(xlToLeft).Column)Debug.Print Range("a65536").End(xlUp).Row
Debug.Print Cells(10, 9999).End(xlToLeft).Column
Debug.Print "cells(" & Range("a65536").End(xlUp).Row & "," & Cells(10, 9999).End(xlToLeft).Column & ")"End Sub

注意方法3 尽量不要全表 max_row  max_column 范围去查,注意效率

  • 如何需要取最大行数或列数,实用中尽量别用全表的 max_row  max_column
  • 如果非要强调尽量大的行,列,非空区域准确性,方法2的补充
  • 找当前sheet的最大行列数,用空行空列可查
  • 或者   rows.count  和 columns.count
  • max_row  max_column都很大,一般不要在这么大的范围内循环查找内容,一般情况用不到"
  • 找到空行,空列,可以定位当前版本EXCEL的最大行数,列数"
Sub test83()
'如何需要取最大行数或列数,实用中尽量别用全表的 max_row  max_columnDebug.Print "方法1"
Debug.Print "max_row= " & Range("e1").End(xlDown).Row
Debug.Print "max_column= " & Cells(105, 1).End(xlToRight).ColumnDebug.Print "方法2"
Debug.Print "不用range(""a65536"") 这种极大值的方法,用rows.count"
Debug.Print "这种方法适合取一个区域内的下限"Debug.Print Cells(Rows.Count, Columns.Count)Debug.Print Rows.Count
Debug.Print Columns.CountDebug.Print "方法3---这种缩小范围的思路一般情况更可取,除非要求特别准,或其他要求"
Debug.Print Range("a65536").End(xlUp).RowEnd Sub

方法4  快速定位一个range区域内的右下角 cell

  • 方法
  • Range("a1").End(xlDown).End(xlToRight)
  • 查一个连续区域内的边界,在区域内,用这些即可
  • end(xlup)
  • end(xldown)
  • end(xltoleft)
  • end(xltorigjt)
  • 查一个连续区域内部
  • 局限性:
  • 如果目标要查的区域中间有空行,就不好用
Sub test84()Range("a1").End(xlDown).End(xlToRight).Select
Debug.Print Range("a1").End(xlDown).End(xlToRight).Address
Debug.Print Range("a1").End(xlDown).End(xlToRight).ValueEnd Sub

总结

  • 情形1:如果当前sheet里只有1个range

那么本文的4种方法都是可以的,这4种方法都可以

  1. range().specialcells(xlcelltypelasetcell)
  2. 或  usedrange().address
  3. 或  Range("a65536").End(xlUp).Row
  4. 或  Range("a1").End(xlDown).End(xlToRight)
  • 情形2:但经常是1个sheet里有多个不连续区域有数据,这几种方法差别较大

  • Range("a65536").End(xlUp).Row
  • cells(rows.count,1).End(xlUp).Row
  • 这用法可以识别带空行的区域,如果目标是找这种range() ,比如查一列的最后一个有值的单元格,用这个更好
  • Range("a1").End(xlDown).End(xlToRight)
  • 这个只会查一个区域,不会查到其他区域,但是中间有空行的区域是不适合这么查的
  • range().specialcells(xlcelltypelasetcell)
  • usedrange().address
  • 这两种更适合,目标是查找全表所有用过的区域的 这种情况

VBA如何快速查找一个区域的右下角的那个单元格? 4种方法的比较相关推荐

  1. 【Excel VBA】神操作之命名单元格或区域(一)——为单元格或区域命名

    纲举目张 说明 代码code 使用说明 本系列博文 说明 单看这个标题名称似乎不是很吸睛,如果没有接触过这个功能,可能不了解其强大的能力,强烈建议继续读下去,关键时刻很有用,能够节省很多代码. 在Ex ...

  2. 第48讲 第49讲--动态定位单元格区域1-End属性、动态定位单元格区域2、3-Currentregion UsedRange

    1 单元格区域. EntireRow返回该区域所在的整行对象单元格区域. EntireColumn返回该区域所在的整列 '返回单元格所在的整行与整列,返回单元格对象 'EntireRow 与Entir ...

  3. EXCEL VBA小白第三课:删除行,合并空白单元格

    本文首发于我的知乎和公众号info_star,转载请注明出处. 今天要说的这段代码呢,同样是因为同事妹子有需求而写的. 做数据透视表的时候,经常有一个组里面出现几个分支都有数值的情况,老板要求把数据透 ...

  4. EXCEL中将多个单元格内容合并到一个单元格中的方法(转帖+亲自实践)

    原帖位置:EXCEL中将多个单元格内容合并到一个单元格中的方法 http://t.excelhome.net/thread-3875-1-1.html 说明:这个技巧主要用到以下2个功能 1.Offi ...

  5. 快速消费品的区域配送中心(RDC)运作的优化管理方法(zt)

    随着我国市场经济体制的不断深化,尤其是加入WTO之后国内外市场竞争不断加剧,快速消费品作为消费品市场的重要支撑点,对其物流服务需求的内涵不断深化和提高,第三方物流企业在如何全面高效的改善和提升客户的运 ...

  6. Excel VBA(02)工作簿、工作表、单元格操作

    工作簿操作 一.概述 一个 excel 文件对应一个 workbook,打开后对应一个文件窗口 Windows(1).Visible = True 二.基本操作 workbook操作:open.add ...

  7. excel多列多行堆叠成多列一行_「Excel技巧」Excel快速实现将一行转为多行多列的四种方法...

    今天来说说在Excel中,将表格里的一列转换为多行多列的几种方法. 例如,以下表格,是一个行业分类表,都放在同一列中.现我们准备把它转为多列. 表格里数据除掉标题行行,总共有60列数据,干脆我们就给它 ...

  8. vba单元格批量赋值_Excel●VBA●如何把批注中的信息批量提取到单元格?

    在Excel中,批注(Comment)是一类特殊的数据. 利用批注,我们可以为单元格添加备注信息(如解释.说明),方便表格阅读者了解数据背后的信息. 然而,由于不当的使用习惯,我们也经常碰到一些表格, ...

  9. VBA小代码--确认筛选后的第一个可见单元格的行号

    Sub test()MsgBox (Rows("2:" & Rows.Count).SpecialCells(12).Row) End Sub 另附vba SpecialC ...

最新文章

  1. RDKit | RDKit处理graph-化合物的邻接矩阵、距离矩阵和维纳指数
  2. Windows 95 诞生 25 周年
  3. 自动化测试之键盘操作和select操作
  4. dubbo启动时检查服务
  5. SpringBootApplication注解
  6. 文献记录(part40)--An adversarial human pose estimation network injected with graph structure
  7. tcl linux 刷 安卓系统,安卓用户看过来—手把手教你刷第三方系统
  8. Oracle表删除大量数据后查询变慢问题
  9. ubuntu系统颜色更改
  10. MySQL的快速修复
  11. 以LORA网关构建的智慧养殖方案
  12. 腾讯往届笔试面试题整理大全
  13. java模拟器安卓版钻石狂潮,王者笔记!
  14. innosetup标准安装
  15. 【正则】字符串按一定规则做替换
  16. MATLAB符号运算(七)
  17. arcgis制作格网图
  18. 手机删除文件还有救,5个不错的Android数据恢复软件
  19. ubuntu未关机断电导致异常进入initramfs界面的处理方法
  20. python实现猫脸人嘴

热门文章

  1. 生产环境屏蔽swagger
  2. Linux根目录分区扩容
  3. 使用翻译编辑器本地化UI
  4. QTreeView 设置背景色应用于整条
  5. c语言应用程序的开发步骤,C语言如何开发桌面GUI应用程序?
  6. ajv,json-schema 使用
  7. JavaWeb音乐网站开发:Ajax异步获取歌词文件并显示,以及实现音频与歌词对应同步的方法
  8. Facebook被联邦调查,Spotify起诉苹果,大公司们都怎么了?
  9. 【UVM源码学习】uvm_resource_db
  10. VBA for Excel(三)