在 UDF 中设置时,在需要 range.cell 范围内选择一个单元格
Pick one cell in range need range.cell when set inside a UDF
我创建了一个 UDF,它现在运行良好。但是,如果未提交第二个范围(它是可选的),它将被设置为 UDF 内的范围。
如果我现在尝试直接 return 一个单元格的范围,我需要将 .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
但如前所述:如果 optional_range
直接从公式中获取范围,它也显示正确的值而不使用 .Cells
。
我根本找不到这种行为的原因。谁能告诉我为什么会这样?
完整的代码可以在 here.
中找到
您的错误是由于将 optional_range 设置为 Range.Columns property and then attempting to piece it out into individual Range.Cells objects. The Range.Columns and Range.Rows property properties share many methods with a Range object 而发生的,但这不是其中之一。
解决方案是简单地将optional_range显式设置为.Columns(2)的.Cells。
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 property. Think of it as SUMIF vs. SUMPRODUCT with full column references; particularly helpful if you plan to loop through the cells in optional_range. No need to add .Cells to this; the Intersect method returns the cells in the intersection as a true Range object.
的方法
我创建了一个 UDF,它现在运行良好。但是,如果未提交第二个范围(它是可选的),它将被设置为 UDF 内的范围。
如果我现在尝试直接 return 一个单元格的范围,我需要将 .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
但如前所述:如果 optional_range
直接从公式中获取范围,它也显示正确的值而不使用 .Cells
。
我根本找不到这种行为的原因。谁能告诉我为什么会这样?
完整的代码可以在 here.
您的错误是由于将 optional_range 设置为 Range.Columns property and then attempting to piece it out into individual Range.Cells objects. The Range.Columns and Range.Rows property properties share many methods with a Range object 而发生的,但这不是其中之一。
解决方案是简单地将optional_range显式设置为.Columns(2)的.Cells。
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 property. Think of it as SUMIF vs. SUMPRODUCT with full column references; particularly helpful if you plan to loop through the cells in optional_range. No need to add .Cells to this; the Intersect method returns the cells in the intersection as a true Range object.
的方法