Function 如何从vba中的用户定义函数返回范围对象

Function 如何从vba中的用户定义函数返回范围对象,function,vba,object,range,Function,Vba,Object,Range,我在excel中有以下代码: Private Function RelCell(NmdRng as String) as Range Set RelCell = Range(NmdRng).Cells(1,1) End Function 它给出运行时错误“91”:未设置对象变量或with block变量 我真的不知道我的函数出了什么问题。有人出了问题吗?我不知道这是否是问题,但您只设置了范围,没有从函数返回任何内容 尝试将一个具有不同名称的范围变量声明为函数并返回该变量。实际上,您应该能够从U

我在excel中有以下代码:

Private Function RelCell(NmdRng as String) as Range
Set RelCell = Range(NmdRng).Cells(1,1)
End Function
它给出运行时错误“91”:未设置对象变量或with block变量


我真的不知道我的函数出了什么问题。有人出了问题吗?

我不知道这是否是问题,但您只设置了范围,没有从函数返回任何内容


尝试将一个具有不同名称的范围变量声明为函数并返回该变量。

实际上,您应该能够从UDF返回一个范围,如本文所述

以下是MVP给出的代码:

Function GetMeRange(rStartCell As Range, lRows As Long, iColumns As Integer) As Range
  Set GetMe = rStartCell.Resize(lRows, iColumns)  ' note the use of Set here since we are setting an object variable
End Function
(而且有效)

Tiago的评论指出了一件非常正确的事情,当您想要访问命名范围时,应该首先定义它。

您可以尝试在UDF中设置断点,查看是否定义了
范围(NmdRng)

您的命名范围已经附加了一个单元格引用,因此您不需要将
.Cells(1,1)
放在它的末尾

仅使用
.Range(nmdRng)
属性将返回您要查找的范围对象

尝试:


请重写您的代码并按如下方式进行测试:

Private Function RelCell(NmdRng as String) as Range
Dim TestRange As Range

Set TestRange=Range(NmdRng)
TestRange.Activate 'I think that error will occur here because, NmdRng is somehow invalid
Set RelCell = TestRange.Cells(1,1)
End Function

在即时窗口中,尝试使用
范围(NmdRng)。激活
,如果该范围真的有效,它将在Excel中被选中。我猜问题是因为VBA没有达到该范围(可能名称错误)。设置“以名称作为函数的变量”是指定VBA函数返回值的方式。我知道,我只是说我从未真正看到返回行中使用的实际Set关键字。我想它是可选的?在这种情况下,它是必需的。不这样做会引发错误,因为您正在返回对(范围)对象的引用。(请参阅)
Private Function RelCell(NmdRng as String) as Range
Dim TestRange As Range

Set TestRange=Range(NmdRng)
TestRange.Activate 'I think that error will occur here because, NmdRng is somehow invalid
Set RelCell = TestRange.Cells(1,1)
End Function