excel - 如何测试 Excel VBA 范围变量对整个列的引用?

标签 excel vba

有哪些方法可以测试 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")

我尝试过几种方法来做到这一点,每种方法都有道理,但都有缺点。该代码包含用于搜索具有数千行的工作表中的单元格的循环,因此速度至关重要。

这是我能想到的三种方法,但我想知道是否还有其他方法..?

  1. 最简单且最快的方法是计算行数。如果 Range(x).Rows.Count=1048576,则为工作表中的最大行数。但是,如果实际行数恰好是该数字,或者万一有多个重叠区域/范围,则此方法将不起作用 所有这些加起来就是这个数字。两者都不太可能,但有可能。此外,如果 Excel 版本发生变化,该数字也会发生变化,从而导致代码损坏。

  2. 使用正则表达式匹配 Range.Address(False,False) 的文本,其模式如 ([A-Z]{1,3}):([A-Z]{1,3} )。我认为这在速度范围上是中等的。

  3. 使用 VBA 循环、If-Then 以及 InStr()Mid() 等字符串函数来选择Range.Address(False,False) 的文本。我认为这将是最慢的方法。

最佳答案

您可以通过检查 Range.AddressRange.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/

相关文章:

r - 与 excel 和手动计算相比,为什么使用 R 得到不同的单向方差分析输出?

vba - VB 与 VBA 有什么区别?

excel - 检查excel 2010 vba中是否存在目录

excel - Worksheet.Activate 不会触发 Worksheet_Activate 事件

vba - 如何使用 Excel VBA 代码在工作表的列中查找确切的文本字符串

excel - 日期 'DD' 未在日期中返回 '0'

arrays - Excel公式返回最小值,考虑到空单元格

vba - 使用 Excel VBA 将 Excel 文档上传到 Google Drive 上的共享文件夹?

excel - 比较列与范围并在 VBA 中的多个工作表之间删除

excel - 将Excel公式转换为VBA函数