이름 충돌 방지

이름 충돌은 이전에 정의된 식별자를 만들거나 사용하려 할 때 발생합니다. 어떤 경우에는 이름 충돌로 "이름이 분명하지 않습니다" 또는 "현재 범위에서 선언이 중복되었습니다" 같은 오류가 발생합니다. 특히 모든 변수를 명시적으로 선언하지 않고 처음 사용했을 경우 이름 충돌이 감지되지 않으면 코드에 틀린 결과를 만드는 오류가 발생할 수 있습니다.

이름 충돌은 데이터, 개체, 프로시저에 대한 식별자의 범위 특성을 이해하면 방지할 수 있습니다. Visual Basic에는 프로시저 수준, Private 모듈 수준, Public 모듈 수준 등 세 가지 범위 수준이 있습니다.

이름 충돌은 식별자가 다음과 같을 때 발생합니다.

•	한 범위 수준보다 많은 수준에서 볼 수 있을 때

•	같은 수준에서 다른 두 가지 의미를 가질 때

예를 들어, 서로 다른 모듈에 있는 프로시저는 이름이 같을 수 있습니다. 그래서 Mod1과 Mod2라고 명명된 모듈에서는 MySub라는 이름으로 프로시저를 정의할 수 있습니다. 각 프로시저를 자신의 모듈에 있는 다른 프로시저에서 호출하면 충돌이 생기지 않습니다. 그러나 MySub를 제3의 모듈에서 호출하면 오류가 발생할 수 있고 MySub 프로시저 두 개를 구분하도록 어떤 조건도 제공되지 않습니다.

대부분의 이름 충돌은 각 식별자 앞에 모듈 이름과 필요하다면 프로젝트 이름으로 구성된 한정어를 두어 해결할 수 있습니다. 사용 예는 다음과 같습니다.

YourProject.YourModule.YourSub MyProject.MyModule.MyVar

위의 코드는 YourSub라는 Sub 프로시저를 호출하고 MyVar를 인수로 전달합니다. 동일한 식별자들을 구분하기 위해 모든 한정어를 조합하여 사용할 수 있습니다.

Visual Basic은 식별자에 대한 각 참조를 일치하는 식별자 가운데 "가장 가깝게" 선언된 식별자에 대응시킵니다. 예를 들어, MyID가 한 프로젝트에 있는 두 개 모듈(Mod1 과 Mod2)에서 Public으로 선언되어 있다면 Mod2에 선언된 MyID를 Mod2라는 특별한 조건 없이 지정할 수 있지만 Mod2.MyID로 한정하여 Mod1에서 지정해야 합니다. Mod2가 다르지만 직접 참조된 프로젝트에 있을 경우에도 적용됩니다. 그러나 Mod2가 간접 참조된 프로젝트, 즉 직접 참조한 프로젝트에 의해 참조된 프로젝트에 있다면 MyID라고 명명된 Mod2 변수에 대한 참조는 프로젝트 이름을 지정해야 합니다. 직접 참조된 제3의 모듈에서 MyID를 참조하면 처음 발견된 선언과 일치됩니다.

•	직접 참조된 프로젝트: 도구 메뉴에 있는 참조 대화 상자에 나타난 순서대로

•	각 프로젝트에 있는 모듈: 프로젝트에 있는 모듈에 대해 고유의 순서가 없습니다.

예를 들어, 다른 범위 수준들에서 Microsoft Excel의 R1C1과 같은 호스트 응용 프로그램 개체의 이름을 다시 사용할 수 없습니다.

팁 이름 충돌로 발생한 오류에는 일반적으로 분명하지 않은 이름, 중복된 선언, 선언되지 않은 식별자, 발견되지 않은 프로시저가 있습니다. 각 모듈이 시작할 때 Option Explicit 문을 사용하여 변수가 사용되기 전에 명시적으로 선언하도록 설정해서 잠재된 이름 충돌 및 식별자와 관련된 오류들을 방지할 수 있습니다.


같은 이름의 프로시저 호출

활성 모듈에 있는 프로시저를 호출하듯이 같은 프로젝트의 어느 모듈에 있는 프로시저라도 활성 모듈로 호출할 수 있습니다. 그러나 두 개 이상의 모듈에 같은 이름의 프로시저가 있으면 다음 보기에서와 같이 호출 문에서 모듈 이름을 지정해야 합니다.

Sub Main()

Module1.MyProcedure

End Sub

다른 두 개의 프로젝트에 있는 다른 두 개의 프로시저에 같은 이름을 줄 경우 그 프로시저를 호출할 때는 프로젝트 이름을 지정해야 합니다. 예를 들어, 다음 프로시저는 MyProject.vbp 프로젝트의 MyModule 모듈에 있는 Main 프로시저를 호출합니다.

Sub Main()

[MyProject.vbp].[MyModule].Main

End Sub

메모 한 프로젝트에서 다른 응용 프로그램들은 이름이 다릅니다. 예를 들어, Microsoft Access 에서 프로젝트는 데이터베이스(.mdb)라고 합니다. Microsoft Excel에서 프로젝트는 통합 문서(.xls)라고 합니다.

프로시저 호출에 관한 팁

•	모듈이나 프로젝트의 이름을 변경할 때는 모든 호출 문에 나타나는 모듈 이름이나 프로젝트 이름을 변경해야 합니다. 그렇지 않으면 Visual Basic은 호출된 프로시저를 찾을 수 없습니다. 편집 메뉴에서 바꾸기 명령을 사용하여 모듈에서 문자열을 찾아 바꿀 수 있습니다.

•	참조된 프로젝트들 사이에서 이름 충돌을 피하기 위해 프로시저마다 고유의 이름을 붙이면 프로젝트나 모듈을 지정하지 않고도 프로시저를 호출할 수 있습니다.


Property 프로시저 호출

다음은 Property 프로시저를 호출하는 구문들입니다.

Property 프로시저	구문
Property Let	[object.]propname(arguments)] = argument
Property Get	varname = [object.]propname(arguments)]
Property Set	Set [object.]propname[.(arguments)] = varname
Property Let 또는 Property Set 프로시저를 호출할 때는 등호(=) 오른쪽에 인수가 하나 나타납니다.

인수가 여러 개인 Property Let 또는 Property Set 프로시저를 선언하면 호출 오른쪽에 있는 인수가 Property Let 또는 Property Set 선언의 마지막 인수에 전달됩니다. 예를 들어, 다음 그림은 Property 프로시저를 호출할 때 인수들이 어떻게 Property Let 선언에 있는 인수들과 관련되는지 보여 줍니다.

실제로 인수가 여러 개인 Property 프로시저는 속성들의 배열을 만들 때만 사용합니다.


Sub와 Function 프로시저 호출

다른 프로시저에서 Sub 프로시저를 호출하려면 프로시저 이름을 입력하고 필요한 인수 값을 넣어야 합니다. Call 문은 필요하지 않지만 사용할 경우에는 모든 인수를 괄호로 묶어야 합니다.

Sub 프로시저를 사용하여 다른 프로시저를 구성할 수 있는데, 그러면 이해하기 쉽고 디버그도 쉽습니다. 다음 보기에서는 Sub 프로시저인 Main이 Sub 프로시저인 MultiBeep을 호출하여 인수 값인 56을 전달합니다. MultiBeep이 실행되고 나면 컨트롤은 Main으로 반환되며 Main은 Sub 프로시저인 Message를 호출합니다. Message는 메시지 상자를 보여줍니다. 확인을 누르면 컨트롤은 다시 Main으로 반환되고 Main은 종료됩니다.

Sub Main()

MultiBeep 56

Message

End Sub

Sub MultiBeep(numbeeps)

For counter = 1 To numbeeps

Beep

Next counter

End Sub

Sub Message()

MsgBox "잠깐 쉴 시간입니다!"

End Sub

인수가 두 개 이상인 Sub 프로시저 호출

다음은 인수가 두 개 이상인 Sub 프로시저를 호출하는 방법을 나타낸 것입니다. HouseCalc가 두 번째 호출되면 Call 문이 사용되므로 인수를 괄호로 묶어야 합니다.

Sub Main()

HouseCalc 99800, 43100

Call HouseCalc(380950, 49500)

End Sub

Sub HouseCalc(price As Single, wage As Single)

If 2.5 * wage <= 0.8 * price Then

MsgBox "이 집을 살 여유가 없습니다."

Else

MsgBox "이 집을 살 여유가 있습니다."

End If

End Sub

괄호를 사용한 Function 프로시저 호출

함수의 결과값을 사용하려면 다음 보기와 같이 함수를 변수에 지정하고 인수들을 괄호로 묶어야 합니다.

Answer3 = MsgBox("당신의 봉급에 만족하십니까?", 4, "질문 3")

함수의 결과값에는 관계 없이 Sub 프로시저를 호출하는 방법으로 함수를 호출할 수 있습니다. 다음 보기와 같이 괄호를 생략하고 인수들을 나열하며 함수를 변수에는 지정하지 마십시오.

MsgBox "작업이 완료되었습니다!", 0, "작업 상자"

주의   앞의 보기에서 괄호로 묶는다면 구문 오류가 발생합니다.

명명된 인수 전달

Sub 또는 Function 프로시저는 명명된 인수를 사용하여 호출된 프로시저에 값을 전달할 수 있습니다. 명명된 인수들은 순서에 상관없이 나열할 수 있습니다. 명명된 인수는 인수 이름과 콜론, 등호(:=), 인수에 지정된 값으로 구성됩니다.

다음은 결과값 없이 명명된 인수를 사용하여 MsgBox 함수를 호출합니다.

MsgBox Title:="작업 상자", Prompt:="작업이 완료되었습니다!"

다음은 명명된 인수를 사용하여 MsgBox 함수를 호출합니다. 결과값은 변수 answer3에 지정합니다.

answer3 = MsgBox(Title:="질문 3", _

Prompt:="당신의 봉급에 만족하십니까?", Buttons:=4)


개체 변수 작성

개체 변수를 개체 변수가 참조하는 개체와 똑같이 취급할 수 있습니다. 개체의 속성을 설정하거나 반환할 수도 있고 개체의 모든 메서드를 사용할 수 있습니다.

개체 변수를 만들려면

1.	개체 변수를 선언합니다.

2.	개체 변수를 개체에 지정합니다.

개체 변수 선언

Dim 문이나 다른 선언문(Public, Private, Static)을 사용하여 개체 변수를 선언합니다. 개체를 참조하는 변수는 Variant, Object, 개체의 특정 형식 가운데 하나여야 합니다. 예를 들어, 다음 선언은 옳습니다.

' MyObject를 Variant 데이터 형식으로 선언합니다.

Dim MyObject

' MyObject를 Object 데이터 형식으로 선언합니다.

Dim MyObject As Object

' Dim MyObject를 Font 형식으로 선언합니다.

Dim MyObject As Font

메모   먼저 개체를 선언하지 않고 개체 변수를 사용하면 개체 변수의 데이터 형식은 기본값인 Variant가 됩니다.

특정 개체 형식이 프로시저가 실행될 때까지 알 수 없을 경우 Object 데이터 형식으로 개체 변수를 선언할 수 있습니다. Object 데이터 형식을 사용하면 어느 개체에 대해서나 일반적인 참조를 만들 수 있습니다.

특정 개체 형식을 알고 있다면 그 개체 형식으로 개체 변수를 선언해야 합니다. 예를 들어, 응용 프로그램에 Sample 개체 형식이 있다면 다음과 같은 선언문을 사용하여 그 개체의 개체 변수를 선언할 수 있습니다.

Dim MyObject As Object	' 일반적인 개체로써 선언합니다.

Dim MyObject As Sample	' Sample 개체로써 선언합니다.

특정 개체 형식을 선언하면 자동 형식 검사, 더 빠른 코드, 향상된 판독성을 얻을 수 있습니다.

개체 변수에 개체 지정

Set 문을 사용하여 개체를 개체 변수에 지정합니다. 개체식 또는 Nothing을 지정할 수 있습니다. 예를 들어, 다음 개체 변수 지정은 옳습니다.

Set MyObject = YourObject	' 개체 참고를 지정합니다.

Set MyObject = Nothing	' 연결을 중지합니다.

Set 문과 함께 New 키워드를 사용하여 개체 변수의 선언과 이 변수에 개체를 지정할 수 있습니다. 사용 예는 다음과 같습니다.

Set MyObject = New Object	' 개체 변수를 만들고 지정합니다.

개체 변수에 Nothing을 설정하면 특정 개체와 개체 변수의 연결이 중지됩니다. 이렇게 하면 변수를 변경하여 잘못 개체를 변경하는 것을 막을 수 있습니다. 연결된 개체를 닫고 나서 항상 개체 변수를 Nothing으로 설정하면 개체 변수가 유효한 개체를 가리키는지 검사할 수 있습니다. 사용 예는 다음과 같습니다.

If Not MyObject Is Nothing Then	' 변수가 유효한 개체를 참조합니다.

. . .

End If

물론, 이 검사는 개체 변수가 참조하는 개체가 들어 있는 응용 프로그램을 닫았는지 확실히 파악할 수는 없습니다.

개체의 현재 인스턴스 참조

Me 키워드를 사용하여 코드가 실행하는 개체의 현재 인스턴스를 참조합니다. 현재 개체와 연결된 모든 프로시저는 Me로 참조된 개체를 액세스할 수 있습니다. 개체의 현재 인스턴스에 대한 정보를 다른 모듈의 프로시저에 전달할 때는 Me를 사용하는 것이 좋습니다. 예를 들어, 다음 프로시저가 모듈에 있다고 가정합시다.

Sub ChangeObjectColor(MyObjectName As Object)

MyObjectName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)

End Sub

프로시저를 호출하고 다음 문을 사용하여 개체의 현재 인스턴스를 인수로 전달할 수 있습니다.

ChangeObjectColor Me


재귀적 프로시저 작성

프로시저는 변수에 대해 제한된 공간을 가집니다. 프로시저가 자신을 호출할 때마다 그 이상의 공간이 사용됩니다. 자신을 호출하는 프로시저를 재귀적 프로시저라고 합니다. 계속해서 자신을 호출하는 재귀적 프로시저는 결국 오류를 발생시킵니다. 사용 예는 다음과 같습니다.

Function RunOut(Maximum)

RunOut = RunOut(Maximum)

End Function

프로시저 두 개가 서로 무한정 호출할 때나 재귀 호출을 제한하는 조건이 일부 이루어지지 않을 경우 이 오류는 확실히 줄어들지도 모릅니다. 재귀 호출은 사용 목적이 있습니다. 예를 들어 다음 프로시저는 재귀적 함수를 사용하여 계승을 계산합니다.

Function Factorial (N)

If N <= 1 Then	' 재귀 호출의 끝입니다.

Factorial = 1	' (N = 0) 호출 밖으로 다시 돌아갑니다.

Else	' 만일 N이 0보다 크면 Factorial을 다시 호출합니다.

Factorial = Factorial(N - 1) * N

End If

End Function

재귀적 프로시저를 검사하여 메모리가 모자랄 정도로 자신을 너무 많이 호출하지 못하도록 해야 합니다. 오류가 생기면 프로시저가 무한정 자신을 호출하지 못하게 해야 합니다. 그리고 다음과 같은 방법으로 메모리를 확보하십시오.

•	필요없는 변수 삭제

•	Variant 가 아닌 데이터 형식 사용

•	프로시저의 논리 다시 검토. 재귀 호출 대신에 중첩 루프를 사용할 수도 있습니다.


배열 선언

배열은 다른 변수와 같이 Dim, Static, Private, Public 문으로 선언합니다. 스칼라 변수(배열이 아닌 것)와 배열 변수의 차이는 일반적으로 배열의 크기를 지정해야 한다는 것입니다. 크기가 지정된 배열을 고정 크기 배열이라고 하고 프로그램이 실행 중에 크기가 변경될 수 있는 배열을 동적 배열이라고 합니다.

배열이 0부터 1까지 인덱스화될지는 Option Base 문의 설정에 달려 있습니다. Option Base 1이 지정되지 않으면 모든 배열의 인덱스는 0부터 시작합니다.

고정 배열 선언

다음 코드에서 고정 크기 배열은 11행과 11열로 된 Integer 배열로 선언됩니다.

Dim MyArray(10, 10) As Integer

첫 번째 인수는 행을 나타내고 두 번째 인수는 열을 나타냅니다.

다른 변수 선언과 같이 배열에 대해 데이터 형식을 지정하지 않으면 선언된 배열 요소의 데이터 형식은 Variant가 됩니다. 배열의 각 숫자 Variant 요소는 16바이트를 사용합니다. 각 문자열 Variant 요소는 22바이트를 사용합니다. 되도록 정확히 코드를 작성하려면 Variant가 아닌 데이터 형식을 선언하십시오. 다음 코드들은 여러 가지 배열의 크기를 비교합니다.

' 정수 배열은 22바이트를 사용합니다.(11 요소 * 2바이트)

ReDim MyIntegerArray(10) As Integer

' 배정도 배열은 88바이트를 사용합니다.(11 요소 * 8바이트)

ReDim MyDoubleArray(10) As Double

' Variant 배열은 적어도 176바이트를 사용합니다.(11 요소 * 16바이트)

ReDim MyVariantArray(10)

' 정수 배열은 100 * 100 * 2바이트를 사용합니다.(20,000바이트)

ReDim MyIntegerArray (99, 99) As Integer

' 배정도 배열은 100 * 100 * 8바이트를 사용합니다.(80,000 바이트)

ReDim MyDoubleArray (99, 99) As Double

' Variant 배열은 적어도 160,000바이트를 사용합니다.(100 * 100 * 16바이트)

ReDim MyVariantArray(99, 99)

운영 체제와 사용가능한 메모리에 따라 배열의 최대 크기는 변할 수 있습니다. 사용할 수 있는 RAM 용량을 초과하는 배열을 사용하면 데이터가 디스크로부터 읽히거나 기록되기 때문에 속도가 느려집니다.

동적 배열 선언

동적 배열을 선언하면 코드가 실행하는 동안 배열의 크기를 정할 수 있습니다. 다음 보기와 같이 Static, Dim, Private, Public 문을 사용하여 배열을 선언하고 괄호 안은 공백으로 남겨두십시오.

Dim sngArray() As Single

메모   ReDim 문을 사용하여 프로시저에서 암시적으로 배열을 선언할 수 있습니다. ReDim 문을 사용할 때는 배열 이름을 잘못 쓰지 않도록 주의 하십시오. Option Explicit 문이 모듈에 포함되어 있어도 두 번째 배열을 만들 수 있습니다.

배열의 범위에 있는 프로시저에서는 ReDim 문을 사용하여 차원의 수를 변경하거나 요소의 수를 정의하고 각 차원의 상한값과 하한값을 정의합니다. ReDim 문을 사용하여 동적 배열을 변경할 수도 있습니다. 그러나 이렇게 할 때마다 배열에 있는 기존의 값을 잃게 됩니다. 배열에 있는 기존의 값을 보존하면서 배열을 확장하려면 ReDim Preserve를 사용하십시오. 예를 들어, 다음은 원래 요소의 현재값을 잃지 않고 배열 varArray를 10 요소만큼 확장합니다.

ReDim Preserve varArray(UBound(varArray) + 10)

메모   Preserve 키워드를 동적 배열과 함께 사용하면 마지막 차원의 상한값만 변경할 수 있지만 차원의 수는 변경할 수 없습니다.


상수 선언

상수를 선언하면 값에 의미있는 이름을 지정할 수 있습니다. Const 문을 사용하여 상수를 선언하고 값을 설정하십시오. 상수가 선언된 후에는 수정할 수 없고 새 값으로 다시 지정할 수도 없습니다.

선언부에서 상수를 procedure 안에서 선언하거나 모듈의 맨 위에 선언할 수 있습니다. 모듈 수준 상수들의 기본값은 Private입니다. Public 모듈 수준 상수로 선언하려면 Const 문 앞에 Public 키워드를 놓으십시오. Const 문 앞에 Private 키워드를 사용하여 Private 상수를 명확하게 선언하면 코드를 더 쉽게 읽고 해석할 수 있습니다. 자세한 내용은 Visual Basic 도움말에서 "유효 범위와 가시성 설명"을 참고하십시오.

다음은 Integer 형식인 Public 상수 conAge를 선언하고 34의 값을 지정하는 예입니다.

Public Const conAge As Integer = 34

상수는 Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String, Variant 등의 데이터 형식으로 선언합니다. 상수 값을 이미 알고 있기 때문에 Const 문에 데이터 형식을 지정할 수 있습니다. 데이터 형식에 대한 자세한 내용은 "데이터 형식 요약"을 참고하십시오.

한 문에서 상수를 여러 개 선언할 수 있습니다. 데이터 형식을 지정하려면 각 상수에 대해서 데이터 형식을 포함해야 합니다. 다음 문에서 상수 conAge 과 conWage는 Integer로 선언됩니다.

Const conAge As Integer = 34, conWage As Currency = 35000


변수 선언

변수를 선언할 때는 대개 Dim 문을 사용합니다. 선언문은 프로시저 수준 변수를 만들기 위해 프로시저에 넣을 수 있습니다. 선언부에서 모듈의 맨 위에 넣어 모듈 수준 변수를 만들 수도 있습니다.

다음은 변수 strName를 만들고 String 데이터 형식을 지정합니다.

Dim strName As String

이 선언문이 프로시저 안에 나타나면 변수 strName은 그 프로시저에서만 사용될 수 있습니다. 선언문이 모듈의 선언부에 나타나면 변수 strName은 모듈의 모든 프로시저에서 사용할 수는 있지만 프로젝트의 다른 모듈에 있는 프로시저에서는 사용할 수 없습니다. 이 변수를 프로젝트의 모든 프로시저에서 사용할 수 있게 하려면 다음과 같이 Public 문을 앞에 놓으면 됩니다.

Public strName As String

변수 이름에 대한 자세한 내용은 Visual Basic 도움말에 있는 �Visual Basic 명명 규칙�을 참고하십시오.

변수는 Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String(가변 길이 문자열), String * length(고정 길이 문자열), Object 또는 Variant 형식으로 선언됩니다. 데이터 형식을 지정하지 않으면 Variant 데이터 형식이 기본값으로 정의됩니다. 또한 Type 문을 사용하여 사용자 정의 형식을 만들 수 있습니다. 데이터 형식에 대한 자세한 내용은 Visual Basic 도움말에 있는 �데이터 형식 요약�을 참고하십시오.

한 개의 문에 변수를 여러 개 선언할 수 있습니다. 데이터 형식을 지정하려면 각 변수에 대하여 데이터 형식을 포함시켜야 합니다. 다음의 문에서는 intX, intY, intZ 변수를 Integer 형식으로 선언됩니다.

Dim intX As Integer, intY As Integer, intZ As Integer

다음 에서는 intX 과 intY 변수는 Variant 형식으로 선언되고 intZ만이 Integer 형식으로 선언됩니다.

Dim intX, intY, intZ As Integer

선언문에 항상 변수의 데이터 형식을 정할 필요는 없습니다. 데이터 형식을 생략하면 변수는 Variant 형식으로 지정됩니다.

Public 문 사용

Public 문을 사용하여 Public 모듈 수준 변수를 선언합니다.

Public strName As String

Public 변수는 프로젝트의 모든 프로시저에서 사용할 수 있습니다. Public 변수가 표준 모듈이나 클래스 모듈에 선언되었다면 Public 변수가 선언된 프로젝트를 참조하는 모든 프로젝트에서 사용할 수 있습니다.

Private 문 사용

Private 문을 사용하여 Private 모듈 수준 변수를 선언합니다.

Private MyName As String

Private 변수는 같은 모듈에 있는 프로시저만 사용할 수 있습니다.

메모   모듈 수준에서 사용될 경우 Dim 문은 Private 문과 같습니다. Private 문을 사용하여 코드를 쉽게 읽고 이해할 수 있습니다.

Static 문 사용

Dim 문 대신에 Static 문을 사용할 경우 선언된 변수는 호출 사이에 값을 유지합니다.

Option Explicit 문 사용

