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