티스토리 뷰

VBA

[Excel][VBA] Sub Procesure(서브 프로시저) 다루기

어린왕자1234 2021. 11. 23. 10:14

[ Private | Public | Friend ] [ Static ] Sub 함수명 [ ( 인수 ) ]
    [ 실행문 ]
    [ Exit Sub ]  ' 정상 종료전 즉시 종료
    [ 실행문 ]
End Sub

Public 프로젝트내 모든 모듈의 모든 프로시저에서 접근 가능(선택)
기본적으로 모든 프로시저는 Public 이다. 
      Sub ProcessDate()  = Public Sub ProcessDate()
모듈에 Option Private Module문이 사용되면 다른 프로젝트에서 접근 불가(모듈내 모든 프로시저를 private화)
매크로 기록기로 기록하여 생성된 프로시저는 Public Sub이다.
Private 현재 모듈의 모든 프로시저에서 접근 가능(선택)
매크로 대화상자에 표시되지 않는다.
Friend Optional. Used only in a class module. Indicates that the Sub procedure is visible throughout the project, but not visible to a controller of an instance of an object.
Static 호출이 종료되더라도 프로시저 내에서 선언된 변수의 값이 유지된다. Static 속성은 procedure 에서 사용되더라도 Sub 외부에서 선언된 변수에 영향을 주지 않습니다.(선택)
함수명 Sub procesure의 이름, 변수명명법 따름,   [동사 + 명사] 형식으로 작명하라!!!
인수 프로시저에 전달되는 인수, 쉼표( , )로 구분되며, 인수가 없을 시 빈 가로[ ( ) ]만 입력

 

■ 서브 프로시저 실행하는 방법

 

1. VBE 「실행 > Sub/사용자 정의 폼 실행」         ' F5 key 기능

      => 커서가 위치한 프로시저를 실행하고 부정확시 매크로 대화상자를 뛰운다.

 

2. 매크로 대화상자에서 실행 , 바로가기키가 설정된다면 바로가기키 사용 가능(인수를 사용하지 않는 프로시저만 가능)

      => 「개발도구 > 코드 > 매크로」      ' Alt + F8

      매크로 위치를 조정하여 표시되는 매크로를 조정 가능

      ※ 다음 프로시저는 표시되지 않는다.

         - Function Processure

         - Private Sub Processure

         - 하나 이상의 인수를 사용하는 Sub Processure

         - 추가 기능에 포함된 서브 프로시저

      ※ 바로가기키 지정

         [주의] 이미 사용 중인 키를 입력하면 이 키는 더이상 사용 불가

         Ctrl + Shif + [ f , l , n , o , p , w 를 제외한 문자 ]

 

3. 워크시트의 양식/Active컨트롤, 삽입개체(도형, SmartArt, WordArt, 차트, 그림)에 프로시저 연결하여 사용

 

4. 실행 중인 프로시저에서 다른 프로시저 호출 사용

  ※ 다른 프로시저 호출하는 방법

      - 프로시저이름 인수1 , 인수2 , ....              = > 기본적으로 반환값이 없으므로 ( ) 미사용

      - [ Call ] 프로시저이름 ( 인수1 , 인수2 , ...... )

      - Application.run "프로시저명" , "인수1" , "인수2" , .....

        : 프로시저의 이름이 변수에 저장되어 있는 프로시저를 실행할  유일한 방법    

          전달 인수의 종류 - 문자열, 숫자, 변수등 프로시저 인수

 

Sub Main()
    Dim SubToCall As String
    Select Case Weekday(Date)
        Case 1, 7
            SubToCall = "WeekEnd"
        Case Else
            SubToCall = "Daily"
    End Select
    
    Application.Run SubToCall
    
End Sub
Sub WeekEnd()
    Debug.Print "Today is a weekend"
End Sub

Sub Daily()
    Debug.Print "Today is not a weekend"
