首页 > 解决方案 > 模糊的问题:将命名范围传递给函数还是重新定义函数中的命名范围更好?

问题描述

不完全确定如何问这个:

我有一个在 sub 中使用的命名范围,并将在函数中使用相同的命名范围。

我应该将命名范围作为参数传递给函数还是只在函数中重新定义命名范围?

我不需要立即在函数中操作命名范围 - 只需要在函数中使用命名范围(参见代码片段)

模糊的问题,所以我将尝试定义一些标准来判断哪个“更好”:

选项 1:将范围作为参数传递

Dim rRng as Range
Set rRng = Sheet3.Range ("aNamedRange")

Call TestFunction (rRng)

'Here's what the function "TestFunction" would look like
Function TestFunction (rRange as Range)

rRange (1,1) = "blah"
End Function

选项 2:重新定义函数范围

Dim rRng as Range
Set rRng = Sheet3.Range ("aNamedRange")

Call TestFunction

'Here's what the function "TestFunction" would look like
Function TestFunction ()

Dim rRange as Range
Set rRange = Sheet3.Range ("aNamedRange")

rRange (1,1) = "blah"
End Function

标签: excelvba

解决方案


与编程中的许多许多事情一样,答案是一个相当令人失望的“它取决于”。

您希望一个Function过程在 as ( ByVal) 参数中获取其依赖关系,然后使用它们计算并将结果返回给调用者。如果一个函数在没有对全局状态产生任何副作用的情况下做到这一点,你就可以称它为函数!在一个Sub过程中,您还将尽可能地将您的依赖项作为参数。虽然不需要Call关键字:

foo = GetFoo(42)
MsgBox "hello"

...另一方面,假设您有一个过程可以创建一个工作表并自动执行页眉和页脚中的某些事情:您正在生成一个对象 ( wb.Worksheets.Add) 并将其捕获到一个局部变量 - Set sheet = wb.Worksheets.Add, ...wherewb也可能是一个参数。或者您可能正在编写一些查找或平均函数,并且您需要局部变量来增强代码的可读性和整体抽象级别。底线可能是,为您的过程的实现细节使用本地变量,为您的依赖项使用参数。当地人好,全球人邪恶=)

至于“安全”子弹……。编写代码以供阅读 - 代码运行,但您不是为计算机编写;您正在为自己编写代码以便能够阅读、理解、维护和扩展 - VBA 有很好的(商业)混淆器,但这是代码分发的一个问题,它应该与您将如何编写它,以及(或您的继任者?)未来将如何使用该代码。

在那个级别上,性能不是问题。如果存在瓶颈,则很可能不是因为您正在传递参数。


推荐阅读