VBA 使用函数 return 值而不是变量
VBA using function return values instead of variables
我尝试在互联网上搜索这个由两部分组成的场景的明确答案,但没有找到任何结论。我在 Access 和 Excel 中编写 VBA 程序已有一段时间了,在尝试简化一些代码时,我遇到了一些难题
第一部分是关于对 return 对象使用函数。下面的示例通常是我在网上看到的 return 和 ADODB.Recordset 的函数(我已经简化了代码,因此没有错误处理等)。
Public Function CreateADORecordset(SQL As String, Connection As ADODB.Connection) As ADODB.Recordset
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
Call rst.Open(SQL, Connection)
Set CreateADORecordset = rst
End Function
问题的第一部分是,为什么我需要一个名为 rst 的变量,而我可以将函数重写为:
Public Function CreateADORecordset(SQL As String, Connection As ADODB.Connection) As ADODB.Recordset
Set CreateADORecordset = New ADODB.Recordset
Call CreateADORecordset.Open(SQL, Connection)
End Function
上面的函数重写有什么根本性的错误吗?由于函数return是一个ADO记录集,为什么要单独声明一个变量?
我可以更进一步:
Public Function CreateADOConnection(ConnectionString As String) As ADODB.Connection
Set CreateADOConnection = New ADODB.Connection
Call CreateADOConnection.Open(ConnectionString)
End Function
Public Function CreateADORecordset(SQL As String, ConnectionString As String) As ADODB.Recordset
Set CreateADORecordset = New ADODB.Recordset
Call CreateADORecordset.Open(SQL, CreateADOConnection(ConnectionString))
End Function
同样,通过 Dim 使用函数 return 对象而不是在过程中声明对象,这是一件特别糟糕的事情吗?
总的来说,我一直在编写 VBA 代码以通过 GetRows 将记录集的内容传输到 Excel 范围.函数声明行是:
Public Sub TransferRecordsetArray(GetRows As Variant, Destination As Range)
由于 TransferRecordsetArray 工作正常,我没有包含代码。
我现在所处的困境是在这种情况下,我已经到了不需要为代码声明任何变量的地步 运行 正确而且我不确定有多少这在函数方面是好事还是坏事 returning 对象、范围和变量等
为了 运行 代码正确,我只需要没有变量的两行之一:
Call TransferRecordsetArray(CreateADOConnection(ConnectionString).Execute(SQL).GetRows, Target)
或
Call TransferRecordsetArray(CreateADORecordset(SQL, CreateADOConnection(ConnectionString)).GetRows, Target)
如有任何 advice/recommendations 以这种方式编写 VBA 代码,我们将不胜感激。我已经使用任务管理器来关注这两种方法的内存使用情况,它似乎并没有太大的不同,而且 VBA 似乎在一段时间后破坏了函数 return 对象,尽管它们没有通过将它们设置为 Nothing.
来明确销毁
非常感谢。
The first part of the question is, why do I need a variable called rst when I could rewrite the function as this
Public Function CreateADORecordset(SQL As String, Connection As ADODB.Connection) As ADODB.Recordset
Set CreateADORecordset = New ADODB.Recordset
Call CreateADORecordset.Open(SQL, Connection)
End Function
您不需要单独的变量。您的代码非常好。
I can take this a step further:
Public Function CreateADOConnection(ConnectionString As String) As ADODB.Connection
Set CreateADOConnection = New ADODB.Connection
Call CreateADOConnection.Open(ConnectionString)
End Function
Public Function CreateADORecordset(SQL As String, ConnectionString As String) As ADODB.Recordset
Set CreateADORecordset = New ADODB.Recordset
Call CreateADORecordset.Open(SQL, CreateADOConnection(ConnectionString))
End Function
是的,绝对是。没有错。
I've reached a point where I don't need to declare any variables for the code to run correctly
恭喜,继续加油。 :)
进一步阅读:Is there a need to set Objects to Nothing
我尝试在互联网上搜索这个由两部分组成的场景的明确答案,但没有找到任何结论。我在 Access 和 Excel 中编写 VBA 程序已有一段时间了,在尝试简化一些代码时,我遇到了一些难题
第一部分是关于对 return 对象使用函数。下面的示例通常是我在网上看到的 return 和 ADODB.Recordset 的函数(我已经简化了代码,因此没有错误处理等)。
Public Function CreateADORecordset(SQL As String, Connection As ADODB.Connection) As ADODB.Recordset
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
Call rst.Open(SQL, Connection)
Set CreateADORecordset = rst
End Function
问题的第一部分是,为什么我需要一个名为 rst 的变量,而我可以将函数重写为:
Public Function CreateADORecordset(SQL As String, Connection As ADODB.Connection) As ADODB.Recordset
Set CreateADORecordset = New ADODB.Recordset
Call CreateADORecordset.Open(SQL, Connection)
End Function
上面的函数重写有什么根本性的错误吗?由于函数return是一个ADO记录集,为什么要单独声明一个变量?
我可以更进一步:
Public Function CreateADOConnection(ConnectionString As String) As ADODB.Connection
Set CreateADOConnection = New ADODB.Connection
Call CreateADOConnection.Open(ConnectionString)
End Function
Public Function CreateADORecordset(SQL As String, ConnectionString As String) As ADODB.Recordset
Set CreateADORecordset = New ADODB.Recordset
Call CreateADORecordset.Open(SQL, CreateADOConnection(ConnectionString))
End Function
同样,通过 Dim 使用函数 return 对象而不是在过程中声明对象,这是一件特别糟糕的事情吗?
总的来说,我一直在编写 VBA 代码以通过 GetRows 将记录集的内容传输到 Excel 范围.函数声明行是:
Public Sub TransferRecordsetArray(GetRows As Variant, Destination As Range)
由于 TransferRecordsetArray 工作正常,我没有包含代码。
我现在所处的困境是在这种情况下,我已经到了不需要为代码声明任何变量的地步 运行 正确而且我不确定有多少这在函数方面是好事还是坏事 returning 对象、范围和变量等
为了 运行 代码正确,我只需要没有变量的两行之一:
Call TransferRecordsetArray(CreateADOConnection(ConnectionString).Execute(SQL).GetRows, Target)
或
Call TransferRecordsetArray(CreateADORecordset(SQL, CreateADOConnection(ConnectionString)).GetRows, Target)
如有任何 advice/recommendations 以这种方式编写 VBA 代码,我们将不胜感激。我已经使用任务管理器来关注这两种方法的内存使用情况,它似乎并没有太大的不同,而且 VBA 似乎在一段时间后破坏了函数 return 对象,尽管它们没有通过将它们设置为 Nothing.
来明确销毁非常感谢。
The first part of the question is, why do I need a variable called rst when I could rewrite the function as this
Public Function CreateADORecordset(SQL As String, Connection As ADODB.Connection) As ADODB.Recordset Set CreateADORecordset = New ADODB.Recordset Call CreateADORecordset.Open(SQL, Connection) End Function
您不需要单独的变量。您的代码非常好。
I can take this a step further:
Public Function CreateADOConnection(ConnectionString As String) As ADODB.Connection Set CreateADOConnection = New ADODB.Connection Call CreateADOConnection.Open(ConnectionString) End Function Public Function CreateADORecordset(SQL As String, ConnectionString As String) As ADODB.Recordset Set CreateADORecordset = New ADODB.Recordset Call CreateADORecordset.Open(SQL, CreateADOConnection(ConnectionString)) End Function
是的,绝对是。没有错。
I've reached a point where I don't need to declare any variables for the code to run correctly
恭喜,继续加油。 :)
进一步阅读:Is there a need to set Objects to Nothing