当在UDF内部设置时,select一个范围内的单元格range.cell

我已经创build了一个UDF,它工作得很好。 但是,如果第二个范围没有被提交(这是可选的),它将被设置为UDF内的范围。 如果我现在尝试直接返回一个单元格的范围,我需要添加.Cells范围以select单元格(x, y)

如果没有提交范围,则可以这样做:

 Set optional_range = required_range.Columns(2) Set required_range = required_range.Columns(1) 

如果我以后在UDF想要从optional_range输出一个单元格我得到这个行为:

 Set MyFunction = optional_range(x, y) 'cell shows #VALUE Set MyFunction = optional_range.Cells(x, y) 'shows correct value 

但是.Cells :如果optional_range直接从公式中得到一个范围,它也显示正确的值,而不使用.Cells

我根本找不到这种行为的原因。 有人能告诉我为什么发生这种情况?
完整的代码可以在这里find。

您的错误发生是由于将Range_Columns属性设置为optional_range ,然后尝试将其分割为单独的Range.Cells对象。 Range.Columns和Range.Rows属性属性与Range对象共享许多方法,但这不是其中之一。

解决方法是简单地明确地设置.Cell(2)的.Cells的optional_range。

 Set optional_range = required_range.Columns(2).Cells 'optional truncation to the worksheet's .UsedRange Set optional_range = Intersect(required_range.Parent.UsedRange, required_range.Columns(2)) 

我已经添加了一种方法来截断.Columns(2)向下到Worksheet.UsedRange属性 。 把它看作SUMIF与SUMPRODUCT的全列引用; 如果你打算在optional_range中遍历单元格,那么特别有用。 没有必要添加.Cells到这个; Intersect方法返回交集中的单元格作为真正的Range对象 。