Visual Basic에서는 지정문에 변수를 사용함으로써 변수 형식을 지정하지 않고 간단히 변수를 선언할 수 있습니다. 형식이 지정되지 않고 선언된 모든 변수는 Variant 형식이 됩니다. Variant 형식은 다른 변수들 보다 많은 메모리를 필요로 합니다. 특정 데이터 형식의 변수를 선언하면 응용 프로그램이 더 효율적이 됩니다. 명확하게 변수를 선언하면 이름 충돌 오류와 철자 오류가 적게 발생합니다.

Visual Basic에서 암시적 선언을 못하게 하려면 모듈의 모든 프로시저 앞에 Option Explicit 문을 놓으십시오. 이 문에 모듈의 모든 변수를 명확하게 선언해야 합니다. 모듈에 Option Explicit 문이 포함되었을 경우 Visual Basic이 사전에 정의되지 않은 변수를 만나거나 변수 철자가 잘못되어 있으면 컴파일 시간 오류가 발생합니다.

Visual Basic 프로그래밍 환경에서는 옵션을 설정하여 새로운 모듈에 자동으로 Option Explicit 문이 포함되게 할 수 있습니다. Visual Basic 환경에서 옵션을 변경하는 방법은 응용 프로그램 설명서를 참고하십시오. 이 옵션은 기존에 작성된 코드는 변경하지 않습니다.

메모   고정 배열이나 동적 배열은 반드시 명시적으로 선언해야 합니다.

자동화를 위한 개체 변수 선언

한 응용 프로그램에서 다른 응용 프로그램의 개체를 제어할 때는 다른 응용 프로그램의 형식 라이브러리에 대한 참조를 설정해야 합니다. 참조를 설정하면 특정 형식에 따라 개체 변수를 설정할 수 있습니다. 예를 들어, Microsoft  Word에서 Microsoft Excel 형식 라이브러리에 대한 참조를 설정했을 경우 Microsoft Excel Worksheet 개체를 나타내기 위해 Microsoft Word에서 Worksheet 형식의 변수를 선언할 수 있습니다.

다른 응용 프로그램에서 Microsoft Access 개체를 제어하면 대부분의 경우 특정 형식에 따라 변수를 선언할 수 있습니다. New 키워드를 사용하여 자동으로 개체의 새로운 인스턴스를 만들 수 있습니다. 그러나 Microsoft Access 개체라는 것을 나타내야 합니다. 예를 들어, Microsoft Visual Basic에서 변수를 선언하여 Microsoft Access Form을 나타낼 때는 Microsoft Access Form 개체와 Visual Basic Form 개체를 구분해야 합니다. 다음과 같이 변수를 선언할 때는 형식 라이브러리의 이름을 포함하십시오.

Dim frmOrders As New Access.Form

어떤 응용 프로그램은 개별적인 Microsoft Access 개체 형식을 인식하지 못합니다. 이런 응용 프로그램에서 Microsoft Access 형식 라이브러리에 대한 참조를 설정했어도 Microsoft Access 개체 변수들은 Object 형식으로 선언해야 합니다. New 키워드를 사용하여 개체의 새로운 인스턴스를 만들 수는 없습니다. 다음은 Microsoft Access의 개체 형식을 인식하지 못하는 응용 프로그램에서 Microsoft Access Application 개체를 나타내는 방법입니다. 그런 다음 응용 프로그램은 Application 개체의 인스턴스를 만듭니다.

Dim appAccess As Object

Set appAccess = CreateObject("Access.Application")

응용 프로그램에서 어떤 구문을 지원하는지 알아보려면 응용 프로그램 설명서를 참고하십시오.


속성 설정할 때 코드 실행

같은 이름을 공유하는 Property Let, Property Set, Property Get 프로시저를 작성할 수 있습니다. 이렇게 하면 함께 작동하는 관련 프로시저 그룹을 만들 수 있습니다. 이름이 Property 프로시저에서 사용될 경우 그 이름은 Sub 나 Function 프로시저의 이름, 변수, 사용자 정의 형식으로 사용될 수 없습니다.

Property Let 문을 사용하여 속성 값을 설정하는 프로시저를 작성할 수 있습니다. 폼에 있는 비트맵의 역속성을 만드는 Property 프로시저가 그 한 예입니다. 다음은 Property Let 프로시저를 호출할 때 쓰이는 구문입니다.

Form1.Inverted = True

폼의 비트맵을 역상시키는 것은 실제로는 Property Let 프로시저에서 이루어집니다.

Private IsInverted As Boolean

Property Let Inverted(X As Boolean)

IsInverted = X

If IsInverted Then

…

(statements)

Else

(statements)

End If

End Property

폼 수준 변수인 IsInverted는 속성의 설정을 저장합니다. Private로 선언하면 Property Let 프로시저에서만 사용되도록 변경할 수 있습니다. 변수가 속성에 사용되었다는 것을 쉽게 알 수 있는 이름을 사용하십시오.

아래 Property Get 프로시저는 Inverted 속성의 현재 상태를 알려줍니다.

Property Get Inverted() As Boolean

Inverted = IsInverted

End Property

Property 프로시저는 속성값이 설정됨과 동시에 코드를 실행할 수 있게 해줍니다. 다음과 같이 하면 Property 프로시저를 사용할 수 있습니다.

•	속성값을 결정하기 위해 속성값이 설정되기 전에

•	새 값을 바탕으로 속성값이 설정된 후에


코드 반복

조건문과 반복문(제어 구조라고도 함)을 사용하면 의사 결정하고 동작을 반복하는 Visual Basic 코드를 작성할 수 있습니다. 또 다른 제어 구조인 With 문을 사용하면 개체를 다시 한정할 필요없이 일련의 문을 실행할 수 있습니다.

의사 결정 조건문 사용

조건문은 조건이 True인지 False인지 평가하여 그 결과에 따라 실행할 문들을 하나 이상 지정합니다. 대개, 조건문은 비교 연산자를 사용하여 값이나 변수를 다른 것과 비교하는 식입니다.

사용할 조건문 선택

•	If...Then...Else: 조건이 True이거나 False일 경우 분기합니다.

•	Select Case: 여러 조건에서 분기 선택합니다.

코드 반복하는 루프 사용

루프를 사용하면 문 그룹을 반복해서 실행할 수 있습니다. 어떤 반복 구조는 조건이 False가 될 때까지 반복하고 다른 것은 조건이 True일 때까지 반복합니다. 또한 문에 지정된 수만큼 반복하거나 컬렉션에 있는 각 개체마다 반복하는 구조도 있습니다.

사용할 반복 구조 선택

•	Do...Loop: 조건이 만족되거나 조건이 True일 때까지 반복합니다.

•	For...Next: 카운터를 사용하여 사용하여 특정 횟수만큼 문을 실행합니다.

•	For Each...Next: 컬렉션의 각 개체마다 문 그룹을 반복합니다.

같은 개체에서 몇몇 문 실행

Visual Basic에서는 보통 메서드를 실행하기 전이나 속성을 변경하기 전에 개체를 지정해야 합니다. With 문을 사용하면 개체를 한 번 지정하여 전체 문에 동일한 개체를 지정할 수 있습니다.

•	With: 같은 개체에 일련의 문을 실행합니다.


빠른 For...Next 반복 문 작성

Integer 데이터 형식은 Variant 데이터 형식보다 적은 메모리를 사용하며 업데이트도 약간 더 빠릅니다. 그러나 이런 차이는 수천개의 연산을 수행할 때만 두드러집니다. 사용 예는 다음과 같습니다.

Dim CountFaster As Integer	' 첫 번째는 정수를 사용합니다.

For CountFaster = 0 to 32766

Next CountFaster

Dim CountSlower As Variant	' 두 번째는 Variant를 사용합니다.

For CountSlower = 0 to 32766

Next CountSlower

위의 첫 번째 경우는 실행할 때 두 번째 경우보다 약간 시간이 덜 걸립니다. 그러나 CountFaster가 32,767을 초과하면 오류가 발생합니다. 이를 해결하기 위해 CountFaster가 더 큰 정수값을 가질 수 있도록 Long 데이터 형식으로 변경할 수 있습니다. 보통 데이터 형식이 작을수록 업데이트 시간이 적게 걸립니다. Variant는 다른 데이터 형식보다 약간 느립니다.


효율적인 인수 전달

다르게 지정하지 않을 경우 모든 인수는 프로시저에 주소 전달 방식으로 전달됩니다. 이것은 인수의 데이터 형식과 상관없이 주소 방식으로 전달된 모든 인수가 프로시저에서 같은 시간과 같은 양의 메모리(4바이트)가 필요하기 때문에 효과적입니다.

프로시저를 선언할 때 ByVal 키워드를 포함하면 인수들을 값으로 전달할 수 있습니다. 값으로 전달되는 인수들은 데이터 형식에 따라 프로시저에서 2바이트에서 16 바이트의 메모리가 필요합니다. 큰 데이터 형식은 작은 형식보다 시간이 약간 더 걸립니다. String 과 Variant는 값으로 전달해서는 안됩니다.

값으로 인수를 전달하면 원래 변수가 복사됩니다. 프로시저에서 인수를 변경해도 원래 변수에는 영향이 미치지 않습니다. 사용 예는 다음과 같습니다.

Function Factorial (ByVal MyVar As Integer)	' 함수 선언

MyVar = MyVar - 1

If MyVar = 0 Then

Factorial = 1

Exit Function

End If

Factorial = Factorial(MyVar) * (MyVar + 1)

End Function

' 변수 S를 가지고 팩토리얼을 호출합니다.

S = 5

Print Factorial(S)	' 120(5팩토리얼)을 출력합니다.

Print S	' 5를 출력합니다.

함수 선언 때 ByVal를 포함하지 않으면 앞의 Print 문 결과는1 과 0이 될 것입니다. MyVar가 변수 S를 참조하여 0이 될 때까지 1씩 감소되었기 때문입니다.

ByVal은 인수를 복사하기 때문에 위의 Factorial 함수로 Variant를 전달할 수 있습니다. 인수는 선언하는 프로시저가 다른 데이터 형식이면 주소 전달 방식으로 전달할 수 없습니다.


함수로부터 문자열 반환

어떤 함수들은 Variant 데이터 형식을 반환하거나 String 데이터 형식을 반환하는 두 가지 버전을 가집니다. Variant 버전은 서로 다른 데이터 형식을 자동으로 변환할 수 있기 때문에 매우 편리합니다. 또한 식을 통해 Null을 전파할 수 있습니다. String 버전은 메모리를 적게 사용하므로 더 효율적입니다.

다음과 같은 경우에 String 버전을 사용하십시오.

•	프로그램이 매우 크고 많은 변수를 사용할 때

•	랜덤 액세스 파일에 직접 데이터를 쓸 때

함수 이름에 달러 기호($)를 붙이면 다음 함수들은 String 변수의 값들을 반환합니다. 이 함수들은 달러 기호가 없이 Variant와 같은 사용법과 구문을 갖습니다.

Chr$	ChrB$	*Command$
CurDir$	Date$	Dir$
Error$	Format$	Hex$
Input$	InputB$	LCase$
Left$	LeftB$	LTrim$
Mid$	MidB$	Oct$
Right$	RightB$	RTrim$
Space$	Str$	String$
Time$	Trim$	UCase$
* 모든 응용 프로그램에서 사용할 수는 없습니다.


조건부 컴파일 사용

조건부 컴파일을 사용하여 선택적으로 코드 블록을 실행할 수 있습니다. 예를 들어, 다른 접근 속도를 같은 프로그래밍 작업에 비교하는 디버그문이나 응용 프로그램을 다른 언어들로 변환하는 경우입니다.

코드에 #Const를 가지고 직접 조건부 컴파일러 상수를 선언하고 #If...Then...#Else를 사용하여 조건적으로 컴파일되는 코드 블록을 표시합니다. 다음은 conDebug 변수값에 따라 디버그 코드나 생산 코드를 실행합니다.

' 선언부에 Public 컴파일 상수를 선언합니다.

#Const conDebug = 1

Sub SelectiveExecution()

#If conDebug = 1 Then

.	' 디버그문을 가지고 코드를 실행합니다.

.

.

#Else

.	' 정상적인 코드를 실행합니다.

.

.

#End If

End Sub


변수 수명 설명

변수가 값을 보유하고 있는 동안을 수명이라고 합니다. 변수 값은 사용 시간에 따라 변경될 수 있지만 변수가 범위를 벗어나면 더 이상 값을 갖지 않습니다.

