我的主要目标是创建一个自动调整大小的命名范围。
执行此操作的常用方法是在Excel中使用OFFSET
公式,并使用CountA
动态确定高度和/或宽度参数值。我想用VBA做到这一点。为简单起见,我退后一步,专注于让OFFSET
运行并返回一个范围。我有以下代码:
Public Function testfn()
Dim r As Range
On Error Resume Next
Set r = WorksheetFunction.Offset(Worksheets("MAIN").Range("H85"), 0, 0, 1, 2)
Debug.Print Err.Number
End Function
控制台中的输出为438
。我不确定是什么导致它,因为我明确指定了起始引用,其余值是硬编码整数。
请指出究竟是什么导致错误?可能是因为实际上不可能使用VBA调用此函数吗?
答案 0 :(得分:4)
要模仿=OFFSET(rng, offR, offC, sizeR, sizeC)
,您可以使用其中一个或两个:
rng.Offset(offR, offC)
和
rng.Resize(sizeR, sizeC)
或合并:
rng.Offset(offR, offC).Resize(sizeR, sizeC)
由于您实际上并未在此处进行抵消,因此您只需要:
Set r = Worksheets("MAIN").Range("H85").Resize(1, 2)
答案 1 :(得分:2)
这应该有效:
Set r = Worksheets("MAIN").Range("H85").Resize(1, 2)
答案 2 :(得分:1)
错误438代表:对象不支持此属性或方法。
(在调试时可能需要注释On Error Resume Next
以获取此信息。)
这意味着对象Offset
不支持方法WorksheetFunction
。这可能有点令人惊讶,因为它没有出现在根据Microsoft(See list)在VBA中不可用的功能列表中。
然而,它确实不可用,因为它不是这里列出的方法的一部分:
<强>备选方案:强>
正如Tim Williams已经建议的那样,使用Resize
对象的Range
方法是您尝试做的最简单的方法,但如果您更喜欢使用Offset
方法,你可以使用:
Dim r As Range, s As Range
Set s = Worksheets("MAIN").Range("H85")
Set r = Range(s, s.Offset(0, 1))
或者,您可以使用Evaluate
函数,如下所示:
Set r = Application.Evaluate("Offset('MAIN'!H5, 0, 0, 1, 2)")
但是这个会慢一点。