본문 바로가기
언어 참조

범위와 가시성 이해하기

2023. 7. 28.

이 글은 도움말을 번역한 내용입니다.

범위는 다른 프로시저에서 사용할 수 있는 변수, 상수 또는 프로시저의 가용성을 나타냅니다.

세 가지 레벨이 있습니다.procedure-level, private module-level, and public module-level.

변수를 선언할 때 변수의 범위를 결정합니다. 범위가 다른 변수 간의 이름 충돌 오류를 방지하려면 모든 변수를 명시적으로 선언하는 것이 좋습니다.

Sub ExplicitDeclarationExample()
    ' 명시적 변수 선언
    Dim myNumber As Integer
    Dim myString As String
    Dim myBool As Boolean
    Dim myDouble As Double
    Dim myDate As Date
    
    ' 값 할당
    myNumber = 10
    myString = "Hello, VBA!"
    myBool = True
    myDouble = 3.14
    myDate = Date
    
    ' 값 출력
    Debug.Print "myNumber: " & myNumber
    Debug.Print "myString: " & myString
    Debug.Print "myBool: " & myBool
    Debug.Print "myDouble: " & myDouble
    Debug.Print "myDate: " & myDate
End Sub

Procedure-level scope

프로시저 내에서 정의된 변수나 상수는 해당 프로시저 외부에서 볼 수 없습니다. 변수 선언이 포함된 프로시저에서만 사용할 수 있습니다. 다음 예제에서 첫 번째 프로시저는 문자열이 포함된 메시지 상자를 표시합니다. 두 번째 프로시저는 빈 메시지 상자를 표시합니다.그 이유는 strMsg는 첫 번째 프로시저에서 선언된 지역 변수이기 때문입니다.

Sub LocalVariable()
    Dim strMsg As String
    strMsg = "This variable can't be used outside this procedure."
    MsgBox strMsg
End Sub
 
Sub OutsideScope()
 MsgBox strMsg
End Sub

Private module-level scope

모듈의 선언 섹션에서 모듈 수준 변수와 상수를 정의할 수 있습니다. 모듈 수준 변수는 Public 또는 Private일 수 있습니다. Public 변수는 프로젝트의 모든 모듈에 있는 모든 프로시저에서 사용할 수 있으며, Private 변수는 해당 모듈의 프로시저에서만 사용할 수 있습니다. 기본적으로 선언 섹션에서 Dim 문을 사용하여 선언된 변수는 비공개로 범위가 지정됩니다. 그러나 변수 앞에 Private 키워드를 붙이면 코드에서 범위를 명확하게 알 수 있습니다.

다음 예제에서는 모듈에 정의된 모든 프로시저에서 문자열 변수 strMsg를 사용할 수 있습니다. 두 번째 프로시저가 호출되면 대화 상자에 문자열 변수 strMsg의 내용을 표시합니다.

' Add following to Declarations section of module. 
Private strMsg As String 
 
Sub InitializePrivateVariable() 
 strMsg = "This variable can't be used outside this module." 
End Sub 
 
Sub UsePrivateVariable() 
 MsgBox strMsg 
End Sub

참고

표준 모듈 또는 클래스 모듈의 공용 프로시저는 모든 참조 프로젝트에서 사용할 수 있습니다. 모듈의 모든 프로시저 범위를 현재 프로젝트로 제한하려면 모듈의 선언 섹션에 Option Private Module 문을 추가하세요. 공개 변수와 프로시저는 현재 프로젝트의 다른 프로시저에서 계속 사용할 수 있지만 참조 프로젝트에서는 사용할 수 없습니다.

이 문장의 의미가 무엇인지 ChatGPT에게 질문하고 답변받은 내용입니다.

Public module-level scope

모듈 수준 변수를 공용으로 선언하면 프로젝트의 모든 프로시저에서 사용할 수 있습니다. 다음 예제에서 문자열 변수는 프로젝트의 모든 모듈에 있는 프로시저에서 사용할 수 있습니다.

' Include in Declarations section of module. 
Public strMsg As String

이벤트 프로시저를 제외한 모든 프로시저는 기본적으로 공개입니다. Visual Basic에서 이벤트 프로시저를 만들 때 프로시저 선언 앞에 Private 키워드가 자동으로 삽입됩니다. 다른 모든 프로시저의 경우 프로시저를 공개하지 않으려면 Private 키워드를 사용하여 프로시저를 명시적으로 선언해야 합니다.

' 이벤트 프로시저 - 자동으로 Private로 설정됨
Private Sub CommandButton1_Click()
    MsgBox "Button clicked!"
End Sub

' 일반 프로시저 - 명시적으로 Private로 설정함
Private Sub MyPrivateProcedure()
    MsgBox "This is a private procedure."
End Sub

' 일반 프로시저 - 기본적으로 Public (외부에서 접근 가능)
Sub MyPublicProcedure()
    MsgBox "This is a public procedure."
End Sub


참조 프로젝트에서 표준 모듈 또는 클래스 모듈에 정의된 공용 프로시저, 변수 및 상수를 사용합니다. 하지만 먼저 해당 프로시저가 정의된 프로젝트에 대한 참조를 설정해야 합니다.

' Project1의 표준 모듈(Module1)

Public PublicVariableInModule1 As Integer ' 공개 변수 선언

Public Sub Main()
    Call PublicProcedureInModule1 ' 다른 프로젝트에서 이 프로시저를 사용할 수 있도록 공개로 선언됨
    PublicVariableInModule1 = 10 ' 다른 프로젝트에서 이 변수를 사용할 수 있도록 공개로 선언됨
End Sub
Public Sub PublicProcedureInModule1()
    MsgBox "This is a public procedure in Project1!"
End Sub
' Project2의 표준 모듈(Module1)

Sub UsePublicProcedureInProject1()
    ' Project1의 PublicProcedureInModule1을 호출하기 위해 Project1을 참조해야 함
    Project1.Module1.PublicProcedureInModule1
End Sub

Sub UsePublicVariableInProject1()
    ' Project1의 PublicVariableInModule1을 사용하기 위해 Project1을 참조해야 함
    MsgBox "PublicVariableInModule1: " & Book1.Module1.PublicVariableInModule1
End Sub

Sub Main()
    Call UsePublicProcedureInProject1 ' 다른 프로젝트의 공개 프로시저 사용
    Call UsePublicVariableInProject1 ' 다른 프로젝트의 공개 변수 사용
End Sub



양식 모듈이나 보고서 모듈과 같이 표준 모듈이나 클래스 모듈이 아닌 다른 모듈에 정의된 공용 프로시저, 변수 및 상수는 해당 모듈이 있는 프로젝트에 비공개이므로 참조 프로젝트에서 사용할 수 없습니다.

이 문장 역시 이해가 어려워서 ChatGPT에게 질문을 하고 답변을 받았습니다.

도움말 출처

Understanding scope and visibility (VBA)

Office VBA reference topic

learn.microsoft.com

'언어 참조' 카테고리의 다른 글

대입문 작성  (0) 2023.07.29
변수의 수명 이해  (0) 2023.07.29
Variant 이해하기  (0) 2023.07.28
상수 선언 및 사용  (0) 2023.07.28
데이터 타입을 효율적으로 사용하기  (0) 2023.07.28