VBA - 중첩 매크로

VBA - 중첩 매크로

com

소개

다른 매크로에서 매크로를 호출하는 데 사용할 수있는 여러 가지 방법이 있습니다 (Sub 또는 함수 호출 여부에 따라 다름). 또한 이벤트 프로 시저를 처리하거나 다른 통합 문서에서 프로 시저를 호출 할 때 특히주의해야합니다.

Sub에서 Sub 호출하기

    • 매개 변수없이
    • 매개 변수 포함
  • 하위 함수 호출
  • 함수에서 함수 호출
    • 중간 변수 사용하기
    • 중간 변수를 사용하지 않고 :
  • 이벤트 프로 시저 호출
    • Call 문 사용
    • CallByName 함수
  • 다른 통합 문서의 프로 시저 호출
    • Sub 호출
    • 함수 호출하기

매개 변수없이

두 하위 모두 동일한 모듈에 있으며 매개 변수가 없습니다. Macro2가 Macro1을 호출합니다.

 Sub Macro1 () MsgBox "Hello world!" End Sub Sub Macro2 () 호출 Macro1 End Sub 

Call 문을 사용하지 않으려면 다음을 수행하십시오.

 Sub Macro1 () MsgBox "Hello world!" End Sub Sub Macro2 () Macro1 End Sub 

Call 문은 코드를 훨씬 더 읽기 쉽게 만들어주기 때문에 권장하지 않습니다.

보조 모듈이 다른 모듈에 있고 매개 변수가없는 경우 모듈을 지정해야 할 필요는 없습니다. 하지만 여전히 코드의 유지 보수에 대해 생각해야합니다. 어떤 모듈이 사용되고 있는지 표시함으로써 코드를 디버깅 할 때 귀중한 시간을 절약 할 수 있습니다. 따라서 Macro1이 Module1에 있고 Macro2가 Module2에있는 경우

 Sub Macro1 () MsgBox "Hello world!" End Sub Sub Macro2 () 호출 Module1.Macro1 End Sub 

매개 변수 포함

이 방법은 동일합니다. 괄호 안에 매개 변수를 추가하십시오.

Call 문 사용

 ( "A1") = Nb1 범위 ( "A2") = Nb2 End Sub Sub Macro2 () 호출 Macro1 (18254, 654897) End Sub (Nb1 As Long, Nb2 As Long) 

Call 문없이

 ( "A1") = Nb1 범위 ( "A2") = Nb2 End Sub Sub Macro2 () Macro1 18254321, 654897 End Sub 

매크로가 다른 모듈에있는 경우 :

 Sub Macro2 () 호출 Module1.Macro1 (918254321, 654897) End Sub 

하위 함수 호출

함수 란 무엇입니까? Sub와 함수를 구별하는 것은 무엇입니까? 함수는 특정 매개 변수를 기반으로 값을 반환하는 명령입니다. Sub는 매개 변수 (있는 경우)에 의존하는 명령어이지만 값을 반환하지는 않습니다.

기능의 예 :

 기능 추가 (Double로 Nb1, Double로 Nb2) Double Addition = Nb1 + Nb2로 최종 기능 

이 예제에서 함수는 "As Double"로 선언됩니다 (이 유형 선언은 선택 사항입니다). 반환하는 값은 Double 유형입니다. 함수가 값을 반환 할 경우 호출하는 Sub에이 값의 저장소를 제공해야합니다. Excel 셀, 변수, 컨트롤 등이 될 수 있습니다.

 Sub Macro2 () Dim Somme As Double Somme = Addition (1234.56, 654.32) MsgBox Somme End Sub 함수 추가 (Double로 Nb1, Double로 Nb2) Double Addition = Nb1 + Nb2 End 함수로 추가 

Nb : 매개 변수는 괄호로 묶이고 쉼표로 구분됩니다.

함수에서 함수 호출

우리는 똑같은 원리를 사용할 것입니다!

중간 변수 사용하기

이 예제에서는 결과를 중간 변수에 저장합니다.

 (Nb1 As Double, Nb2 As Double) Double VarNb As Double VarNb = MultiplieParDeux (Nb2) Addition = Nb1 + VarNb End Function 기능 MultiplieParDeux (Nb As Double) Double MultiplieParDeux = Nb * 2 End Function 

