【发布时间】:2018-12-05 16:49:58
【问题描述】:
有哪些方法可以测试 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)的文本。我认为这是最慢的方法。
【问题讨论】:
-
对于数字 1,不要硬编码行数,而是从
Range.Parent获取Rows.Count。另外,多个重叠行是什么意思? -
范围。对不起,我说错了,错了……打错了。我纠正了错字。我试图传达的是一个 Range 变量可以塞进很多东西。具体来说,许多 Area 对象。嗯......也许不是很多,我似乎记得在我的实验中,Range({string}) 中的字符串的限制是 255 个字符。但是任何人,考虑一下:
Range("A1:D4, B2:E5")。这两个范围重叠。确实,Excel 会修复它并将其分解为矩形区域对象而不重叠,但我的函数将接受任何输入,因此重叠是可能的。 -
感谢 Range.Parent.Rows.Count 的建议;这适用于获得最大行数。在此之后,我在 Debug 模式下浏览了 Locals,我发现可以通过几种不同的方式找到它。