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 프로세스를 실행하면 바로 창에서 결과를 볼 수 있습니다. =
다음은 사용 과정에서 주의해야 할 부분들이다.
  • Sub 프로세스는 귀속될 수 있다.즉, 이 과정은 특정한 임무를 완성하기 위해 자신을 호출할 수 있다는 것이다.그러나 귀속은 창고에 넘칠 수 있다.통상적으로 Static 키워드와 귀속 Sub 프로세스는 함께 사용되지 않습니다..
  • 모든 실행 가능한 코드는 반드시 어떤 과정에 속해야 한다.다른 Sub, Function 또는 Property 프로세스에서는 Sub 프로세스를 정의할 수 없습니다
  • Exit Sub 문구는 실행을 하나의 Sub 과정에서 즉시 종료합니다.프로그램은 이 Sub 프로세스를 호출하는 다음 문장에서 실행됩니다.Sub 프로세스의 모든 위치에 Exit Sub 문구가 있을 수 있습니다..
  • Sub 과정에서 사용하는 변수는 두 종류로 나뉜다. 하나는 과정 내에서 현식으로 정의된 것이고 다른 하나는 그렇지 않다.프로세스 내에서 명시적으로 정의된 변수(Dim 또는 등효 방법 사용)는 국부 변수입니다.프로세스에서 명시적으로 정의되지 않은 변수를 사용하지만 프로세스에서 더 높은 수준의 위치에 명시적으로 정의하지 않으면 부분적으로 정의됩니다
  • 조심 프로세스는 프로세스 내에 현저하게 정의되지 않은 변수를 사용할 수 있지만, 모듈 단계에서 정의된 이름과 같은 이름이 있으면 이름 충돌이 발생합니다.프로세스에 사용되는 정의되지 않은 변수가 다른 프로세스, 상수, 또는 변수의 이름과 같으면 프로세스가 사용하는 것은 모듈급 이름이라고 생각합니다.현식 정의 변수는 이런 충돌을 피할 수 있다.Option Explicit 문구를 사용하여 변수를 명시적으로 정의할 수 있습니다
  • 참고: GoSub, GoTo 또는 Return을 사용하여 Sub 프로세스를 시작하거나 종료할 수 없습니다

  • 매개 변수표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

    좋은 웹페이지 즐겨찾기