我正在努力理解按值传递并在VB6中通过引用传递.我完全理解这些概念是面向对象的编程语言,如.NET和Java(我意识到Java没有通过引用传递).看看下面的代码:
Private Sub Form_Load()
Dim Test As Integer
Test = 1
TestFunction Test 'line 5
MsgBox (Test)
End Sub
Private Sub TestFunction(ByVal i As Integer)
i = i + 1
End Sub
Run Code Online (Sandbox Code Playgroud)
当我在第5行的Test周围放置括号时,消息框会按照我的预期打印1.现在看看下面的代码:
Private Sub Form_Load()
Dim Test As Integer
Test = 1
TestFunction Test 'line 5
MsgBox Test
End Sub
Private Sub TestFunction(ByRef i As Integer)
i = i + 1
End Sub
Run Code Online (Sandbox Code Playgroud)
消息框按照我的预期打印2.但是,如果在第5行添加括号,则消息框将打印1,这是我不希望的.即使被调用函数中定义的变量是ByRef,看起来调用函数也可以通过值传递.反之亦然,即如果被调用函数具有定义为ByVal的变量的签名,则它将始终为ByVal(即使调用函数中的变量周围没有括号).在VB6中,这背后的想法是什么?我意识到这是VB6中的一个基本问题,但它让我很困惑.我已经阅读了MSDN文档,我意识到这一切都是正确的,但它并没有解释它背后的原因.
我试图将两个字符串参数传递给Sub,但它不允许我这样做.我使用的方法如下.
Sub callByValue( str1 As String, str2 As String)
MsgBox str1
MsgBox str2
End Sub
Run Code Online (Sandbox Code Playgroud)
调用宏:
Dim s1, s2 As String
callByValue(s1,s2)
Run Code Online (Sandbox Code Playgroud)
在调用时callByvalue,它会抛出一个编译器错误.
在Excel电子表格后面的Visual Basic代码中,我有一个带参数的子例程.这是从另一个子程序调用的.
这是子程序声明:
Sub rowPasting(ByVal oldRow As Integer, ByVal newRow As Integer, ByVal oldSheet As Worksheet, ByVal newSheet As Worksheet)
Run Code Online (Sandbox Code Playgroud)
这是电话:
rowPasting(j,k,TTWorksheet,newSheet)
Run Code Online (Sandbox Code Playgroud)
我用作参数输入的所有变量都是有效的,因为在我尝试添加这个新的子程序之前,它们被用于程序的工作部分.
有关在调用中导致语法错误的原因的任何想法?
Public Sub SavePendleValues(ByVal row1 As Integer, ByVal row2 As Integer)
Run Code Online (Sandbox Code Playgroud)
打电话给它
For sheetrow = 2 To 15 ' number of rows to scan
SavePendleValues (sheetrow, sheetrow)
Next sheetrow
Run Code Online (Sandbox Code Playgroud)
得到错误: Compile error: Syntax error
当我取消注释该行时: SavePendleValues (sheetrow, sheetrow)
一切正常.