私有子可以将新创建的变量传递给 main() 吗?
Posted
技术标签:
【中文标题】私有子可以将新创建的变量传递给 main() 吗?【英文标题】:Can private sub pass newly created variable to main()? 【发布时间】:2017-05-21 22:11:59 【问题描述】:私有子程序是否可以在从主程序接收到值后与主程序在同一模块中,创建新变量并将其传递回主程序?
这是我想要做的,但我遇到了一些困难。 例如,在下面的 testSUB 中,我更改了字符串。我可以将 extraSTRING 和 newSTRING 传回 main 吗?任何示例都会有所帮助。
Module module1
Sub main()
Dim l As String
Dim I As Long = 1
Dim A As String
testsub(l, A, I)
End Sub
Private Sub testSub(l As String, A As String, I As Long)
Dim extraSTRING As String = "extraTEXT"
Dim newSTRING As String = l & extraSTRING
End Sub
End Module
【问题讨论】:
在这个例子中你不清楚你在追求什么。但是,您可以将 testSub 变成一个函数并以这种方式返回一些东西。或者您可以使用ByRef 传递的参数。 @Jinx88909 :在我看来这就是他想要的。你应该用这两个选项写一个答案。 @VisualVincent 作为答案发布。在我的手机上,所以希望我没有犯任何错误。没那么容易:) 当子例程接受参数时,它可以通过 2 种方式中的 1 种方式进行 - Byref 或 byval。 Byval 是默认值,意味着您传递的值将被复制到内存中。 Byref 表示要传递一个内存地址或指针。当子例程作用于参考值时,调用者会固有地注意到对该值的修改。 @Jinx88909 已经回答了你的问题。或者,您可以简单地编写一个函数而不是一个子函数。 Private 声明意味着它仅在该模块内可用。 @Jinx88909 :嘿,我几乎所有的答案都是用手机写的。 ;) 【参考方案1】:要返回一个值,您可以将 Sub
转换为 Function
:
Private Function testFunction (ByVal arg1 As String) As String
Return arg1 & " and some more text"
End Function
要调用上述Function
并分配返回的值,请使用以下代码:
Dim a As String = testFunction("some text")
'Output:
'a = "some text and some more text"
下面是带有输出的代码截图:
您也可以使用ByRef:
指定以这样一种方式传递参数,即被调用的过程可以更改调用代码中参数基础的变量的值。
ByRef
与 ByVal 略有不同:
指定以这样一种方式传递参数,即被调用的过程或属性不能更改调用代码中参数基础的变量的值。
以下是一些示例代码,向您展示了操作上的差异:
Module Module1
Sub Main()
Dim a As Integer = 0
Dim b As Integer = 0
Dim c As Integer = 0
testSub(a, b, c)
'Output:
'a = 0
'b = 0
'c = 3
End Sub
Private Sub testSub(arg1 As Integer, ByVal arg2 As Integer, ByRef arg3 As Integer)
arg1 = 1
arg2 = 2
arg3 = 3
End Sub
End Module
通过在VB.NET
中不指定modifier
(如上面的arg1
所示),默认情况下编译器将使用ByVal
。
这里需要注意的是,虽然
VB.NET
在未指定的情况下默认使用ByVal
,但VBA
不使用,而是默认使用ByRef
。如果您将代码从一个端口移植到另一个端口,请注意这一点。
下面是带有输出的代码截图:
以您的代码为例:
Sub main()
Dim l As String
Dim A As String
Dim I As Long = 1
testSub(l, A, I)
End Sub
要传递变量 l
、A
和 I
并更改它们的值,您需要更改方法以使用修饰符 ByRef
。
Private Sub testSub(ByRef l As String, ByRef A As String, ByRef I As Long)
l = "TEXT"
A = "extra" & l
I = 100
End Sub
下面是带有输出的代码截图:
【讨论】:
感谢您的示例。 感谢您的展示。它说得很清楚,它确实回答了我的问题。以上是关于私有子可以将新创建的变量传递给 main() 吗?的主要内容,如果未能解决你的问题,请参考以下文章