【发布时间】:2019-02-24 16:17:56
【问题描述】:
尝试在函数中使用命名范围作为参数,但当我在与命名范围所在位置不同的工作表中执行函数时遇到问题。
尝试在论坛中搜索但找不到解决方案,因为大多数帖子都有命名范围或工作表,其中相同的位置在 VBA 中硬编码。希望避免此限制,因为该函数应该与来自不同工作表的不同命名范围一起使用...
以下代码在与选定的命名范围相同的工作表中输入时可以正常工作。遗憾的是,当所选命名范围位于另一个工作表中时,它会崩溃(即使我使用的所有范围都是参数)是“工作簿的工作簿”)。
在这一行:
Set FullRange = NamedRange
已经尝试了一段时间,试图创建一个适用于任何工作表的参考,但不幸的是没有运气......
任何帮助将不胜感激!
概念是将命名范围声明为参数。反过来,该函数找到这个命名范围并从它的一部分创建一个新范围(参见SpecificRange)。最后,它使用来自这个新范围的数据执行某些计算。所有这些都可以正常工作,但只能在同一个工作表中......这是代码:
Function myResult(NamedRange As Range, Vessel As String, FromDate As Date, ToDate As Date)
'declare variables in addition to the function parameters declared above
Dim SpecificRange As Range
Dim FullRange As Range
Dim Result As Double
Dim i As Byte
'find the row within the declared "NamedRange" range which contains information for the declared "Vessel"
Set FullRange = NamedRange
Set SpecificRange = Range(FullRange.Find(Vessel, , xlValues, xlWhole).Address, FullRange.Find(Vessel, , xlValues, xlWhole).Offset(0, FullRange.Columns.Count - 1).Address)
i = 1
Result = 0
For i = 1 To FullRange.Columns.Count - 2
If FullRange(2, i) = "Date" Then
With WorksheetFunction
Result = Result + .Max(0, .Min(ToDate, SpecificRange(1, i + 2).Value) - .Max(FromDate, SpecificRange(1, i).Value)) * SpecificRange(1, i + 1).Value
End With
End If
Next
myResult = Result
End Function
非常感谢!
+++++
要添加更多详细信息,请注意,当在与 NamedRange 所在位置不同的工作表中输入时,函数返回零 (0.00) 而不是错误。
另外,当我在 NamedRange 所在的工作表中(例如“Sheet1”)和(b)在另一个工作表(例如“Sheet2”)中具有完全相同的函数(a)时,然后,当我运行该函数时在 Sheet1 中,Sheet2 中的函数已正确更新!但是当我直接在 Sheet2 中运行该函数时,它返回零......
当相关工作表未激活时,它似乎无法找到 NamedRange...
这是截图:https://i.stack.imgur.com/RpHf3.png
命名范围由用户在函数中作为参数输入(见第一个参数) 函数中的第二个参数(即Vessel as String),指的是截图中的第一列。
因此,当用户输入公式时,该函数会找到 NamedRange,然后创建另一个范围(即 SpecificRange),该范围本质上是找到第二个参数的行(示例屏幕截图中的条件 4)。
那么这只是根据剩下的两个参数计算的问题,但这似乎与这个问题无关。
【问题讨论】: