VBA每日一练(10)range.end() 或 cells().end() 用法,偏移 且 查找非空单元格,取最大最小行列数

 

 

增加一种数组的方法去取······

  • 二维数组边界
  • lbound(arr1,1)          第1维的下边界,excel里的最小行数
  • ubound(arr1,1)         第1维的上边界,excel里的最大行数
  • lbound(arr1,2)          第2维的下边界,excel里的最小列数
  • ubound(arr1,2)         第2维的上边界,excel里的最大行数

 

 

1 .end()  是先向指定方向偏移一格后,查找这个方向的最后一个非空单元格

原始数据

                                            VBA每日一练(10)range.end() 或 cells().end() 用法,偏移 且 查找非空单元格,取最大最小行列数_第1张图片

    (1,3) 1:00 AM 1:00 AM    
    2 B (2,4) 2 B    
    (3,3) 3 C (3,5)    
             
             

参考

https://www.jianshu.com/p/49b24de9bab6

 

基本语法

  • cells.end()    返回一个range对象,偏移 且 查找非空单元格
  • range.end()   返回一个range对象  ,偏移 且 查找非空单元格

 

  • cells.end(xltoleft)      1  等同于按 end+向左箭,或ctrl+向左箭,往左边偏移1,且找到最左边的非空单元格
  • cells.end(xltoright)    2   等同于按 end+向右箭,或ctrl+向右箭,往右边偏移1,且找到最右边的非空单元格
  • cells.end(xlup)          3  等同于按 end+向上箭,或ctrl+向上箭,往上偏移1,且找到最上的非空单元格
  • cells.end(xldown)     4   等同于按 end+向下箭,或ctrl+向下箭,往下偏移1,且找到最下的非空单元格

 

很多人喜欢用的经典用法,但很少人知道原理,下面有详细的分析

  • range("c65535").end(xlup).row  是得出C列的最后一个元素的行号
  •  

代码1:选择单元格是 range中间的某个,如 cells(2,4)--考虑偏移验证是对的

Sub jackma11()

Debug.Print Cells(2, 4).End(xlToLeft).Column
Debug.Print Cells(2, 4).End(xlToRight).Column

Debug.Print Cells(2, 4).End(xlUp).Row
Debug.Print Cells(2, 4).End(xlDown).Row

End Sub

VBA每日一练(10)range.end() 或 cells().end() 用法,偏移 且 查找非空单元格,取最大最小行列数_第2张图片

 

代码2:选择单元格是 range边缘的,如最后1行的cells(3,5)--考虑偏移验证是对的

 

Sub jackma11()

Debug.Print Cells(3, 5).End(xlToLeft).Column
Debug.Print Cells(3, 5).End(xlToRight).Column

Debug.Print Cells(3, 5).End(xlUp).Row
Debug.Print Cells(3, 5).End(xlDown).Row

End Sub

VBA每日一练(10)range.end() 或 cells().end() 用法,偏移 且 查找非空单元格,取最大最小行列数_第3张图片

 

代码3:选择单元格是 range边缘的,如第1列的 cells(1,3)--考虑偏移验证是对的

 

Sub jackma11()

Debug.Print Cells(1, 3).End(xlToLeft).Column
Debug.Print Cells(1, 3).End(xlToRight).Column

Debug.Print Cells(1, 3).End(xlUp).Row
Debug.Print Cells(1, 3).End(xlDown).Row

End Sub

 

 

代码4:选择单元格是 range边缘的,如第1列的 cells(3,3)--考虑偏移验证是对的

Sub jackma11()

Debug.Print Cells(3, 3).End(xlToLeft).Column
Debug.Print Cells(3, 3).End(xlToRight).Column

Debug.Print Cells(3, 3).End(xlUp).Row
Debug.Print Cells(3, 3).End(xlDown).Row

End Sub

 

 

2  经典用法

2.1  Range("c65536").End(xlUp).Row

  • 假设数据肯定填不满,所以 c65526是C列的最后一个元素,往上查空的区域,就能找到最后一个非空的C列的最后1个元素
  • [A65536].End(xlUp).row 中[A65536]是什么意思?
  • 在1995-2006年,excel工作簿包含65536行。
  • 但现在的office 2007中工作簿包含1048576行。[A65536]就是A列的最后一行的意思
  • 这段话的意思就是,从A列最后一行向上找,找到有数据的行为止。
Sub jackma11()

Debug.Print Range("c65536").End(3).Row


End Sub

 

  • [a65536].End(3)(1, 2)      表示a列,最后1个非空元素,(偏移)右边1格的元素
  • [a65536].End(3)(2, 1)      表示a列,最后1个非空元素,(偏移)下面1格的元素

 

 

3 如何正确的取range的 边界?最小最大行列数

range("") 做位移,以及end()时,都是以左上角单元格cells()

range("")=cells("左上角")

原始数据

           
           
           
           
           
           
    (1,3) 1:00 AM 1A  
    2 B (2,4) 2 B  
    (3,3) 3 C (3,5)  
           

                                                    VBA每日一练(10)range.end() 或 cells().end() 用法,偏移 且 查找非空单元格,取最大最小行列数_第4张图片

取最大行列数总结

  • range() =cells(左上角)  (只是部分功能上,不是全部!)
  • 所以区域内,有部分为空的话,找的 最大行,列等,可能位于range内部!!!!!!!因为是左上角为基准移动的
  • 一个range区域,做位移() 时,等同于 cells(左上角) 做位移
  • 一个range区域,  range(0.end(),等同于 cells(左上角).end()

 

  • 取自己区域的 最大列数,最大行数,直接可用  end(xltoright)  end(xldown)
  • 其实本身 end(xltoright) 也是从右边一格开始找起的!
  • 取自己区域的 最小列数,先平移到左边一格!  range()(0,1),然后再取最右边  range()(0,1).end(xltoright)
  • 最大行数,先平移到上面1格 ! range()(1,0),然后再取最下的非空单元格   range()(0,1).end(xldown)

 

Sub jackma101()

'这样取的边界是不对的
Debug.Print Range("c7:e9").End(1).Column
Debug.Print Range("c7:e9").End(2).Column
Debug.Print Range("c7:e9").End(xlUp).Row
Debug.Print Range("c7:e9").End(xlDown).Row
Debug.Print ""




'这样也不是取的 range的正确边界
Debug.Print Range("c7:e9")(1, -1).End(1).Column
Debug.Print Range("c7:e9").End(2).Column
Debug.Print Range("c7:e9")(-1, 1).End(xlUp).Row
Debug.Print Range("c7:e9").End(xlDown).Row
Debug.Print ""


'range的偏移,其实就是左上角单元格cell的偏移
'(1,1) 不偏移,(2,1)往下偏移1格,(0,1)往上偏移1格,(-1,1)往上偏移2格
'(1,1) 不偏移,(1,2)往右偏移1格,(1,0)往左 偏移1格,(1,-1)往上偏移2格
Debug.Print Range("c7:e9")(0, 1).Row
Debug.Print Range("c7:e9")(0, 1).Column
Debug.Print Range("c7:e9")(1, 0).Row
Debug.Print Range("c7:e9")(1, 0).Column
Debug.Print ""


'这样才是取的 range的正确边界,都用xltoright 和 xldown
Debug.Print Range("c7:e9")(1, 0).End(xlToRight).Column
Debug.Print Range("c7:e9").End(xlToRight).Column
Debug.Print Range("c7:e9")(0, 1).End(xlDown).Row
Debug.Print Range("c7:e9").End(xlDown).Row
Debug.Print ""


End Sub

 

 

 

 

 

你可能感兴趣的:(VBA)