excel - 模糊的问题:将命名范围传递给函数还是重新定义函数中的命名范围更好?
问题描述
不完全确定如何问这个:
我有一个在 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
解决方案
与编程中的许多许多事情一样,答案是一个相当令人失望的“它取决于”。
您希望一个Function
过程在 as ( ByVal
) 参数中获取其依赖关系,然后使用它们计算并将结果返回给调用者。如果一个函数在没有对全局状态产生任何副作用的情况下做到这一点,你就可以称它为纯函数!在一个Sub
过程中,您还将尽可能地将您的依赖项作为参数。虽然不需要Call
关键字:
foo = GetFoo(42)
MsgBox "hello"
...另一方面,假设您有一个过程可以创建一个工作表并自动执行页眉和页脚中的某些事情:您正在生成一个对象 ( wb.Worksheets.Add
) 并将其捕获到一个局部变量 - Set sheet = wb.Worksheets.Add
, ...wherewb
也可能是一个参数。或者您可能正在编写一些查找或平均函数,并且您需要局部变量来增强代码的可读性和整体抽象级别。底线可能是,为您的过程的实现细节使用本地变量,为您的依赖项使用参数。当地人好,全球人邪恶=)
至于“安全”子弹……不。编写代码以供阅读 - 代码运行,但您不是为计算机编写;您正在为自己编写代码以便能够阅读、理解、维护和扩展 - VBA 有很好的(商业)混淆器,但这是代码分发的一个问题,它应该与您将如何编写它,以及您(或您的继任者?)未来将如何使用该代码。
在那个级别上,性能不是问题。如果存在瓶颈,则很可能不是因为您正在传递参数。
推荐阅读
- python-3.x - 数据流 ReadFromMongoDB 因依赖错误而失败
- linux - 如何在curl中自动恢复文件特定部分的中断下载?
- python - 将 Pandas DataFrame 转换为布尔列表
- c# - 将数组的内容输出到 C# 中的文本文件
- c# - 我该如何解决“对象引用未设置为对象的实例。” 在西装外套?
- excel - 在饼图中定位数据标签
- javascript - 如何让我的背景视频全屏响应?
- python - 杂项统计数据的网络抓取 NBA 参考
- c# - 如何演示excel鼠标移动?
- javascript - TestCafe:.navigateTo 方法访问的 URL 长度是否有限制?