在 UDF 中设置时,在需要 range.cell 的范围内选择一个单元格
Posted
技术标签:
【中文标题】在 UDF 中设置时,在需要 range.cell 的范围内选择一个单元格【英文标题】:Pick one cell in range need range.cell when set inside a UDF 【发布时间】:2015-12-19 03:35:15 【问题描述】:我创建了一个运行良好的 UDF。但是,如果未提交第二个范围(它是可选的),它将被设置为 UDF 内的范围。
如果我现在尝试直接返回一个单元格的范围,我需要将.Cells
添加到范围以选择具有(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 设置为.Columns
,而不是像传入一个范围那样的范围。您可以使用 Set optional_range = required_range.Columns(2).Cells
绕过第二个。
所以我又学到了一些新东西......非常感谢:)
【参考方案1】:
您的错误是由于将 optional_range 设置为 Range.Columns 属性,然后尝试将其拼凑成单独的 Range.Cells 对象。 Range.Columns 和Range.Rows 属性属性与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 的方法。将其视为具有完整列引用的 SUMIF 与 SUMPRODUCT;如果您计划遍历 optional_range 中的单元格,则特别有用。无需添加 .Cells ; Intersect method 将交叉点中的单元格返回为真正的Range object。
【讨论】:
以上是关于在 UDF 中设置时,在需要 range.cell 的范围内选择一个单元格的主要内容,如果未能解决你的问题,请参考以下文章
在 UINavigationController 中设置时图像不显示