프로시저가 실행하기 시작하면 모든 변수는 초기화됩니다. 숫자 변수는 0 으로 초기화되고 가변 길이 문자열 변수는 길이가 0인 문자열("")로, 고정길이 문자열 변수는 ASCII 문자 코드 0 또는 Chr(0)으로 나타낸 문자로 채워집니다. Variant 변수는 Empty로 초기화됩니다. 사용자 정의 형식의 각 요소는 독립 변수인 것처럼 초기화됩니다.

개체 변수를 선언할 때는 메모리에 공간이 확보되지만 값은 Set 문을 사용하여 개체 참조를 지정할 때까지 Nothing으로 설정됩니다.

코드를 실행하는 동안 변수 값이 변경되지 않으면 범위를 벗어날 때까지 초기값을 가집니다.

Dim 문을 사용하여 선언된 프로시저 수준 변수는 프로시저의 실행이 끝날 때까지 값을 가집니다. 프로시저가 다른 프로시저들을 호출하면 다른 프로시저가 실행되는 동안 값을 가집니다.

프로시저 수준 변수가 Static 키워드를 사용하여 선언되었다면 코드가 모듈에서 실행하고 있는 동안 값을 가집니다. 모든 코드의 실행이 끝나면 변수는 범위와 값을 잃게 됩니다. 변수의 수명은 모듈 수준 변수와 같습니다.

모듈 수준 변수는 정적 변수와는 다릅니다. 표준 모듈이나 클래스 모듈에서는 코드 실행이 멈출 때까지 값을 가집니다. 클래스 모듈에서는 클래스의 인스턴스가 있는 한 값을 가지고 있습니다. 모듈 수준 변수는 값을 재설정할 때까지 먼저 설정된 값을 사용하므로 꼭 필요할 때만 사용하십시오.

Sub 또는 Function 문 앞에 Static 키워드를 넣으면 프로시저에 있는 모든 프로시저 수준의 변수들은 호출하는 동안에도 그대로 유지됩니다.


명명된 인수와 선택적 인수 설명

Sub 또는 Function 프로시저를 호출할 경우 프로시저를 정의할 때 나타나는 순서대로 인수를 제공하거나 위치와는 상관없이 이름을 사용하여 인수들을 제공할 수 있습니다.

다음 Sub 프로시저는 인수를 세 개 가집니다.

Sub PassArgs(strName As String, intAge As Integer, dteBirth As Date)

Debug.Print strName, intAge, dteBirth

End Sub

다음 보기와 같이 프로시저를 호출할 때 인수 사이에 쉼표를 넣어 정확한 위치에 인수를 제공할 수 있습니다.

PassArgs "Mary", 29, #2-21-69#

인수 사이에 쉼표를 넣고 명명된 인수를 사용하여 프로시저를 호출할 수도 있습니다.

PassArgs intAge:=29, dteBirth:=#2/21/69#, strName:="Mary"

명명된 인수는 인수의 이름과 콜론, 등호(:=), 인수 값으로 구성됩니다.

명명된 인수는 특히 선택적 인수를 가지는 프로시저를 호출할 때 사용하면 좋습니다. 명명된 인수를 사용할 경우 누락된 인수 위치를 표시하기 위해 쉼표를 넣을 필요는 없습니다. 명명된 인수를 사용하여 전달하거나 생략한 인수들은 쉽게 추적할 수 있습니다.

프로세스 정의 때 선택적 인수들 앞에는 Optional 키워드가 붙습니다. 프로세스 정의 때 선택적 인수의 기본값을 지정할 수도 있습니다. 사용 예는 다음과 같습니다.

Sub OptionalArgs(strState As String, Optional strCountry As String = "미국")

. . .

End Sub

선택적 인수를 갖는 프로시저를 호출할 때는 선택적 인수를 지정할지 선택할 수 있습니다. 선택적 인수를 지정하지 않으면 기본값이 사용됩니다. 기본값이 지정되지 않았으면 지정된 형식의 변수에 대한 인수가 될 것입니다.

다음 프로시저는 선택적 인수인 varRegion과 varCountry 변수를 포함합니다. IsMissing 함수는 선택적 인수가 프로시저에 전달되었는지 파악합니다.

Sub OptionalArgs(strState As String, Optional varRegion As Variant, _

Optional varCountry As Variant = "미국")

If IsMissing(varRegion) And IsMissing(varCountry) Then

Debug.Print strState

ElseIf IsMissing(varCountry) Then

Debug.Print strState, varRegion

ElseIf IsMissing(varRegion) Then

Debug.Print strState, varCountry

Else

Debug.Print strState, varRegion, varCountry

End If

End Sub

다음 보기와 같이 명명된 인수를 사용하여 프로시저를 호출할 수 있습니다.

OptionalArgs varCountry:="미국", strState:="MD"

OptionalArgs strState:= "MD", varRegion:=5


개체, 속성, 메서드, 이벤트 설명

개체는 통합 문서, 셀, 차트, 폼, 보고서 같은 응용 프로그램의 요소를 나타냅니다. Visual Basic 코드에서는 개체의 메서드 중 하나를 적용하거나 그 속성 중 하나를 변경하기 전에 개체를 확인해야 합니다.

컬렉션은 몇몇 다른 개체들(항상 같은 형식일 필요는 없음)을 포함한 개체입니다. 예를 들어, Microsoft Excel의 Workbooks 개체는 열려 있는 모든 Workbooks 개체를 포함하고 있으며, Visual Basic의 Forms 컬렉션은 응용 프로그램 안에 있는 모든 Form 개체를 포함하고 있습니다.

컬렉션 안의 항목들은 숫자나 이름으로 구별할 수 있습니다. 예를 들어 다음 프로시저에서 Workbooks(1)은 첫 번째 열린 Workbook 개체를 나타냅니다.

Sub CloseFirst()

Workbooks(1).Close

End Sub

다음 프로시저는 문자열로 지정된 이름을 사용하여 Form 개체를 나타냅니다.

Sub CloseForm()

Forms("MyForm.frm").Close

End Sub

개체들이 공통 메서드를 공유할 경우 개체들의 컬렉션 전체를 조작할 수 있습니다. 예를 들어, 다음 프로시저는 열려 있는 모든 폼을 닫습니다.

Sub CloseAll()

Forms.Close

End Sub

메서드는 개체가 수행할 수 있는 동작입니다. 예를 들어, Add는 ComboBox 개체의 메서드인데 콤보 상자에 새 항목을 추가하기 때문입니다.

다음 프로시저는 Add 메서드를 사용하여 ComboBox에 새 항목을 추가합니다.

Sub AddEntry(newEntry as String)

Combo1.Add newEntry

End Sub

속성은 크기, 색, 화면의 위치 같은 개체의 특성이나 동작이 화면에서 가능한지 보이는지 등을 정의하는 개체의 특성입니다. 개체의 특성을 변경하려면 속성의 값을 변경하십시오.

속성값을 설정하려면 개체의 참조, 마침표, 속성 이름, 등호(=), 새 속성값을 차례로 쓰십시오. 예를 들어, 다음 프로시저는 Caption 속성을 설정하여 Visual Basic 폼의 제목 표시줄을 변경합니다.

Sub ChangeName(newTitle)

myForm.Caption = newTitle

End Sub

어떤 속성들은 설정할 수 없습니다. 각 속성의 도움말 항목은 그 속성을 설정(읽기-쓰기)할 수 있는지, 속성을 읽을 수만(읽기 전용) 있는지, 속성을 쓸 수만(쓰기 전용) 있는지 나타냅니다.

속성 중 하나의 값을 반환하여 개체에 대한 정보를 구할 수 있습니다. 다음 프로시저는 메시지 상자를 사용하여 현재 활성 폼의 맨 위에 제목을 표시합니다.

Sub GetFormName()

formName = Screen.ActiveForm.Caption

MsgBox formName

End Sub

이벤트는 마우스를 누를 때나 키보드를 누를 때, 코드를 써서 응답하는 경우 같이 개체가 인식하는 동작입니다. 이벤트는 사용자 동작이나 프로그램 코드의 결과로 발생할 수 있으며 시스템에 의해 실행될 수 있습니다.

개체 반환

모든 응용 프로그램마다 개체를 반환하는 방법이 있습니다. 그러나 모두 같지는 않으므로 개체 반환하는 방법을 알려면 개체나 컬렉션의 도움말 항목을 참고하십시오.


자동화 설명

자동화(이전에는 OLE 자동화)는 COM(Component Object Model) 기능으로, 응용 프로그램이 개발 도구, 매크로 언어, 자동화를 지원하는 다른 응용 프로그램에 개체를 나타낼 때 사용하는 산업 표준 기술입니다. 예를 들어, 스프레드시트 응용 프로그램은 통합 문서, 차트, 셀, 셀 범위를 각각 다른 형식의 개체로 나타냅니다. 워드 프로세서는 응용 프로그램, 문서, 단락 , 문장, 책갈피, 선택 영역 같은 개체를 나타낼 수 있습니다.

응용 프로그램이 자동화를 지원하면 응용 프로그램이 나타내는 개체들은 Visual Basic에서 액세스할 수 있습니다. Visual Basic에서 이 개체들을 다루려면 개체의 메서드를 호출하거나 개체의 속성을 얻거나 설정하면 됩니다. 예를 들어, MyObj란 이름의 자동화 개체를 만들어 다음과 같은 코드를 작성하여 개체를 액세스할 수 있습니다.

MyObj.Insert "안녕하십니까?"	' 문자열 위치 시키기.

MyObj.Bold = True	' 문자열 서식 지정.

If Mac = True	' Check your platform constant

MyObj.SaveAs  "HD:\WORDPROC\DOCS\TESTOBJ.DOC"	' 개체 저장(매킨토시).

Else

MyObj.SaveAs  "C:\WORDPROC\DOCS\TESTOBJ.DOC"	' 개체 저장(Windows).

다음 함수를 사용하여 자동화 개체를 액세스합니다.

함수	설명
CreateObject	지정된 형식의 새로운 개체를 만듭니다.
GetObject	파일에서 개체를 가져 옵니다.
응용 프로그램에서 지원하는 속성과 메서드에 대한 자세한 내용은 응용 프로그램 설명서를 참고하십시오. 응용 프로그램에서 지원하는 개체, 함수, 속성, 메서드는 대개 응용 프로그램의 개체 라이브러리에 정의되어 있습니다.


매개 변수 배열 설명

매개 변수 배열은 인수 배열을 프로시저로 전달할 때 사용됩니다. 프로시저를 정의할 때 배열의 요소 개수를 알 필요는 없습니다.

ParamArray 키워드를 사용하여 매개 변수 배열을 나타낼 수 있습니다. 배열은 Variant 형식의 배열로 선언해야 하며 프로시저 정의에서 가장 마지막 인수가 되어야 합니다.

다음 보기는 매개 변수 배열로 프로시저를 정의하는 방법입니다.

Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant)

Dim intI As Integer

Debug.Print strName; "  Scores"

' UBound 함수를 사용하여 배열의 상한값을 결정합니다.

For intI = 0 To UBound(intScores())

Debug.Print "    "; intScores(intI)

Next intI

End Sub

다음 보기는 이 프로시저를 호출하는 방법입니다.

AnyNumberArgs "Jamie", 10, 26, 32, 15, 22, 24, 16

AnyNumberArgs "Kelly", "High", "Low", "Average", "High"


범위와 가시성 설명

범위는 변수, 상수, 프로시저를 다른 프로시저에서 사용할 수 있다는 것을 말합니다. 프로시저 수준, private 모듈 수준, public 모듈 수준 등 세 범위로 나뉩니다.

변수를 선언할 때 범위를 결정하십시오. 범위가 다른 변수들 사이에서 이름 충돌 오류를 방지하기 위해 변수는 명시적으로 선언하는 것이 좋습니다.

프로시저 수준 범위 정의

프로시저 안에서 선언된 변수나 상수는 그 프로시저 밖에서는 보이지 않습니다. 변수가 선언된 프로시저에서만 그 변수를 사용할 수 있습니다. 다음 보기에서 첫 번째 프로시저는 문자열이 들어 있는 메시지 상자를 표시합니다. 변수 strMsg는 첫 번째 프로시저에 한정되었기 때문에 두 번째 프로시저는 공백 메시지 상자를 표시합니다.

