Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 模糊的问题:是将命名范围传递给函数更好,还是只在函数中重新定义命名范围更好?_Excel_Vba - Fatal编程技术网

Excel 模糊的问题:是将命名范围传递给函数更好,还是只在函数中重新定义命名范围更好?

Excel 模糊的问题:是将命名范围传递给函数更好,还是只在函数中重新定义命名范围更好?,excel,vba,Excel,Vba,不完全确定如何提问: 我在sub中使用了一个命名范围,并将在函数中使用相同的命名范围 我应该将命名范围作为参数传递给函数还是仅传递给 是否在函数中重新定义命名范围 我不需要立即在函数中操作命名范围-只需要在函数中使用命名范围(请参阅代码段) 一个模糊的问题,所以我将尝试定义一些标准来判断哪个“更好”: 代码可读性 执行速度 代码的安全性?(例如,如果您不希望人们能够“看到”您的隐藏代码) 其他标准 选项1:将范围作为参数传递 选项2:重新定义函数中的范围 与编程中的许多事情一样,答案是相当令

不完全确定如何提问:

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

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

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

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

  • 代码可读性
  • 执行速度
  • 代码的安全性?(例如,如果您不希望人们能够“看到”您的隐藏代码)
  • 其他标准
选项1:将范围作为参数传递

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


与编程中的许多事情一样,答案是相当令人失望的“视情况而定”

您需要一个
函数
过程将其依赖项作为(
ByVal
)参数,然后使用它们计算并将结果返回给调用者。如果一个函数这样做对全局状态没有任何副作用,你可以称它为纯函数!在
Sub
过程中,您还将尽可能多地将依赖项作为参数。尽管:


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

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


在这个级别上,性能不是一个问题;如果出现瓶颈,很可能不是因为您正在传递参数。

啊,是的-我将编辑代码。只是为了解释,快速地重新输入了一些伪代码在这个场景中,我将使用选项2,但在调用TestFunction之前删除前2行,因为编程中有很多事情,答案是一个相当令人失望的“视情况而定”。您需要一个
函数
过程将其依赖项作为(
ByVal
)参数,然后使用它们计算并将结果返回给调用者。如果一个函数这样做对全局状态没有任何副作用,你可以称它为纯函数!在
Sub
过程中,您还将尽可能多地将依赖项作为参数。尽管如此:
foo=GetFoo(42)
MsgBox“hello”
…另一方面,假设您有一个过程,可以创建一个工作表并自动化页面页眉和页脚中的某些内容:您正在生成一个对象(
wb.Worksheets.Add
),并将其捕获到一个局部变量中-
Set sheet=wb.Worksheets.Add
,…其中,
wb
也可能是一个参数。或者您正在编写一些查找或平均函数,并且您需要使用局部变量来增强代码的可读性和总体抽象级别。底线可能是,对过程的实现细节使用局部变量,对依赖项使用参数。本地人好,全球人坏=)@mathieuguindon:你可能想把这作为一个答案?太棒了。以简洁的细节回答我的问题,以证明论点的合理性。
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
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
foo = GetFoo(42)
MsgBox "hello"