使用WorkSheetFunction运行Excel的OFFSET会导致错误438

时间:2018-01-09 22:21:19

标签: excel vba excel-vba

我的主要目标是创建一个自动调整大小的命名范围。

执行此操作的常用方法是在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调用此函数吗?

3 个答案:

答案 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)")

但是这个会慢一点。