Sub LocalVariable()

Dim strMsg As String

strMsg = "이 변수는 이 프로시저 외부에서는 사용할 수 없습니다."

MsgBox strMsg

End Sub

Sub OutsideScope()

MsgBox strMsg

End Sub

Private 모듈 수준 범위 선언

모듈의 선언부에 모듈 수준 변수와 상수를 정의할 수 있습니다. 모듈 수준 변수는 public 또는 private이 될 수 있습니다. public 변수는 프로젝트에 있는 모든 모듈의 모든 프로시저에서 사용할 수 있습니다. private 변수는 그 모듈의 프로시저에서만 사용할 수 있습니다. 기본적으로 선언부에 Dim 문으로 선언된 변수는 private 범위를 갖습니다. 그러나 Private 키워드를 변수 앞에 놓으면 코드의 범위가 명확해 집니다.

다음 보기에서 문자열 변수 strMsg는 모듈에 정의된 어느 프로시저에서나 사용할 수 있습니다. 두 번째 프로시저가 호출되면 대화 상자에 문자열 변수 strMsg의 내용이 표시됩니다.

' 모듈의 선언부에 다음 코드를 추가합니다.

Private strMsg sAs String

Sub InitializePrivateVariable()

strMsg = "이 변수는 이 모듈 외부에서는 사용할 수 없습니다. "

End Sub

Sub UsePrivateVariable()

MsgBox strMsg

End Sub

메모   표준 모듈 또는 클래스 모듈에 선언된 Public 프로시저는 참조하는 프로젝트 어디에서나 사용할 수 있습니다. 모듈의 모든 프로시저 범위를 현재 프로젝트로 제한하려면 모듈의 선언부에 Option Private Module 문을 추가하십시오. Public 변수와 프로시저는 현재 프로젝트에 있는 다른 프로시저에서는 사용할 수 있으나 참조하는 프로젝트에서는 사용할 수 없습니다.

Public 모듈 수준 범위 정의

모듈 수준 변수를 public으로 선언하면 프로젝트의 모든 프로시저에서 사용할 수 있습니다. 다음 보기에서 문자열 변수 strMsg는 프로젝트의 모든 모듈에 있는 어느 프로시저에서나 사용할 수 있습니다.

' 모듈의 선언부에 포함합니다.

Public strMsg As String

이벤트 프로시저를 제외한 모든 프로시저는 public이 기본입니다. Visual Basic이 이벤트 프로시저를 만들 때 Private 키워드가 프로시저 선언 앞에 자동으로 삽입됩니다. 다른 모든 프로시저에서 프로시저를 public으로 설정하지 않으려면 프로시저를 Private 키워드로 선언해야 합니다.

참조하는 프로젝트의 표준 모듈이나 클래스 모듈에 정의된 Public 프로시저, 변수, 상수를 사용할 수 있습니다. 그러나 먼저 정의된 프로젝트에 대한 참조를 설정해야 합니다.

폼 모듈이나 보고서 모듈 같이 표준 모듈이나 클래스 모듈이 아닌 곳에서 정의된 Public 프로시저, 변수, 상수는 참조하는 프로젝트에서 사용할 수 없습니다. 이 모듈이 있는 프로젝트에서는 private이기 때문입니다.


Variant 설명

상수, 변수, 인수를 선언할 때 데이터 형식을 지정하지 않으면 자동으로 Variant 데이터 형식이 지정됩니다. Variant 데이터 형식으로 선언된 변수들은 문자열, 날짜, 시간, Boolean, 숫자 값을 가질 수 있으며 자동으로 그 값들을 변환할 수 있습니다. 숫자 Variant 값은16바이트 메모리(큰 프로시저 또는 복잡한 모듈에서만 중요)를 필요로 하며 다른 데이터 형식으로 명시적으로 입력된 변수보다는 액세스 속도가 느립니다. 상수에 Variant 데이터 형식이 가끔 사용됩니다. 문자열 Variant 값은 22바이트 메모리가 필요합니다.

다음은 Variant 변수를 만듭니다.

Dim myVar

Dim yourVar As Variant

theVar = "텍스트입니다."

마지막 문에서는 변수 theVar를 명시적으로 선언하지 않았는데 오히려 암시적으로 또는 자동으로 선언했습니다. 암시적으로 선언된 변수는 Variant 데이터 형식으로 지정됩니다.

팁   변수나 인수의 데이터 형식을 지정하고 나서 틀린 데이터 형식을 사용하면 데이터 형식 오류가 발생합니다. 데이터 형식 오류를 방지하려면 암시적인 변수(Variant 데이터 형식)만을 사용하거나 명시적으로 모든 변수를 선언하여 데이터 형식을 지정하십시오. 후자의 방법을 많이 사용합니다.


Visual Basic 구문 설명

Visual Basic 도움말 항목에서 메서드, 문, 함수 구문은 메서드, 문, 함수를 정확하게 사용하기 위해 필요한 모든 요소를 보여줍니다. 이 항목에 나오는 보기들은 일반적인 구문 요소 해석 방법을 설명합니다.

메서드 구문 활성화

object.Activate

Activate 메서드 구문에서 기울임꼴의 "개체"는 사용자가 제공해야 할 정보입니다. 이 경우에는 개체를 반환하는 코드입니다. 굵게 써진 단어는 나타나야 할 곳에 정확하게 입력해야 합니다. 예를 들어, 다음 프로시저는 활성 문서의 두 번째 창을 활성화합니다.

Sub MakeActive()

Windows(2).Activate

End Sub

MsgBox 함수 구문

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

MsgBox 함수 구문에서 굵은 기울임꼴의 단어는 함수의 명명된 인수입니다. 대괄호로 묶인 인수들은 생략할 수 있습니다. (Visual Basic 코드에서는 대괄호를 입력하지 마십시오.) MsgBox 함수에서 꼭 제공해야 할 인수는 프롬프트 문자열입니다.

함수와 메서드의 인수들은 코드에서 위치나 이름별로 지정할 수 있습니다. 위치별로 인수를 지정하려면 각 인수들 사이에 쉼표를 넣어 구문에 나타난 순서대로 하십시오. 사용 예는 다음과 같습니다.

MsgBox "정답입니다!",0,"대답 상자 "

이름별로 인수를 지정하려면 인수 이름, 콜론, 등호(:=), 인수 값을 차례로 사용하십시오. 순서에 상관없이 명명된 인수를 지정할 수 있습니다. 예를 들어 :

MsgBox Title:="대답 상자", Prompt:="정답입니다!"

함수와 몇몇 메서드 구문을 보면 인수들이 괄호로 묶였습니다. 이 함수와 메서드는 값을 반환하므로 인수들을 괄호로 묶어 값을 변수에 지정해야 합니다. 결과값을 무시하거나 인수를 전달하지 않으려면 괄호를 넣을 필요가 없습니다. 값을 반환하지 않는 메서드는 인수를 괄호로 묶을 필요가 없습니다. 이런 규칙은 위치나 이름 인수 모두에 적용됩니다.

다음 보기에서 MsgBox 함수의 결과값은 변수 myVar에 저장된 선택된 단추를 가리키는 숫자입니다. 결과값이 사용되기 때문에 괄호가  필요합니다. 그런 다음 다른 메시지 상자는 변수의 값을 보여줍니다.

Sub Question()

myVar = MsgBox(Prompt:="저는 제 일을 좋아합니다.", _

Title:="대답 상자", Buttons:="4")

MsgBox myVar

End Sub

Option 문

Option Compare {Binary | Text | Database}

Option Compare 문에서 중괄호와 세로줄은 세 개 항목 가운데 선택해야 한다는 뜻입니다.( Visual Basic에서는 중괄호를 입력하지 마십시오). 예를 들어, 다음 문은 모듈에서 문자열이 대/소문자 구분없이 정렬 순서에 따라 비교될 것이라는 뜻입니다.

Option Compare Text

Dim 문

Dim varname[([subscripts])] [As type] [, varname[([subscripts])] [As type]] . . .

Dim 문에서 단어 Dim은 필수 키워드입니다. 유일한 필수 요소는 varname(변수 이름)입니다. 예를 들어, 다음 문은 변수 myVar, nextVar, thirdVar를 만듭니다. 이들은 자동으로 Variant 변수로 선언됩니다.

Dim myVar, nextVar, thirdVar

다음 보기는 변수를 String으로 선언합니다. 데이터 형식을 포함하면 메모리를 절약하고 코드상의 오류를 쉽게 발견할 수 있습니다.

Dim myAnswer As String

한 문에서 변수를 여러 개 선언하려면 각 변수마다 데이터 형식을 포함하십시오. 데이터 형식없이 선언된 변수는 자동으로 Variant로 선언됩니다.

Dim x As Integer, y As Integer, z As Integer

다음 보기에서 x와 y는 Variant 데이터 형식으로 지정되었습니다. z만 Integer 데이터 형식으로 지정됩니다.

Dim x, y, z As Integer

배열 변수를 선언할 때는 괄호를 포함해야 합니다. 아래 첨자는 생략할 수 있습니다. 다음 보기는 동적 배열인 myArray를 정의합니다.

Dim myArray()


배열 사용

배열을 선언하여 같은 데이터 형식의 값들로 작업할 수 있습니다. 배열은 값을 저장할 많은 공간들로 된 단일 변수인 반면 일반 변수는 값 하나만 저장할 수 있는 공간을 갖습니다. 배열의 모든 값을 참조하기 위해서 배열을 전체로 참조할 수도 있고 각 요소들을 참조할 수도 있습니다.

예를 들어, 매일마다 하루 경비를 저장해야 할 때는 365개 요소를 선언하기 보다는 365개의 요소를 가지는 배열 변수 한 개를 선언하는 것이 좋습니다. 배열의 각 요소마다 값이 한 개 있습니다. 다음 문은 365개 요소로 된 배열 변수 curExpense를 선언합니다. 기본적으로 배열의 인덱스는 0으로 시작하므로 배열의 상한값은 365가 아닌 364입니다.

Dim curExpense(364) As Currency

요소의 값을 개별적으로 설정하려면 요소의 인덱스를 지정하십시오. 다음 보기는 배열의 각 요소에 초기값 20을 지정합니다.

Sub FillArray()

Dim curExpense(364) As Currency

Dim intI As Integer

For intI = 0 to 364

curExpense(intI) = 20

Next

End Sub

하한값 변경

모듈의 맨 위에 있는 Option Base 문을 사용하여 첫 번째 요소의 기본 인덱스를 0에서 1로 변경할 수 있습니다. 다음 보기에서 Option Base 문은 첫 번째 요소의 인덱스를 변경하고 Dim 문은 365개 요소의 배열 변수 curExpense를 선언합니다.

Option Base 1

Dim curExpense(365) As Currency

다음 보기와 같이 To를 사용하여 배열의 하한값을 명시적으로 설정할 수도 있습니다.

Dim curExpense(1 To 365) As Currency

Dim strWeekday(7 To 13) As String

배열에 Variant 값 저장

Variant 값 배열을 만드는 방법은 두 가지입니다. 한 가지는 다음 보기와 같이 Variant 데이터 형식의 배열을 선언하는 것입니다.

Dim varData(3) As Variant

varData(0) = "Claudia Bendel"

varData(1) = "4242 Maple Blvd"

varData(2) = 38

varData(3) = Format("06-09-1952", "일반 날짜")

또 한 가지는 다음 보기와 같이 Array 함수의 결과값으로 나오는 배열을 Variant 변수에 지정하는 것입니다.

Dim varData As Variant

varData = Array("Ron Bendel", "4242 Maple Blvd", 38, _

Format("06-09-1952", "General Date"))

어떤 방법으로 변수를 만들었어도 Variant 값들로 된 배열의 요소는 인덱스로 나타낼 수 있습니다. 예를 들어, 다음 문은 앞의 보기에 추가될 수 있습니다.

MsgBox "Data for " & varData(0) & " has been recorded."

다차원 배열 사용

Visual Basic에서는 배열을 60 차원까지 선언할 수 있습니다. 예를 들어 다음 보기는 5x10의 2차원 배열을 선언합니다.

