VBA 프로세스 및 매개변수 상세 정보
15240 단어 VBA
VBA 프로세스 및 매개변수 상세 정보
VBA의 프로세스(Procedure)는 두 가지가 있는데 하나는 함수(Function), 다른 하나는 서브루틴(Subroutine)으로 각각 Function과 Sub 키워드를 사용합니다.그것들은 모두 파라미터를 얻고 일련의 문장을 실행하며 파라미터의 값을 바꾸는 독립적인 과정이다.Function 프로세스와 다른 점은 반환 값이 있는 Sub 프로세스는 표현식에 사용할 수 없다는 것입니다.
여기에는 주로 하위 프로그램의 사용 방법을 소개하는데, 마찬가지로 이 방법도 Function에 응용할 수 있다.
문법 [Private | Public | Friend] [Static] Sub name [(arglist)] [statements] [exit Sub] [statements] End Sub* [] 기호로 묶은 옵션은 선택 가능
[Private | Public | Friend] 이 세 가지 키워드는 역할 범위와 관련이 있습니다.Private는 이 과정은 본 모듈에서만 호출될 수 있음을 나타냅니다.이 키워드를 사용하면 메뉴'도구'->'매크로'->'매크로...'에서 이 과정을 볼 수 없습니다.Public은 다른 모듈에서도 이 과정에 접근할 수 있도록 공용을 표시합니다.Public, Private 또는 Friend 명시적 지정을 사용하지 않으면 Sub 프로세스는 기본적으로 공용입니다.공통 프로세스는 메뉴 도구 -> 매크로 -> 매크로... 에서 볼 수 있습니다.Friend는 클래스 모듈에 사용되며, 비교적 적게 사용되며, 여기에서는 소개하지 않습니다.Static는 정태적인 의미입니다. (Static으로 정적 변수를 설명하는 것을 기억할 수도 있습니다.) 그것을 사용하여 과정을 설명하면 이 과정에서 성명된 국부 변수가 다음에 이 과정을 호출할 때 원래의 값을 유지합니다.다음은 Static 성명 과정의 용법입니다.
Static Sub m1()
Dim i As Integer
Dim j As Integer
i = i + 1
j = j + 1
Debug.Print "i=" & i & " j=" & j
End Sub
Private Sub m2()
Dim i As Integer
Dim j As Integer
i = i + 1
j = j + 1
Debug.Print "i=" & i & " j=" & j
End Sub
Sub try1()
Dim i As Integer
Debug.Print " :"
For i = 1 To 10
Call m1
Next i
Debug.Print " :"
For i = 1 To 10
Call m2
Next i
End Sub
try1 프로세스를 실행하면 바로 창에서 결과를 볼 수 있습니다. =
다음은 사용 과정에서 주의해야 할 부분들이다.
매개 변수표arglist
문법: [Optional] [ByVal | ByRef] [ParamArray] varname[()] [As type] [= defaultvalue]
Optional은 이 매개 변수가 선택할 수 있음을 나타냅니다. 즉, 호출 과정에서 값을 전달하지 않아도 이 매개 변수에 값을 전달할 수 있습니다.defaultvalue를 이 매개 변수에 전달할 때 (예를 들어 optional iInput2 As Integer=13) 호출 과정에서 이 매개 변수에 값을 전달하지 않았을 때 이 defaultvalue를 기본적으로 사용합니다.Optional은 맨 뒤에 있는 매개 변수, 즉 어떤 매개 변수가 Optional을 사용하고 이 매개 변수 뒤에 있는 매개 변수도 Optional을 사용해야 한다.
Sub mmm(iInput1 As Integer, Optional iInput2 As Integer = 13, Optional iInput3 As Integer)
'iInput2 Optional ,iInput3 Optional
MsgBox "iInput1=" & iInput1 & vbCrLf & "iInput2=" & iInput2 & vbCrLf & "iInput3=" & iInput3
End Sub
Sub subTry()
' 3
Call mmm(23, 34, 2) 'iInput=23, iInput2=34, iInput3=2
' 3 , 2 , iInput2 13
Call mmm(23, , 2) 'iInput=23, iInput2=13, iInput3=2
' 2 3
Call mmm(23, 34) 'iInput=23, iInput2=34, iInput3=0
' 2 , 3
Call mmm(23) 'iInput=23, iInput2=12, iInput3=0
End Sub
Param Array의 사용법 Param Array는 arglist의 마지막 매개 변수에만 사용할 수 있습니다. 마지막으로 이 매개 변수는 Variant 유형 요소를 포함하는 Optional 수조입니다. 그러나 값을 과정에 전달할 때 쉼표를 사용하여 여러 개의 매개 변수를 분리합니다. 과정에서 몇 개의 매개 변수를 찾아 하나의 수조로 통합합니다.Param Array를 사용하는 장점은 일정한 수량과 일정한 유형의 매개 변수를 과정에 제공할 수 있다는 것이다.ParamArray는 ByVal, ByRef 또는 Optional과 함께 사용할 수 없습니다.
Sub m1(iInput1 As Integer, ParamArray argArr())
Dim strList As String
Dim i As Integer
strList = "iInput1=" & iInput1 & vbCrLf
For i = 0 To UBound(argArr)
On Error Resume Next
strList = strList & "argArr(" & i & ")=" & argArr(i) & vbCrLf
' ,
If Err.Description <> "" Then
strList = strList & "argArr(" & i & ")= " & vbCrLf
Err.Clear '
End If
Next i
MsgBox strList
End Sub
Sub try1()
Call m1(23, 24, 25) ' iInput=23, argArr(0)=24, argArr(1)=25
Call m1(23, 24, , 25) ' iInput=23, argArr(0)=24, argArr(1)= , argArr(2)=25
Call m1(23, 24, 64.4, 25, "data") ' iInput=23, argArr(0)=24, argArr(1)=64.4, argArr(2)=25, argArr(3)=data
End Sub
ByVal 및 ByRef VBA에서는 기본적으로 ByRef를 사용합니다.ByVal의 뜻은 값에 따라 파라미터를 전달하는 것이다. 값에 따라 전달하기 때문에 이 파라미터가 과정 중의 값에 변화가 있으면 그 영향의 범위는 이 과정 안에 있을 뿐이다.과정이 나오면 소용없다.한편, ByRef는 주소나 인용에 따라 전달되고 과정에 전달되는 실제는 이 수치의 주소이지 값 자체가 아니다. 과정에서 이 매개 변수를 바꾸는 것은 바로 이 주소의 값을 바꾸는 것이다. 그러면 과정 밖에서도 이 값이 바뀌는 것을 볼 수 있다.아래의 예를 실행하면 그 중의 차이를 볼 수 있다.
Sub mmm(ByVal iI1 As Integer, iI2 As Integer)
iI1 = iI1 + 10
iI2 = iI2 + 10
MsgBox "Inside: iI1=" & iI1 & " iI2=" & iI2
End Sub
Sub mySub()
Dim iI1 As Integer
Dim iI2 As Integer
iI1 = 10
iI2 = 12
MsgBox "Before: iI1=" & iI1 & " iI2=" & iI2
Call mmm(iI1, iI2)
MsgBox "After: iI1=" & iI1 & " iI2=" & iI2
'
' Before: iI1=10 iI2=12
' Before: iI1=20 iI2=22
' Before: iI1=10 iI2=22
' mmm iI1 iI2, iI1 , mmm iI1
' iI2 ,mmm iI2
End Sub
또한 매개 변수가 수조라면 인용에 따라 전달할 수 밖에 없습니다. 전달된 것은 사실상 수조의 첫 번째 요소의 주소이기 때문입니다.예를 들어 아래 코드의 사용법.
Sub GetArray(arrTemp() As Integer)
Dim i As Integer
For i = 0 To UBound(arrTemp)
Debug.Print "Item " & i & ": " & arrTemp(i)
Next i
End Sub
Sub PassArray()
Dim arrInt(3) As Integer
arrInt(0) = 1
arrInt(1) = 2
arrInt(2) = 3
arrInt(3) = 4
Call GetArray(arrInt)
'
' Item 0: 1
' Item 1: 2
' Item 2: 3
' Item 3: 4
End Sub
그러나 객체의 경우 ByVal을 사용하여 실제로 전달되는 것은 여전히 객체에 대한 참조이므로 이 과정에서 객체의 수정은 프로세스 외부 객체의 값이나 속성에 영향을 미칩니다.ByVal을 사용하여 전송된 객체에 값을 부여하는 새 객체 인스턴스를 작성하면 호출된 객체의 외부 속성이나 값에 영향을 주지 않습니다.ByRef를 사용하면 프로세스에서 전달된 객체에 객체를 부여하는 새 객체 인스턴스를 만들지만 프로세스 외부에서 객체의 속성이나 값에 영향을 미칩니다.
Sub TestByValByRef()
Dim objDic As Object
Set objDic = CreateObject("Scripting.Dictionary")
objDic(1) = 100
Debug.Print "byValueTest1"
Debug.Print " : objDic(1)=" & objDic(1)
Call byValTest1(objDic)
Debug.Print " : objDic(1)=" & objDic(1) & vbCrLf
objDic(1) = 100
Debug.Print "byValueTest2"
Debug.Print " : objDic(1)=" & objDic(1)
Call byValTest2(objDic)
Debug.Print " : objDic(1)=" & objDic(1) & vbCrLf
objDic(1) = 100
Debug.Print "byRefTest"
Debug.Print " : objDic(1)=" & objDic(1)
Call byRefTest(objDic)
Debug.Print " : objDic(1)=" & objDic(1)
End Sub
Private Sub byValTest1(ByVal c As Object)
Dim a As Object
Set a = CreateObject("Scripting.Dictionary")
a(1) = 200
Set c = a
End Sub
Private Sub byValTest2(ByVal c As Object)
c(1) = 200
End Sub
Private Sub byRefTest(ByRef c As Object)
Dim a As Object
Set a = CreateObject("Scripting.Dictionary")
a(1) = 200
Set c = a
End Sub
TestByValByRef를 실행하면 다음 결과가 즉시 창에 인쇄됩니다.
byValueTest1 원래 값: objDic (1) = 100 외부 값: objDic (1) = 100
byValueTest2 원래 값: objDic (1) = 100 외부 값: objDic (1) = 200
byRefTest 원래 값: objDic (1) = 100 외부 값: objDic (1) = 200
출처:http://www.360doc.com/content/10/0112/16/406571_13355136.shtml
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Excel VBA에서 SIR 모델을 구현합니다.신형 코로나 바이러스(COVID-19)의 환자수 추이를 나타내는 수리 모델 「SIR 모델」을 자주(잘) 보게 되었습니다. SIR 모델에서는 감염되지 않은 사람을 S(susceptible), 감염자를 I(infecti...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.