이 글은 도움말을 번역한 글입니다.
달리 지정하지 않는 한 모든 인수는 참조로 프로시저에 전달됩니다.
Sub ExampleProcedure(num As Integer)
num = num * 2
End Sub
Sub Main()
Dim x As Integer
x = 10
ExampleProcedure x
MsgBox x ' 출력 결과: 20
End Sub
이는 참조에 의해 전달되는 모든 인수가 인수의 데이터 유형에 관계없이 프로시저 내에서 전달되는 데 동일한 시간과 동일한 공간(4바이트)이 걸리기 때문에 효율적입니다.
프로시저 선언에 ByVal 키워드를 포함하면 값으로 인수를 전달할 수 있습니다.
Sub ExampleProcedure(ByVal num As Integer)
num = num * 2
End Sub
Sub Main()
Dim x As Integer
x = 10
ExampleProcedure x
MsgBox x ' 출력 결과: 10
End Sub
값으로 전달되는 인수는 인수의 데이터 유형에 따라 프로시저 내에서 2–16바이트를 사용합니다. 큰 데이터 유형은 작은 유형보다 값을 전달하는 데 약간 더 오래 걸립니다.
Sub ExampleProcedure(ByVal str As String, ByVal num As Integer)
' 프로시저 내에서 인수의 값을 변경하지 않으므로 ByVal을 사용합니다.
str = "Hello, World!" ' String 데이터 유형은 크기가 크기 때문에 값으로 전달하는 데 약간의 오버헤드가 발생할 수 있습니다.
num = num * 2 ' Integer 데이터 유형은 크기가 작기 때문에 값으로 전달하는 데 더 적은 오버헤드가 발생합니다.
End Sub
Sub Main()
Dim text As String
text = "Hi"
Dim value As Integer
value = 10
ExampleProcedure text, value
' 값으로 전달된 인수들은 프로시저 내에서 값이 변경되지 않으므로 원래 변수에 영향을 주지 않습니다.
Debug.Print text ' 출력 결과: "Hi" (프로시저 내에서 변경되지 않음)
Debug.Print value ' 출력 결과: 10 (프로시저 내에서 변경되지 않음)
End Sub
이 때문에 String 및 Variant 데이터 형식은 일반적으로 값으로 전달하면 안 됩니다.
Sub ExampleProcedure(ByVal str As String, ByVal var As Variant)
' 프로시저 내에서 인수의 값을 변경하지 않으므로 ByVal을 사용합니다.
str = "Hello, World!" ' String 데이터 유형은 크기가 크기 때문에 값으로 전달하는 데 약간의 오버헤드가 발생할 수 있습니다.
var = "Modified Variant" ' Variant 데이터 유형 역시 크기가 크기 때문에 값으로 전달하는 데 약간의 오버헤드가 발생할 수 있습니다.
End Sub
Sub Main()
Dim text As String
text = "Hi"
Dim value As Variant
value = "Original Variant"
ExampleProcedure text, value
' 값으로 전달된 String과 Variant 인수들은 프로시저 내에서 값이 변경되지 않으므로 원래 변수에 영향을 주지 않습니다.
MsgBox text ' 출력 결과: "Hi" (프로시저 내에서 변경되지 않음)
MsgBox value ' 출력 결과: "Original Variant" (프로시저 내에서 변경되지 않음)
End Sub
인수를 값으로 전달하면 원래 변수가 복사됩니다. 프로시저 내의 인수에 대한 변경 사항은 원래 변수에 다시 반영되지 않습니다.
Function Factorial(ByVal MyVar As Integer) As Integer
MyVar = MyVar - 1
If MyVar = 0 Then
Factorial = 1
Exit Function
End If
Factorial = Factorial(MyVar) * (MyVar + 1)
End Function
Sub CalculateFactorial()
Dim S As Integer
S = 5
Dim result As Integer
result = Factorial(S)
Debug.Print "The factorial of " & S & " is " & result
Debug.Print "The original value of S is " & S
End Sub
' 출력 결과
' The factorial of 5 is 120
' The original value of S is 5
ByVal을 함수 선언에 포함하지 않은 경우, 앞선 Print 문에서는 1과 0을 출력합니다. 이는 Factorial 함수가 MyVar을 1씩 감소시켜 0이 될 때까지 계속 참조하기 때문입니다.
Function Factorial(ByRef MyVar As Integer) As Integer
MyVar = MyVar - 1
If MyVar = 0 Then
Factorial = 1
Exit Function
End If
Factorial = Factorial(MyVar) * (MyVar + 1)
End Function
Sub CalculateFactorial()
Dim S As Integer
S = 5
Dim result As Integer
result = Factorial(S)
Debug.Print "The factorial of " & S & " is " & result
Debug.Print "The original value of S is " & S
End Sub
' 출력 결과
' The factorial of 0 is 1
' The original value of S is 0
도움말 출처
Passing arguments efficiently (VBA)
Office VBA reference topic
learn.microsoft.com
'언어 참조' 카테고리의 다른 글
For Each...Next 문 (0) | 2023.08.04 |
---|---|
For...Next 문 (0) | 2023.08.04 |
매개변수 배열 이해 (0) | 2023.08.04 |
명명된 인수 및 선택적 인수 이해 (0) | 2023.08.03 |
배열 선언 및 사용 (0) | 2023.08.01 |