Dim sngMulti(1 To 5, 1 To 10) As Single

배열을 행렬로 생각한다면 첫 번째 인수는 행을 나타내고 두 번째 인수는 열을 나타냅니다.

다차원 배열을 처리할 때는 중첩된 For...Next 문을 사용합니다. 다음 프로시저는 2차원 배열을 Single 값으로 채웁니다.

Sub FillArrayMulti()

Dim intI As Integer, intJ As Integer

Dim sngMulti(1 To 5, 1 To 10) As Single

' 배열을 값으로 채웁니다.

For intI = 1 To 5

For intJ = 1 To 10

sngMulti(intI, intJ) = intI * intJ

Debug.Print sngMulti(intI, intJ)

Next intJ

Next intI

End Sub


상수 사용

코드에는 자주 나타나는 상수값을 포함할 수 있고 기억하기 어렵고 확실한 의미도 없는 숫자를 사용할 수도 있습니다. 상수를 사용하여 코드를 읽기 쉽고 관리하기 쉽게 만들 수 있습니다. 상수는 숫자나 문자열 대신에 쓰이는 의미있는 이름으로서 바뀌지 않습니다. 변수에 새 값을 지정하거나 상수를 수정할 수 없습니다.

상수는 세 가지 유형이 있습니다.

•	내부 상수 또는 시스템 정의 상수는 응용 프로그램이나 컨트롤에서 제공합니다. Microsoft Access, Microsoft Excel,  Microsoft Project, Microsoft Word 같이 개체 라이브러리를 제공하는 응용 프로그램에서는 개체, 메서드, 속성과 함께 사용할 수 있는 상수 목록도 제공합니다. 개체 찾아보기에 있는 개체 라이브러리마다 제공된 상수 목록을 얻을 수도 있습니다.

Visual Basic 상수는 Visual Basic for Applications 형식  라이브러리, DAO(Data Access Object) 라이브러리에 나와 있습니다.

메모 Visual Basic은 이전 버전의 Visual Basic 또는 Visual Basic for Applications에서 만들었던 상수를 계속 인식합니다. 상수는 개체 찾아보기에 나와 있는 상수로 업그레이드할 수 있습니다. 개체 찾아보기에 나와 있는 상수는 사용자 응용 프로그램에서 선언할 필요가 없습니다.

•	기호 상수 또는 사용자 정의 상수는 Const 문을 사용하여 선언합니다.

•	조건부 컴파일러 상수는 #Const 문을 사용하여 선언합니다.

Visual Basic의 이전 버전에서 상수 이름은 대개 밑줄이 그어진 대문자였습니다. 사용 예는 다음과 같습니다.

TILE_HORIZONTAL

내부 상수는 이름이 같은 상수가 두 개 이상의 개체 라이브러리에 있을 때 다른 값들이 지정될 수도 있는 혼동을 막기 위해 명확한 이름을 지정한 상수입니다. 상수 이름을 지정할 때는 다음 두 가지 방법으로 할 수 있습니다.

•	접두사

•	라이브러리 참조

접두사로 상수 지정

모든 개체에서 제공하는 내부 상수는 상수를 정의한 개체 라이브러리를 나타내는 2글자로 된 접두사를 가지며 대/소문자가 혼합된 형식으로 되어 있습니다. Visual Basic for Applications 개체 라이브러리의 상수 앞에는 "vb"가 붙고, Microsoft Excel 개체 라이브러리의 상수 앞에는 �xl�이 붙습니다. 다음 보기는 형식 라이브러리에 따라 사용자 정의 컨트롤의 접두사가 얼마나 다양한 지 보여줍니다.

•	vbTileHorizontal

•	xlDialogBorder

라이브러리 참조로 상수 지정

다음 구문을 사용하여 참조를 상수로 제한할 수도 있습니다.

[libname.] [modulename.]constname

상수로 제한하는 구문은 다음과 같이 구성되어 있습니다.

구성 요소	설명
libname	생략 가능. 상수를 정의하는 형식 라이브러리의 이름(매킨토시에서는 사용할 수 없음) 대부분의 사용자 정의 컨트롤에서는 컨트롤의 클래스 이름입니다. 컨트롤의 클래스 이름이 기억나지 않으면 도구 상자에 있는 컨트롤 위에 마우스 포인터를 놓으십시오. 도구 설명에 클래스 이름이 표시됩니다.
modulename	생략가능. 형식 라이브러리에서 상수를 정의하는 모듈의 이름. 개체 찾아보기를 사용하여 모듈의 이름을 찾을 수 있습니다.
constname	형식 라이브러리에 있는 상수에 정의된 이름
사용 예는 다음과 같습니다.

Threed.LeftJustify


효율적인 데이터 형식 사용

지정하지 않았으면 선언되지 않은 변수는 Variant 데이터 형식으로 지정됩니다. 이 데이터 형식을 이용하면 쉽게 프로그램을 작성할 수 있지만 사용하기에 가장 효율적인 데이터 형식은 아닙니다.

다음과 같은 경우에는 다른 데이터 형식을 고려해야 합니다.

•	프로그램이 상당히 크고 많은 변수를 사용하는 경우

•	가능한 한 빨리 프로그램을 실행해야 하는 경우

•	데이터를 랜덤 액세스 파일에 직접 쓰는 경우

Variant와 더불어 지원되는 데이터 형식에는 Byte, Boolean, Integer, Long, Single, Double, Currency, Decimal, Date, Object, String이 있습니다. Dim 문을 사용하여 특정 형식의 변수를 선언합니다. 사용 예는 다음과 같습니다.

Dim X As Integer

이 문은 변수 X가 정수(-32,768에서 32,767사이의 숫자)임을 선언합니다. X를 그 범위 밖의 숫자로 설정하려면 오류가 발생합니다. X를 소수로 설정하려면 숫자가 반올림됩니다. 사용 예는 다음과 같습니다.

X = 32768	' 오류가 발생합니다.

X = 5.9	' x는 6으로 설정됩니다.


Do...Loop 문 사용

Do...Loop 문을 사용하여 문 블럭을 무제한으로 실행할 수 있습니다. 조건이 True이거나 True가 될 때까지 반복됩니다.

조건이 True일 동안 문 반복

While 키워드를 사용하여 Do...Loop 문에서 조건을 검사하는 방법은 두 가지입니다. Do...Loop 문에 들어가기 전에 조건을 검사할 수도 있고 적어도 한 번 Do...Loop 문을 실행한 후에 검사할 수도 있습니다.

다음 ChkFirstWhile 프로시저에서는 Do...Loop 문에 들어가기 전에 조건을 검사합니다. myNum이 20이 아닌 9로 설정되었다면 그 Do...Loop 안의 문은 실행되지 않습니다. ChkLastWhile 프로시저에서는 조건이 False가 되기 전까지 루프 안의 문은 한 번만 실행됩니다.

Sub ChkFirstWhile()

counter = 0

myNum = 20

Do While myNum > 10

myNum = myNum - 1

counter = counter + 1

Loop

MsgBox "루프를 "& counter &"번 반복하였습니다."

End Sub

Sub ChkLastWhile()

counter = 0

myNum = 9

Do

myNum = myNum - 1

counter = counter + 1

Loop While myNum > 10

MsgBox "루프를 "& counter &"번 반복하였습니다."

End Sub

조건이 True가 될 때까지 문 반복

Do...Loop 문에서 조건을 검사하기 위해 Until 키워드를 사용하는 방법이 두 가지 있습니다. Do...Loop 문에 들어가기 전에 조건을 검사(ChkFirstUntil 프로시저의 경우)할 수도 있고 루프가 적어도 한 번 실행된 후에 검사(ChkLastUntil 프로시저의 경우)할 수도 있습니다. 루프는 조건이 False인 동안 반복됩니다.

Sub ChkFirstUntil()

counter = 0

myNum = 20

Do Until myNum = 10

myNum = myNum - 1

counter = counter + 1

Loop

MsgBox "루프를 "& counter &"번 반복하였습니다."

End Sub

Sub ChkLastUntil()

counter = 0

myNum = 1

Do

myNum = myNum + 1

counter = counter + 1

Loop Until myNum = 10

MsgBox "루프를 "& counter &"번 반복하였습니다."

End Sub

Do...Loop 문 빠져 나가기

Exit Do 문을 사용하여 Do...Loop 문을 빠져 나갈 수 있습니다. 예를 들어, 끝없이 반복되는 루프를 빠져 나가려면 If...Then...Else 문이나 Select Case 문의 True 문 블록에서 Exit Do 문을 사용하십시오. 조건이 False일 경우에는 루프가 계속 반복되어 실행될 것입니다.

다음 보기에서 myNum에는 끝없이 반복되는 루프를 만드는 값이 지정되었습니다. If...Then...Else 문은 이 조건을 검사하고 루프가 계속 반복되는 것을 막기 위해 조건이 맞으면 빠져 나갑니다.

Sub ExitExample()

counter = 0

myNum = 9

Do Until myNum = 10

myNum = myNum - 1

counter = counter + 1

If myNum < 10 Then Exit Do

Loop

MsgBox "루프를 "& counter &"번 반복하였습니다."

End Sub

메모 계속 반복되는 루프를 멈추려면 Esc키나 Ctrl+Break를 누르십시오.


For...Next 문 사용

For...Next 문을 사용하여 정해진 횟수만큼 문 블럭을 반복할 수 있습니다. For 루프는 루프를 반복할 때마다 값이 증가되거나 감소되는 카운터 변수를 사용합니다.

다음 프로시저는 신호음을 50번 냅니다. For 문은 카운터 변수 x와 시작값, 최종값을 지정합니다. Next 문은 카운터 변수를 1씩 증가시킵니다.

Sub Beeps()

For x = 1 To 50

Beep

Next x

End Sub

Step 키워드를 사용하면 지정한 값만큼 카운터 변수를 증가시키거나 감소시킬 수 있습니다. 다음 보기에서는 루프가 반복될 때마다 카운터 변수 j가 2씩 증가합니다. 루프가 끝나면 total은 2, 4, 6, 8, 10의 합계가 됩니다.

Sub TwosTotal()

For j = 2 To 10 Step 2

total = total + j

Next j

MsgBox "총 "& total&"입니다."

End Sub

카운터 변수를 감소시키려면 음수 Step 값을 사용하십시오. 카운터 변수를 감소시키려면 최종값을 시작값보다 작게 지정해야 합니다. 다음 보기에서 카운터 변수 myNum은 루프가 반복될 때마다 2씩 감소됩니다. 루프가 끝나면 total은 16,14,12,10,8,6, 4, 2의 합계가 됩니다.

Sub NewTotal()

For myNum = 16 To 2 Step -2

total = total + myNum

Next myNum

MsgBox "총 "& total &"입니다."

End Sub

메모   Next 문 다음에 카운터 변수 이름을 포함할 필요는 없습니다. 앞의 보기에서 카운터 변수 이름은 이해를 쉽게 하도록 포함되었습니다.

Exit For 문을 사용하면 최종값에 이르기 전에 For...Next 문을 빠져 나올 수 있습니다. 예를 들어, 오류가 발생할 때 특별히 오류를 검사하는 If...Then...Else 문이나 Select Case 문의 True 문 블록에 Exit For 문을 사용하면 됩니다. 오류가 발생하지 않고 If...Then...Else 문이 False이면 루프는 예상대로 실행을 계속할 것입니다.


For Each...Next 문 사용

For Each...Next 문은 컬렉션의 각 개체나 배열의 각 요소마다 문 블럭을 반복합니다. 루프가 실행될 때마다 자동으로 변수가 설정됩니다. 예를 들어, 다음 프로시저는 실행 중인 프로시저가 들어 있는 폼을 제외한 모든 폼을 닫습니다.

Sub CloseForms()

For Each frm In Application.Forms

If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close

Next

End Sub

다음 코드는 배열의 각 요소를 반복하며 각 값을 인덱스 변수 I의 값으로 설정합니다.

Dim TestArray(10) As Integer, I As Variant

For Each I In TestArray

TestArray(I) = I

Next I

셀 범위에서 반복 실행

For Each...Next 문을 사용하여 범위에 있는 모든 셀을 반복할 수 있습니다. 다음 프로시저는 시트1의 A1:D10 범위를 반복 실행하며 절대값이 0.01보다 작은 숫자는 0으로 설정합니다.

