VBA---查单元格,行/列,区域边界情况,用end(xlup) .row , end(xldown) .row 等

本文介绍在Excel VBA中使用End属性查找单元格边界的方法,包括如何准确找到列的上下限、单元格的边界及区域边界的有效技巧。通过实例演示了从外部逼近和内部逼近两种方式来确定单元格的边界。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 如果是一个孤立的单元格

  • 孤立的单元格,查其 行,列数,即可定位这个单元格,一般就够了
  • 如果非要查这个孤立单元格的四格方向的范围,会查到这个单元格的行/列 一直往4个方向遇到的其他有数据的单元格的位置 / EXCEL的边界。具体见下面的代码和运行结果。
Sub test121()
'孤立单元格
    Debug.Print "查孤立单元格的边界方法1,其实查行列就够了"
    Debug.Print Cells(3, 6).Row
    Debug.Print Cells(3, 6).Column
     
    Debug.Print "查孤立单元格的边界方法2,查到的是四壁"
    Debug.Print Cells(3, 6).End(xlUp).Row
    Debug.Print Cells(3, 6).End(xlDown).Row
    Debug.Print Cells(3, 6).End(xlToLeft).Column
    Debug.Print Cells(3, 6).End(xlToRight).Column
     
End Sub

 

 

2 如果是单独的行/列

  • 用列来举例子,
  • 一般来说查一列的上限需求比较少,查一列的下限是需求比较多

2.1  如果从外部逼近去查

  • 如果要准确的话,需要保证列不是从第1行开始填充的
  • 一般列不可能满,所以查列的下限一般都是对的
  • 如果列的数据不太多的话,从 Range("c65536") 甚至  range("c999")  range("c9999") 查就很足够了

2.2 如果从内部逼近去查

  • 挑选1个在列中间的单元格作为起点, range("c5")或其他只要不是边界就行
  • 2从内部逼近去查边界呢,只要挑选中间的单元格,从内部查反而更准

2.3  不要从边界的元素去查

  • 但是不要从边界的元素去查,不太准,懒得这么搞

     

2.4 忘了 End(xlEnd) 是个啥?

     'Debug.Print Range("c1").End(xlEnd).Row  '这样不行,只会查到空区域 ??End(xlEnd) 是个啥

Sub test122()

'举列的例子,行类似
'查一列的上限需求比较少,'查一列的下限是需求比较多


    '1 从外部逼近去查
    '如果要准确的话,需要,保证列不是从第1行开始填充的
    
    Debug.Print "查C列的最小行" & Range("c1").End(xlDown).Row,
    Debug.Print "查C列的最大行" & Range("c65536").End(xlUp).Row
    Debug.Print "查D列的最小行" & Range("D1").End(xlDown).Row,
    Debug.Print "查D列的最大行" & Range("D65536").End(xlUp).Row
    Debug.Print
     
    '挑选1个在列中间的单元格作为起点, range("c5")或其他只要不是边界就行
    '2从内部逼近去查边界呢,只要挑选中间的单元格,从内部查反而更准
    Debug.Print "查C列的最小行" & Range("c5").End(xlUp).Row,
    Debug.Print "查C列的最大行" & Range("c5").End(xlDown).Row
    Debug.Print "查D列的最小行" & Range("D5").End(xlUp).Row,
    Debug.Print "查D列的最大行" & Range("D5").End(xlDown).Row
    Debug.Print
     
     
    '3但是不要从边界的元素去查,不太准,肯定也是有规则的,懒得这么搞,记不住这些特殊规则
    '可参考下面孤立单元格的
     

     'Debug.Print Range("c1").End(xlEnd).Row  '这样不行,只会查到空区域 ??End(xlEnd) 是个啥?
    
     
End Sub

 

 

3 按某区域的边界

  • 某区域,一般也没查询区域边界的需要把?因为区域本身已知了范围
  • 都知道范围了,还查什么边界?

  • 如果直接写某一个区域,其实相当于用这个区域的左上角的第1个单元格去查询的
  •  所以查范围的边界,其实等同于查某个单元格的边界
  • 非要查,就从矩形区域的内部去查把(而且还至少不是2*2这种没有 非边界单元格的方式)

 

好用的几种情况--只能试往下往右尽量大的位置反查回来"

其他不好用情况主要是因为,range() 边界连接起来会影响end() 的判断

end() 会查出  非空区域 / 空区域的边界

Sub test121()

'某列
Debug.Print "C列的上下限"
'查一列的上限比较少
Debug.Print Range("c1").End(xlEnd).Row  '这样不行,只会查到空区域
'查一列的下限是需求比较多
Debug.Print Range("c65536").End(xlUp).Row



'某单元格
Debug.Print "查某单元格的边界方法1"
Debug.Print Cells(16, 3).Row
Debug.Print Cells(16, 3).Column


Debug.Print "查某单元格的边界方法2--不好用"
Debug.Print Cells(16, 3).End(xlUp).Row
Debug.Print Cells(16, 3).End(xlDown).Row
Debug.Print Cells(16, 3).End(xlToLeft).Column
Debug.Print Cells(16, 3).End(xlToRight).Column




