有哪些方法可以测试 Excel VBA 范围变量对整个列的引用?
我正在使用 Excel 2007 VBA,通过 For-Each 循环迭代 Range 变量。范围作为参数传递到函数中。对单个单元格、单元格范围和整行的引用都可以。
例如,这些是 okiedokie:
Range("A1") 'One cell
Range("A1:D4") 'Range of cells.
Range("10:20") 'Entire rows 10 through 20.
但是,如果任何范围引用了整个列,则会将函数拖到急速停止的位置。例如,这些不是 okiedokie,需要对其进行测试并避免:
Range("A:A")
Range("A:Z")
Range("AA:ZZ")
我尝试过几种方法来做到这一点,每种方法都有道理,但都有缺点。该代码包含用于搜索具有数千行的工作表中的单元格的循环,因此速度至关重要。
这是我能想到的三种方法,但我想知道是否还有其他方法..?
最简单且最快的方法是计算行数。如果
Range(x).Rows.Count=1048576
,则为工作表中的最大行数。但是,如果实际行数恰好是该数字,或者万一有多个重叠区域/范围,则此方法将不起作用 所有这些加起来就是这个数字。两者都不太可能,但有可能。此外,如果 Excel 版本发生变化,该数字也会发生变化,从而导致代码损坏。使用正则表达式匹配 Range.Address(False,False) 的文本,其模式如
([A-Z]{1,3}):([A-Z]{1,3} )
。我认为这在速度范围上是中等的。使用 VBA 循环、
If-Then
以及InStr()
和Mid()
等字符串函数来选择Range.Address(False,False)
的文本。我认为这将是最慢的方法。
最佳答案
您可以通过检查 Range.Address
与 Range.EntireColumn.Address
来测试范围是否是对列的引用,如下所示:
If Range("AA:ZZ").Address = Range("AA:ZZ").EntireColumn.Address Then
'This returns True
End If
If Range("AA1:ZZ4").Address = Range("AA1:ZZ4").EntireColumn.Address Then
'This returns False
End If
关于excel - 如何测试 Excel VBA 范围变量对整个列的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51051802/