Sub RoundToZero()

For Each myObject in myCollection

If Abs(myObject.Value) < 0.01 Then myObject.Value = 0

Next

End Sub

끝나기 전에 Each...Next Loop 문 빠져 나가기

Exit For 문을 사용하여 For Each...Next 루프를 빠져 나갈 수 있습니다. 예를 들어, 오류가 발생하면 특별히 오류를 검사하는 If...Then...Else 문이나 Select Case 문의 True 문 블록에 Exit For 문을 사용하십시오. 오류가 발생하지 않고 If...Then...Else 문이 False이면 루프는 예상대로 계속 실행할 것입니다.

다음 보기는 A1:B5 범위에서 숫자가 없는 첫 번째 셀을 검사합니다. 그런 셀을 찾으면 메시지가 표시되고 Exit For 문에 의해 루프를 빠져 나갑니다.

Sub TestForNumbers()

For Each myObject In MyCollection

If IsNumeric(myObject.Value) = False Then

MsgBox "개체에 숫자값이 아닌 값이 있습니다."

Exit For

End If

Next c

End Sub


If...Then...Else 문 사용

If...Then...Else 문을 사용하여 조건 값에 따라서 특정 문이나 문 블록을 실행할 수 있습니다. If...Then...Else 문은 필요한 수준만큼 중첩될 수 있습니다. 그러나 읽기 쉽게 하려면 다중 수준으로 중첩된 If...Then...Else 문을 사용하는 것보다는 Select Case 문을 사용할 수도 있습니다.

조건이 True이면 문 실행

조건이 True일 때만 문을 한 개 실행하려면 If...Then...Else의 한 줄 구문을 사용하십시오. 다음 보기는 Else 키워드를 생략한 한 줄 구문입니다.

Sub FixDate()

myDate = #2/13/95#

If myDate < Now Then myDate = Now

End Sub

한 줄 이상의 코드를 실행하려면 여러 줄 문을 사용해야 합니다. 다음 보기와 같이 이 구문은 End If 문을 포함합니다.

Sub AlertUser(value as Long)

If value = 0 Then

AlertLabel.ForeColor = "Red"

AlertLabel.Font.Bold = True

AlertLabel.Font.Italic = True

End If

End Sub

조건이 True일 때 특정 문을 실행하고 False일 때 다른 문 실행

If...Then...Else 문을 사용하여 실행문 블록 두 개를 정의합니다. 조건이 True이면 한 블록이 실행되고 False이면 다른 블록이 실행됩니다.

Sub AlertUser(value as Long)

If value = 0 Then

AlertLabel.ForeColor = vbRed

AlertLabel.Font.Bold = True

AlertLabel.Font.Italic = True

Else

AlertLabel.Forecolor = vbBlack

AlertLabel.Font.Bold = False

AlertLabel.Font.Italic = False

End If

End Sub

첫 번째 조건이 False일 때 두 번째 조건 검사

If...Then...Else 문에 ElseIf 문을 추가하여 첫 번째 조건이 False일 때 두 번째 조건을 검사할 수 있습니다. 예를 들어, 다음 Function 프로시저는 일의 등급에 따라 보너스를 계산합니다. Else 문 다음의 문은 모든 If 와 ElseIf 문이 False일 때 실행합니다.

Function Bonus(performance, salary)

If performance = 1 Then

Bonus = salary * 0.1

ElseIf performance = 2 Then

Bonus = salary * 0.09

ElseIf performance = 3 Then

Bonus = salary * 0.07

Else

Bonus = 0

End If

End Function


코드에 괄호 사용

Sub 프로시저, 제공된 문, 어떤 메서드는 값을 반환하지 않으므로 인수는 괄호로 묶지 않습니다. 사용 예는 다음과 같습니다.

MySub "stringArgument", integerArgument

Function 프로시저, 기본으로 제공된 함수, 몇몇 메서드는 값을 반환하지만 무시할 수 있습니다. 결과값을 무시한다면 괄호를 포함하지 마십시오. Sub 프로시저를 호출하는 것처럼 함수를 호출하십시오. 괄호는 생략하고 인수를 나열하십시오. 그러나 변수에 함수를 지정하지는 마십시오. 사용 예는 다음과 같습니다.

MsgBox "작업이 완료되었습니다!", 0, "작업 상자"

함수의 결과값을 사용하려면 다음 보기와 같이 인수들을 괄호로 묶으십시오.

Answer3 = MsgBox("당신의 봉급에 만족하십니까?", 4, "질문 3")

Sub나 Function 프로시저의 문은 명명된 인수를 사용하여 호출된 프로시저에 값을 전달할 수 있습니다. 명명된 인수를 사용하거나 안하더라도 괄호를 사용하는 지침이 적용됩니다. 명명된 인수를 사용할 때는 순서에 상관없이 인수를 나열할 수 있고 선택적_ 인수는 생략할 수 있습니다. 명명된 인수 다음에는 항상 콜론, 등호(:=), 인수 값이 차례로 놓입니다.

다음 보기는 명명된 인수를 사용하여 MsgBox 함수를 호출하지만 결과값은 무시합니다.

MsgBox Title:="작업 상자", Prompt:="작업이 완료되었습니다!"

다음 보기는 명명된 인수를 사용하여 MsgBox 함수를 호출하고 변수 answer3에 결과값을 지정합니다.

answer3 = MsgBox(Title:="질문 3", _

Prompt:="당신의 봉급에 만족하십니까?", Buttons:=4)


Select Case 문 사용

하나의 식을 다른 여러 값과 비교할 때는 If...Then...Else 문의 ElseIf 대신에 Select Case 문을 사용합니다. If...Then...Else 문이 각 ElseIf 문의 다른 식을 나타낼 수 있는 반면, Select Case 문은 제어 구조의 맨 위에서 식을 한 번만 검토할 수 있습니다.

다음 보기에서는 Select Case 문을 사용하여 프로시저에 전달된 performance 인수를 검토합니다. Case 문은 각각 값, 값 범위, 비교 연산자와의 조합을 두 개 이상 가질 수 있습니다. 선택적인 Case Else 문은 Select Case 문이 어느 Case 문의 값과도 일치하지 않을 때 실행됩니다.

Function Bonus(performance, salary)

Select Case performance

Case 1

Bonus = salary * 0.1

Case 2, 3

Bonus = salary * 0.09

Case 4 To 6

Bonus = salary * 0.07

Case Is > 8

Bonus = 100

Case Else

Bonus = 0

End Select

End Function


With 문 사용

With 문을 이용하면 연속되는 문 전체에서 개체나 사용자 정의 형식을 한 번만 지정할 수 있습니다. With 문은 프로시저를 빠르게 실행시키고 반복적인 입력을 하지 않도록 합니다.

다음 보기는 숫자 30으로 셀 범위를 채우고 글꼴 유형을 굵게 하고 셀 내부 색을 노란색으로 설정합니다.

Sub FormatRange()

With Worksheets("Sheet1").Range("A1:C10")

.Value = 30

.Font.Bold = True

.Interior.Color = RGB(255, 255, 0)

End With

End Sub

더 큰 효과를 내기 위해 With 문을 중첩시킬 수 있습니다. 다음 보기는 셀 A1에 수식을 넣고 글꼴을 설정합니다.

Sub MyInput()

With Workbooks("Book1").Worksheets("Sheet1").Cells(1, 1)

.Formula = "=SQRT(50)"

With .Font

.Name = "Arial"

.Bold = True

.Size = 8

End With

End With

End Sub


Visual Basic 명명 규칙

Visual Basic 모듈에서 프로시저, 상수, 변수, 인수의 이름을 정할 때는 다음 규칙을 따르십시오.

•	첫 번째 문자는 글자를 사용해야 합니다.

•	공백이나 마침표(.), 느낌표(!), @, &, $, # 문자는 이름에 사용할 수 없습니다.

•	길이는 255자를 넘을 수 없습니다.

•	보통 Visual Basic의 함수, 문, 메서드 같은 이름은 사용할 수 없습니다. 언어에 같은 키워드를 붙여 끝을 냅니다. 지정된 이름과 충돌하는 내부 언어 함수나 문, 메서드를 사용하려면 명시적으로 나타내야 합니다. 관련된 형식 라이브러리의 이름을 내부 함수, 문, 메서드 앞에 넣으십시오. 예를 들어, Left 라는 변수를 사용할 경우 VBA.Left 를 사용해야 Left 함수를 호출할 수 있습니다.

•	같은 수준의 범위에서는 이름을 반복하여 붙일 수 없습니다. 예를 들어 같은 프로시저에서 age라는 변수를 두 개 선언할 수 없습니다. 그러나 같은 모듈에서 Private 변수 age와 프로시저 수준 변수 age를 선언할 수 있습니다.

메모   Visual Basic에서는 대/소문자를 구분할 필요는 없으나 이름이 선언된 문에서는 대문자로 보존됩니다.


여러 응용 프로그램을 이용한 작업

Visual Basic은 새로운 개체를 만들고 많은 Microsoft 응용 프로그램의 기존 개체들을 가져올 수 있습니다. 다른 응용 프로그램은 Visual Basic을 사용하여 만들 수 있는 개체를 제공하기도 합니다. 자세한 내용은 응용 프로그램 설명서를 참고하십시오.

새로운 개체를 만들거나 다른 응용 프로그램에서 기존의 개체를 가져오려면 CreateObject 함수나 GetObject 함수를 사용하십시오.

' Microsoft Excel을 시작하고 새로운 Worksheet 개체를 만듭니다.

Set ExcelWorksheet = CreateObject("Excel.Sheet")

' Microsoft Excel을 시작하고 기존의 Worksheet 개체를 엽니다.

Set ExcelWorksheet = GetObject("SHEET1.XLS")

' Microsoft Word를 시작합니다.

Set WordBasic = CreateObject("Word.Basic")

대부분의 응용 프로그램은 보이든지 보이지 않든 응용 프로그램을 닫는 Exit 또는 Quit 메서드를 제공합니다. 응용 프로그램이 제공하는 개체, 메서드, 속성에 대한 자세한 내용은 응용 프로그램 설명서를 참고하십시오.

어떤 응용 프로그램에서는 New 키워드를 사용하여 형식 라이브러리에 있는 어느 클래스의 개체라도 만들 수 있습니다. 사용 예는 다음과 같습니다.

Dim X As New Field

이 경우에 Field는 데이터 액세스 형식 라이브러리에 있는 클래스의 한 예입니다. Field 개체의 새로운 인스턴스는 이 구문을 사용하여 만들어집니다. 어떤 개체 클래스를 이 방법으로 만들 수 있는지는 응용 프로그램 설명서에 자세히 나와 있으니 참조하십시오.


Function 프로시저 작성

Function 프로시저는 Function과 End Function으로 둘러싸인 일련의 Visual Basic 문입니다. Function 프로시저는 Sub 프로시저와 비슷하나 값을 반환할 수 있다는 게 다릅니다. Function 프로시저는 호출 프로시저에 의해 전달될 상수, 변수, 식 같은 인수를 가질 수 있습니다. Function 프로시저에 인수가 없을 경우 Function 문에는 공백 괄호가 포함되어야 합니다. 함수는 프로시저의 하나 이상의 문에서 함수 이름에 값을 지정하여 값을 반환합니다.

다음 보기에서 Celsius 함수는 화씨 온도를 섭씨 온도로 계산합니다. 함수가 Main 프로시저에서 호출되었다면 인수 값이 들어 있는 변수는 함수에 전달됩니다. 계산 결과는 호출 프로시저에 반환되며 메시지 상자에 표시됩니다.

Sub Main()

temp = Application.InputBox(Prompt:= _

"화씨 온도를 입력하십시오.", Type:=1)

MsgBox "온도는 &" & Celsius(temp) "&입니다."

End Sub

Function Celsius(fDegrees)

Celsius = (fDegrees - 32) * 5 / 9

End Function


Property 프로시저 작성

Property 프로시저는 일련의 Visual Basic 문으로서 그 문으로 프로그래머는 사용자 정의 속성을 만들고 다룰 수 있습니다.

•	Property 프로시저는 폼, 표준 모듈, 클래스 모듈의 읽기 전용 속성을 만드는데 사용됩니다.