''某区域,一般也没查询区域边界的需要把?因为区域是已知的
Debug.Print "查某一区域的边界--不好用"
Debug.Print Range("c16:d18").End(xlUp).Row
Debug.Print Range("c16:d18").End(xlDown).Row
Debug.Print Range("c16:d18").End(xlToLeft).Column
Debug.Print Range("c16:d18").End(xlToRight).Column

Debug.Print "好用的几种情况--只能试往下往右尽量大的位置反查回来"
Debug.Print Range("c65536").End(xlUp).Row
Debug.Print Cells(5, 999).End(xlToLeft).Column



End Sub

Sub test121()
 
    '查某列的上下范围,只能从外部逼近
    '还需要假设是连续的
    
    
'001 "查C列的上两端"
'''    Debug.Print Range("c1").End(xlEnd).Row  '这样不行,只会查到空区域 ??End(xlEnd) 是个啥?
    
    '1 从外部逼近去查
    '查一列的上限需求比较少
    Debug.Print "查C列的最小行" & Range("c1").End(xlDown).Row,  '这样不行,只会查到空区域
    '查一列的下限是需求比较多
    Debug.Print "查C列的最大行" & Range("c65536").End(xlUp).Row
    Debug.Print "查D列的最小行" & Range("D1").End(xlDown).Row,  '这样不行,只会查到空区域
    Debug.Print "查D列的最大行" & Range("D65536").End(xlUp).Row
    Debug.Print
     
    '2从内部逼近去查边界呢,看起来从内部查,反而更准
    Debug.Print "查C列的最小行" & Range("c5").End(xlUp).Row,
    Debug.Print "查C列的最大行" & Range("c5").End(xlDown).Row
    Debug.Print "查D列的最小行" & Range("D5").End(xlUp).Row,
    Debug.Print "查D列的最大行" & Range("D5").End(xlDown).Row
    Debug.Print
     
     
    '3但是不要从边界的元素去查,不太准,肯定也是有规则的,懒得这么搞,记不住这些特殊规则
     
    '4也不适合查各种不规则区域的行,列,区域等
     
'002 某单元格
    Debug.Print "查某单元格的边界方法1"
    Debug.Print Cells(16, 3).Row
    Debug.Print Cells(16, 3).Column
     
    Debug.Print "查某单元格的边界方法2--不好用"
    Debug.Print Cells(16, 3).End(xlUp).Row
    Debug.Print Cells(16, 3).End(xlDown).Row
    Debug.Print Cells(16, 3).End(xlToLeft).Column
    Debug.Print Cells(16, 3).End(xlToRight).Column
     

''003 某区域,一般也没查询区域边界的需要把?因为区域是已知的
    Debug.Print "查某一区域的边界--不好用"
    Debug.Print Range("c16:d18").End(xlUp).Row
    Debug.Print Range("c16:d18").End(xlDown).Row
    Debug.Print Range("c16:d18").End(xlToLeft).Column
    Debug.Print Range("c16:d18").End(xlToRight).Column
     
    Debug.Print "好用的几种情况--只能试往下往右尽量大的位置反查回来"
    Debug.Print Range("c65536").End(xlUp).Row
    Debug.Print Cells(5, 999).End(xlToLeft).Column
     
 
 
End Sub

在WPS2019中使用VBA的`End(xlUp)`函数时,可能会遇到一些错误,这通常是因为以下几个原因: 1. **引用的对象不是Range**:确保你在处理的是一个有效的范围,比如单元格。如果尝试对非区域的操作,如单个单元格或者整个工作表,`End(xlUp)`不会起作用。 2. **未激活或选中工作表**:如果你的代码是在一个新的或者未激活的工作表上运,`End(xlUp)`会返回结果为0,因为找不到顶部的单元格。记得先切换到你想操作的工作表或者选择该工作表的某个范围。 3. **语法错误**:确保`End(xlUp)`后面跟着`.Row`,表示你要获取的最后一号。如果少了一个点,`xlUp`会被当作一个单独的参数而不是一个属性调用,导致语法错误。 4. **版本兼容性问题**:某些VBA功能可能在早期版本的WPS中不可用,检一下你的WPS版本是否支持`End(xlUp)`。 如果遇到这类问题,可以尝试加入错误处理机制,例如使用`On Error GoTo ErrorHandler`来捕获并处理可能出现的错误。 ```vba Sub TestEndUp() On Error GoTo ErrorHandler Dim lastRow As Long Set rng = ActiveSheet.Range("A:A") ' 设置你的范围 lastRow = rng.End(xlUp).Row If Err.Number <> 0 Then MsgBox "发生错误:" & Err.Description Err.Clear Else MsgBox "最后一号是:" & lastRow End If ExitSub: Exit Sub ErrorHandler: MsgBox "错误:" & Err.Description Resume ExitSub End Sub ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值