Excel VBA에서 Sub와 Private Sub의 차이점은 무엇입니까?


최상의 답변

서브 프로그램에는 다양한 가시성이 있습니다. VBA에서는 모든 코드 모듈에서 Public Sub에 액세스 할 수 있습니다 ( 호출 ) . Private Sub는 그것이 상주하는 모듈에서만 호출 될 수 있습니다.

이 개념의 이름은 Scope입니다. 개체와 변수에도 범위가 있습니다. .

여기에 짧은 소개가 있습니다. 범위 및 가시성 이해

우리가 알면 서브를 비공개로 만듭니다. 현재 모듈 외부의 어떤 것도이 코드가 설계된 것을 절대 해서는 안됩니다. 우리는 작업과 상황에 맞는 무언가를 구축하고 있습니다. 반면에 Sub Public을 만들 때는 신중하게 생각해야합니다.

자신이 아닌 다른 사용자를 위해 VBA를 작성할 때 사용자가 코드를 직접 호출하는 것을 원하지 않을 것입니다. 매개 변수가없는 모든 공개 하위는 사용자 “매크로”목록에 표시됩니다. (Alt-F8)

사용자로부터 공개 구독을 숨기면 (반드시) 일반적으로 자체적으로 처리됩니다. 다른 모듈에서 Sub를 호출 할 때 일반적으로 적절한 매개 변수를 전달하여 알아야 할 사항을 알려야하며 매개 변수가있는 Public Sub는 사용자 목록에 나타나지 않습니다.

하지만 때때로 어디에서나 호출 할 수 있고 매개 변수가 필요없는 유틸리티 Sub가 있으면 편리합니다. Public 모듈에서 시작 코드를 호출하는 워크 시트의 단추에서 말합니다. 시작 모듈이 사용자에게 표시되는 것을 원하지 않습니다.

따라서 사용하지 않는 매개 변수를 서브에 제공하십시오. 더 좋은 방법은 언급 할 필요 가 아닌 매개 변수를 지정하는 것입니다. 아래 세 번째 Sub의 선택적 매개 변수를 참조하세요.

Option Explicit

Sub Visible()

" Can call this guy from anywhere;

" from any module or directly by the user.

" Sub (on it"s own) is lazy shorthand for "Public Sub"

Invisible

End Sub

Private Sub Invisible()

" This Sub can ONLY be called from inside its module.

" It is not shown in the Macro list available to the user.

Tricksy

End Sub

Public Sub Tricksy(Optional pIgnore As Boolean = True)

" This sub can be called from anywhere.

" It does not require a parameter (pIgnore).

" BUT, because it has a parameter, it does not appear

" in the user"s list of available "macros".

MsgBox "Hi there", vbExclamation, "Greetings from Tricksy"

End Sub

사용자는 하위 표시 . 동일한 모듈의 코드 만 sub Invisible 을 호출 할 수 있습니다. Tricksy 는 어디에서나 호출 할 수 있으며 매개 변수가 필요하지 않지만 사용자는이를 “볼 수”없습니다.

표시 결과 :

디버깅 할 때 공개 구독을 호출 할 수 있습니다. 직접 실행 창에서 실행할 수 있으며 코드가 아직 실행 중이 아닐 때 언제든지 그렇게 할 수 있습니다.

그러나 중단 점에 도달했거나 호스트 모듈의 어딘가에서 일시 중지 된 경우에만 직접 실행 창에서 Private Subs를 호출 할 수 있습니다. .

Answer

Private 및 (Public) Sub는 루틴의 범위를 선언하는 데 사용됩니다. .

Private Sub : 루틴이 다른 루틴에 의해 동일한 모듈 내에서만 호출 될 수 있도록합니다.

Module A 라는 모듈이 있고이 모듈 내에 다음과 같은 두 개의 루틴이 있다고 가정합니다.

  • Private Sub Hello\_World ()
  • 하위 메시지 ()

Public Sub Message()

Call Hello\_World()

End Sub

Private Sub Hello\_World()

MsgBox “Hello World”

End Sub

Message 루틴 인 Hello\_World . 두 루틴이 동일한 모듈 (모듈 A)에 있었기 때문에 가능했습니다.

다음 루틴이있는 모듈 B 가 있다고 가정 해 보겠습니다. :

Sub Message2()

Call Hello\_World()

End Sub

이렇게하면“Sub or Function not defined”라는 컴파일 오류가 반환됩니다.

이유

다른 모듈의 개인 루틴 ( Hello\_World ). 불가능합니다.

Public Sub : 다른 모듈의 다른 루틴에서도 루틴을 호출 할 수 있습니다. 모든 루틴은 기본적으로 공개되므로 이전에 세계를 공개로 선언 할 필요가 없습니다. 서브만으로 충분합니다.

Sub ThisIsEnough()

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다