•	Property 프로시저는 코드에서 속성 값이 설정될 때 실행되어야 할 Public 변수 대신에 사용되어야 합니다.

•	Public 변수와는 달리 Property 프로시저는 개체 찾아보기에서 Property 프로시저에 지정된 도움말 문자열을 가질 수 있습니다.

Property 프로시저를 만들면 그 프로시저가 들어 있는 모듈의 속성이 됩니다. Visual Basic은 다음 세 가지 Property 프로시저 형식을 제공합니다.

프로시저	설명
Property Let	속성값을 설정하는 프로시저
Property Get	속성값을 반환하는 프로시저
Property Set	개체에 대한 참조를 설정하는 프로시저
Property 프로시저를 선언하는 구문:

[Public | Private] [Static] Property {Get | Let | Set} propertyname_ [(arguments)] [As type]

statements

End Property

Property 프로시저는 대개 쌍을 이룹니다. Property Let는 Property Get와, Property Set는 Property Get와 함께 사용됩니다. Property Get 프로시저를 단독으로 선언하는 것은 읽기 전용 속성을 선언하는 것과 같습니다. 세 가지 모든 Property 프로시저 형식을 사용하는 것은 Variant 변수에만 유용한데 이것은 Variant에만 개체나 다른 데이터 형식 정보를 포함할 수 있기 때문입니다. Property Set은 개체를 가지고 사용하기 위한 것이나 Property Let은 그렇지 않습니다.

다음 표는 Property 프로시저 선언에서 필수적인 인수를 나타낸 것입니다.

프로시저	선언 구문
Property Get	Property Get propname(1, ..., n) As type
Property Let	Property Let propname(1, ...,,,, n, n+1)
Property Set	Property Set propname(1, ..., n, n+1)
첫 번째 인수부터 마지막 인수(1,...,n)까지 같은 이름의 Property 프로시저는 모두 같은 이름과 데이터 형식을 공유해야 합니다.

Property Get 프로시저 선언은 관련된 Property Let과 Property Set 선언보다는 하나가 적은 인수를 가집니다. Property Get 프로시저의 데이터 형식은 관련된 Property Let과 Property Set 선언에서 마지막 인수(n+1)의 데이터 형식과 같아야 합니다. 예를 들어, 다음 Property Let 프로시저를 선언하면 Property Get 선언은 Property Let 프로시저의 인수와 같은 이름과 데이터 형식의 인수를 사용해야 합니다.

Property Let Names(intX As Integer, intY As Integer, varZ As Variant)

� 문입니다.

End Property

Property Get Names(intX As Integer, intY As Integer) As Variant

� 문입니다.

End Property

Property Set 선언에서 마지막 인수의 데이터 형식은 개체 형식 또는 Variant여야 합니다.


Sub 프로시저 작성

Sub 프로시저는 동작은 수행하지만 값은 반환하지 않는 Sub와 End Sub로 묶인 일련의 Visual Basic 문입니다. Sub 프로시저는 호출 프로시저에 의해 전달된 상수, 변수, 식 같은 인수를 가질수 있습니다. Sub 프로시저에 인수가 없으면 Sub 문에는 공백의 괄호가 포함되어야 합니다.

다음 Sub 프로시저에는 각 행을 설명하는 주석이 있습니다.

' GetInfo라고 명명된 프로시저를 선언합니다.

' 이 Sub 프로시저는 인수를 갖지 않습니다.

Sub GetInfo()

' answer라고 명명된 문자열 변수를 선언합니다.

Dim answer As String

' InputBox 함수의 결과값을 answer에 지정합니다.

answer = InputBox(Prompt:="이름을 입력하십시오.")

' If...Then...Else의 조건문입니다.

If answer = Empty Then

' MsgBox 함수를 호출합니다.

MsgBox Prompt:="이름을 입력하지 않았습니다."

Else

' MsgBox 함수는 변수 answer와 연결됩니다.

MsgBox Prompt:="이름은 "& answer&"입니다."

' If...Then...Else 문을 마칩니다.

End If

' Sub 프로시저를 마칩니다.

End Sub


지정문 작성

지정문은 변수나 상수에 값이나 식을 지정합니다. 지정문은 항상 등호(=)를 포함합니다. 다음 보기는 InputBox 함수의 결과값을 변수 yourName에 지정합니다.

Sub Question()

Dim yourName As String

yourName = InputBox("이름을 입력하십시오.")

MsgBox "이름은 "& yourName" &입니다".

End Sub

Let 문은 선택적인데 대개 생략할 수 있습니다. 예를 들어, 앞의 지정문은 다음과 같이 쓸 수 있습니다.

Let yourName = InputBox("이름을 입력하십시오?").

Set 문은 개체로서 선언된 변수에 개체를 지정할 때 사용됩니다. Set 키워드는 필수입니다. 다음 보기에서 Set 문은 Sheet1의 범위를 개체 변수 myCell에 지정합니다.

Sub ApplyFormat()

Dim myCell As Range

Set myCell = Worksheets("Sheet1").Range("A1")

With myCell.Font

.Bold = True

.Italic = True

End With

End Sub

속성 값을 설정하는 문도 지정문입니다. 다음 보기는 활성 셀에 대한 Font 개체의 Bold 속성을 설정합니다.

ActiveCell.Font.Bold = True


선언문 작성

선언문을 사용하여 프로시저, 변수, 배열, 상수를 명명하고 정의할 수 있습니다. 어디에서 선언하고 어떤 키워드를 사용하여 선언하는 지에 따라 프로시저, 변수, 상수를 선언할 때 범위도 정의합니다.

다음 보기는 선언문 세 개를 포함합니다.

Sub ApplyFormat()

Const limit As Integer = 33

Dim myCell As Range

' 다른 문

End Sub

Sub 문(End Sub 문과 대응)은 ApplyFormat으로 명명된 프로시저를 선언합니다. ApplyFormat 프로시저가 호출되거나 실행될 때마다 Sub와 End Sub로 묶인 모든 문이 수행됩니다.

•	Sub 프로시저 작성

Const 문은 상수 limit을 선언하고 Integer 데이터 형식과 값 33을 지정합니다.

•	상수 선언

Dim 문은 변수 myCell을 선언합니다. 데이터 형식은 개체이고, 이 경우에는 Microsoft Excel Range 개체입니다. 사용하는 응용 프로그램에 나타난 어느 개체에도 변수를 선언할 수 있습니다. Dim 문은 변수를 선언하는 형식 중의 하나입니다. 선언할 때 사용되는 다른 키워드에는 ReDim, Static, Public, Private, Const가 있습니다.

•	변수 선언


실행문 작성

실행문은 동작을 초기화합니다. 메서드나 함수를 실행할 수 있고 코드 블록을 반복 실행하거나 분기할 수 있습니다. 실행문은 수치 연산자나 조건 연산자를 포함합니다.

다음 보기는 For Each...Next 문을 사용하여 Microsoft Excel 통합 문서의 Sheet1에서 MyRange 범위의 각 셀을 반복합니다. 변수 c는 MyRange에 포함된 셀 컬렉션에 있는 셀입니다.

Sub ApplyFormat()

Const limit As Integer = 33

For Each c In Worksheets("Sheet1").Range("MyRange").Cells

If c.Value > limit Then

With c.Font

.Bold = True

.Italic = True

End With

End If

Next c

MsgBox "모두 완료했습니다!"

End Sub

보기에서 If...Then...Else 문은 셀 값을 검사합니다. 값이 33보다 크면 With 문은 그 셀에 Font 개체의 Bold와 Italic 속성을 설정합니다. If...Then...Else 문은 End If로 끝납니다.

With 문은 포함된 문이 With 키워드 다음에 오는 개체에 자동으로 수행되므로 입력하는 수고를 덜 수 있습니다.

Next 문은 MyRange에 포함된 셀 컬렉션에 있는 다음 셀을 호출합니다.

MsgBox 함수(기본으로 제공된 Visual Basic 대화 상자 표시)는 Sub 프로시저가 실행이 끝났음을 알리는 메시지를 표시합니다.


파일에 데이터 작성

많은 양의 데이터를 가지고 작업할 때는 파일에 데이터를 쓰거나 읽어오는 것이 편리할 것입니다. Open 문을 이용하면 파일 이름을 직접 만들거나 액세스할 수 있습니다. Open은 다음 세 가지 파일 액세스 형식을 제공합니다.

•	순차적 액세스(Input, Output, Append 모드)는 오류 기록과 보고서 같은 텍스트 파일을 작성할 때 사용됩니다.

•	랜덤 액세스(Random 모드)는 파일을 닫지 않고 파일에 데이터를 읽고 쓸 때 사용됩니다. 랜덤 액세스 파일은 레코드에 데이터를 보관하며 이것은 빠르게 정보를 찾을 수 있게 합니다.

•	이진 액세스(Binary 모드)는 비트맵 모양을 저장하거나 표시하는 것 같이 파일의 어떤 바이트 위치에 읽거나 쓸 때 사용됩니다.

메모   Open 문은 응용 프로그램 자신의 파일 형식을 열 때 사용해서는 안됩니다. 예를 들어, Word 문서나 Microsoft Excel 통합 문서, 또는 Microsoft Access 데이터 베이스를 열 때는 Open을 사용해서는 안됩니다. 그렇게 하면 파일 무결성을 잃고 파일이 손상됩니다.

다음 표는 파일에 데이터를 쓰거나 데이터를 읽을 때 일반적으로 사용되는 문들입니다.

액세스 형식	데이터 쓰기	데이터 읽기
순차	Print #, Write #	Input #
랜덤	Put	Get
이진	Put	Get


Visual Basic 문 작성

Visual Basic의 문은 완벽합니다. 키워드, 연산자, 변수, 상수, 식을 포함할 수 있습니다. 각 문은 다음 세 분야 중 하나에 속합니다.

•	변수나 상수, 프로시저의 이름을 정하고 데이터 형식을 지정할 수 있는 선언문입니다.

선언문 작성

•	값이나 식을 변수나 상수에 지정하는 지정문입니다.

지정문 작성

•	동작을 초기화하는 실행문입니다. 이 문은 메서드나 함수를 수행할 수 있고 코드 블록을 반복하거나 분기할 수 있습니다. 실행문은 수치 연산자나 조건 연산자를 포함합니다.

실행문 작성

여러 줄에 계속되는 문

문은 보통 한 줄에 쓸 수 있지만 줄 연속 문자를 사용하여 다음 줄로 문을 연결할 수 있습니다. 다음 MsgBox 실행문은 3줄에 걸쳐 연결됩니다.

Sub DemoBox()  '이 프로시저는 문자열 변수를 선언합니다.

' Claudia으로 지정하십시오. 그리고 연결된 메시지라고

' 표시합니다.

Dim myVar As String

myVar = "John"

MsgBox Prompt:="Hello " & myVar, _

Title:="Greeting Box", _

Buttons:=vbExclamation

End Sub

주석 추가

주석은 누구나 코드를 읽을 수 있게 프로시저나 특별한 명령을 설명합니다. Visual Basic은 프로시저를 실행할 때 주석은 무시합니다. 주석 줄은 작은따옴표(')로 시작하거나 Rem 뒤에 공백을 두어 사용하고 프로시저의 어느 곳에나 쓰일 수 있습니다. 문과 같은 줄에 주석을 추가하려면 문 뒤에 작은 따옴표를 넣고 주석을 달면 됩니다. 기본적으로 주석은 녹색 문자열로 표시됩니다.

구문 오류 검사

코드를 한 줄 입력하고 Enter키를 누르고 그 줄이 빨간색으로 표시되면 (오류 메시지도 함께 표시됨) 문에서 무엇이 잘못되었는지 찾아 수정해야 합니다.


추가 기능 관리자 사용

추가 기능 관리자 대화 상자를 이용하여 추가 기능을 로드하거나 언로드합니다. 추가 기능의 시스템 메뉴를 두 번 누르거나 닫기 단추를 눌러서 추가 기능의 보이는 부분만 닫으면 추가 기능의 폼만 화면에서 사라지고 추가 기능 자체는 여전히 메모리에 남아 있습니다. 추가 기능 개체는 추가 기능 관리자 대화 상자를 통해 언로드하지 않는 한 항상 메모리에 있습니다.