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