End Sub





  ※ 다른 모듈에 있는 프로시저 호출하기

     : 동일 이름의 프로시저(Public Sub)가 다른 모듈에 존재한다면 동일 모듈에 있는 프로시저가 우선한다.

       [ Call ] 모듈명 . 프로시저명

 

 ※ 다른 통합문서에 있는 프로시저 호출하기      

    ▶ 다른 통합문서에 참조를 설정해서 호출하기( 참조되는 통합문서가 닫혀 있어도 참조 가능)

       1) 참조를 설정한다.

         : VBE 도구 > 참조         

  

        ▼ 참조되는 통합문서가 열려 있지 않아도 별도의 개체 라이브러리처럼 취급되어 참조 가능

                                  -> 찾아보기 버튼을 이용하여 현재 열려있지 않는 통합문서를 선택가능

      2) 프로시저 호출한다.

          [ Call ] 프로시저명

          [ [ Call ] 프로젝트명. 모듈명. ] 프로시저명

   Application.Run 이용 ( 통합문서가 열려 있어야 적용 가능 )        => 인수에  ( ) 없다

         공백없는 파일명 : Application.Run " 파일명 ! 프로시저명 "

         공백있는 파일명 : Application.Run " ' 파일명 ' ! 프로시저명"

                                Application.Run "'budget macro.xlsm' ! OpenFile"

 

5. 리본 메뉴의 사용자 지정 컨트롤 사용 실행

 

 

 

6. 사용자 지정 바로가기 메뉴

 

7. Event가 발생 시 프로시저 실행(이벤트 프로시저)

         : 이벤트가 발생하는 개체에 연결된 개체 모듈에 프로시저 저장됨

   개체이름_이벤트명

   Private Sub Workbook_Open()

 

8. 직접실행창에서 호출 실행

   Debug.print 프로시저명

 

■ 프로시저로 인수 전달하기
▶ 인수 구문

[ Optional ] [ ByVal | ByRef ] [ ParamArray ] 인수이름 [ ( ) ] [ As type ] [ = defaultvalue ]

Optional Optional. Keyword indicating that an argument is not required. If used, all subsequent arguments in arglist must also be optional and declared by using the Optional keyword. Optional can't be used for any argument if ParamArray is used.
ByVal 원래의 변수값을 복사해서 전달, 프로시져에서 인수의 값을 변경해도 원래의 변수 값이 변경되지 않음.
ByRef Visual Basic 기본 전달 방식, 변수의 메모리 주소를 전달하므로 프로시져에서 인수의 값을 변경하면 원래의 변수 값이 변경된다.
ParamArray Optional. Used only as the last argument in arglist to indicate that the final argument is an Optional array of Variant elements. The ParamArray keyword allows you to provide an arbitrary number of arguments. ParamArray can't be used with ByVal, ByRef, or Optional.
인수명 Required. Name of the variable representing the argument; follows standard variable naming conventions.
type Optional. Data type of the argument passed to the procedure; may be Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (not currently supported), Date, String (variable-length only), Object, Variant, or a specific object type. If the parameter is not Optional, a user-defined type may also be specified.
defaultvalue Optional. Any constant or constant expression. Valid for Optional parameters only. If the type is an Object, an explicit default value can only be Nothing.
Sub Main()
    Dim MyValue As Integer
    
    MyValue = 10
    Call Process(MyValue)
    Debug.Print MyValue    ' 10
    
    Call Process1(MyValue)
    Debug.Print MyValue    ' 100
End Sub
Sub Process(ByVal YourValue)
    YourValue = YourValue * 10
End Sub

Sub Process1(YourValue)
    YourValue = YourValue * 10
End Sub



 

 

[Excel][VBA] Function Procesure(함수 프로시저)

함수 프로시저(사용자 정의 함수) : 계산을 수행하고 결과를 반환하는 VBA 프로시저 VBA 코드나 워크시트의 수식에서 함수 프로시져 사용 가능 ※ 사용자 정의 함수를 워크시트의 수식으로 사용하

office-automation.tistory.com