중간 변수를 사용하지 않고 :

 더블 매크로 Nb1 + MultiplieParDeux (Nb2) End Function Function MultiplieParDeux (Nb As Double) 더블 매크로 (Double Somme As = 추가 (1234.56, 654.32) MsgBox Somme 최종 하위 함수 추가 (Double로 Nb1, Double로 Nb2) Double MultiplieParDeux = Nb * 2 끝 기능으로 

이벤트 프로 시저 호출

이벤트 프로 시저 란 무엇입니까? 이벤트 프로시 저는 사용자가 특정 객체와 상호 작용할 때 자동으로 활성화되는 명령문입니다. 개체는 시트, 통합 문서, 컨트롤 중 하나 일 수 있습니다 ... 이벤트의 예 : 통합 문서 열기 또는 닫기, 시트 변경, 목록에서 선택, 컨트롤 입력 ...

예:

사용자가 셀 A1의 값을 변경합니다. A1이 10보다 크면 B1에 "pas mal"가 표시됩니다.

=== 구현 : ====

  • 시트 선택
  • 시트 탭 / 코드보기를 마우스 오른쪽 버튼으로 클릭하십시오.
  • 코드 창에서 다음을 삽입하십시오.

 Private Sub Worksheet_Change (범위로 ByVal 목표) '목표에 따라 주소를 변경할 수 있습니다. A1 => Target에 주소를 지정하십시오.'$ A $ 1 '을 입력하고 Sub'Si la cellule (donc A1) est> 장소의 10의 alors "Pas mal!" en B1 If Target.Value> 10 Then Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "정말 끔찍해!" End Sub 

Call 문 사용

호출 된 프로 시저가 이벤트 프로 시저와 동일한 모듈에 있으면 다음을 수행하십시오.

 Private Sub Worksheet_Change (범위로 ByVal 목표) '목표에 따라 주소를 변경할 수 있습니다. A1 => Target에 주소를 지정하십시오.'$ A $ 1 '을 입력하고 Sub'Si la cellule (donc A1) est> 장소의 10의 alors "Pas mal!" en B1 If Target.Value> 10 Then Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "정말 끔찍해!" End Sub Sub MaMacro () Dim monRange As 범위 설정 monRange = Sheets ( "Feuil1"). 범위 ( "A1") 호출 Worksheet_Change (monRange) End Sub 

죄수를 사용하면 호출 프로 시저가 동일한 모듈에없는 경우 다음 오류가 발생합니다.

  • 컴파일 오류 : 하위 또는 함수가 정의되지 않았습니다.

VBA는 이벤트 프로 시저에 액세스 할 수 없습니다. 이 문제를 해결하려면 :

CallByName 함수

구문 : CallByName (Objet, NomProcédure, TypeAppel, Args ())
  • 개체 : 필수 항목입니다. Object 유형입니다. 프로 시저에 포함 된 개체를 지정합니다.
  • 필수 항목 : 필수 항목입니다. 끈. 호출 된 프로 시저의 이름.
  • TypeAppel : 필수 항목입니다. CallType : 방법, 설정, 시도 또는 가져 오기
  • Args () : 선택 사항. 호출 된 함수에 전달할 매개 변수입니다.

이 예에서는 maMacro를 Module1에두고 Worksheet_Change Sub를 호출합니다. 그러나 먼저 이벤트 프로 시저를 선언해야합니다 (private로 선언 된 경우 모듈에서 사용할 수 없음).

 Sub Worksheet_Change (ByVal Target as Range) '목표에 따라 주소를 변경하십시오.> Target에 주소를 지정하십시오. $ A $ 1을 입력하고 Sub'Si la cellule (donc A1) est> 10을 종료하십시오. 장소에 alors "Pas mal!" en B1 If Target.Value> 10 Then Target.Offset (0, 1) = "Pas mal!" Else Target.Offset (0, 1) = "정말 끔찍해!" End Sub 

이제 모듈 2에 MyMacro Sub를 놓습니다.

 ( "Feuil1"), 범위 ( "A1") CallByName 워크 시트 ( "Feuil1"), "Worksheet_Change", VbMethod, monRange End Sub SubMemacro () 

다른 예시:

사용자 정의 폼 (UserForm2)에서 단추를 클릭하면 UserForm1에서 Combobox1_Change 이벤트가 트리거됩니다.

 Private Sub CommandButton1_Click () CallByName UserForm1, "ComboBox1_Change", VbMethod End Sub 

다른 통합 문서의 프로 시저 호출

Run 메서드를 사용합니다. 호출 된 프로 시저와 프로 시저 이름을 포함하는 통합 문서를 포함하여 지정됩니다.

Sub 호출

사례 1 : 파일이 이미 열려 있습니다. 이 경우 경로를 지정할 필요가 없습니다.

 Sub TestRun () Application.Run " 'Classeur1.xlsm'! Module2.Macro2"End Sub 

사례 2 : 파일이 닫혔습니다. 이 경우 전체 경로를 지정해야합니다.

 Sub TestRun () Application.Run " 'C : \ Users \ franck \ Desktop \ Classeur1.xlsm'! Module2.Macro2"End Sub 

함수 호출하기

같은 통합 문서에서 함수를 호출 할 때 반환 된 값을 저장할 변수가 필요합니다. 변수. 호출 Sub에서 함수에 전달할 모든 매개 변수도 전달해야합니다.

Classeur1.xlsm에있는 Addition 함수를 사용합니다.

 기능 추가 (Double로 Nb1, Double로 Nb2) Double Addition = Nb1 + Nb2로 최종 기능 

워크 북 [Classeur2.xlsm]에서 주요 프로 시저 [Principale ()]을 호출하려면 다음 코드가 필요합니다.

통합 문서가 이미 열려 있습니다.

 Sub Principale () Dim Somme As Double Somme = 실행 ( " 'Classeur1.xlsm'! Module2.Addition", 1234.56, 654.32) MsgBox Somme End Sub 

통합 문서가 닫혔습니다.

 ( "C : \ Users \ franck \ Desktop \ Classeur1.xlsm '! Module2.Addition", 1234.56, 654.32) MsgBox Somme End Sub 

주의 : 통합 문서가 이전에 닫힌 경우 매크로를 실행 한 후에 열립니다. 코드를 사용하여 다시 닫으십시오.

 ( "Classeur1.xlsm '! Module2.Addition", 1234.56, 654.32) 통합 문서 ( "Classeur1.xlsm") 닫기 False MsgBox Somme End Sub 
이전 기사 다음 기사

톱 팁