VBA 언어

1. 개체(Object)

2. 속성(Property)

3. 메소드(Method)

4. 이벤드(Event)

5. Range 개체

6. Cells 속성으로 Range 개체 나타내기

7. ActiveWorkbook, ActiveSheet, ActiveCell 속성


코딩하는 중에, VBA 언어에 대해 궁금하신 것이 있으면, 도움말을 찾아 보시기 바랍니다.   도움말 가운데서도, Micro Excel Visual Basic 이라는 이름의 도움말을 참조하시기 바랍니다.

저희 강의에서는, 여러 가지 현란한 VBA 코딩을 할 것이 아니고, 엔지니어링을 위한 최소한의 VBA 코딩을 할 것이므로, 이곳 VBA 언어 강의에서는 앞으로의 강의에서 필요한 최소한의 VBA 언어에 대해서만 강의하도록 하겠습니다.

VBA의 많은 부분이 엑셀 워크 시트에서 수행하는 작업을 자동으로 할 수 있도록 하는 것인데, 엔지니어링에서 엑셀을 사용할 때 이러한 작업은, 엑셀 워크 시트에서 수식으로 입력하는 것이 코딩으로 하여 자동화 하는 것보다 훨씬 수월합니다.   굳이 복잡한 VBA 언어나 코딩에 대해 배울 필요도 없구요.

이곳 강의에서는, 엑셀 워크 시트에서 수식으로 입력할 수 없는 계산을, ESCommon.dll과 같은 외부 프로그램을 이용하여 수행하는데 필요한 VBA 언어에 대해서만 강의하도록 하겠습니다.

 

차례

1.  개체(Object)

개체는 영어로 Object이며, 여러 가지 성질(속성, Property)을 가지고 있으며, 여러 가지 일(메소드, Method)을 하고, 어떤 작용(이벤트, Event)에 반응하는, 하나의 가상의 물체라고 보시면 됩니다.

VBA 코딩을 할 때, 즉 프로그래밍을 할 때, 하나의 워크 시트를 지칭해서 불러야 할 경우도 있고, 하나의 셀을 지칭해서 불러야 할 경우도 있습니다. 어떤 경우에는 엑셀 전체를 불러야 할 경우도 있고, 하나의 엑셀 파일을 지칭해서 불러야 할 경우도 있습니다.  이러한 경우에 개체가 필요한 것입니다.

Application 개체는 엑셀 응용 프로그램 전체를 나타냅니다.   Workbook 개체는 하나의 엑셀 파일을 나타내고, Worksheet는 하나의 워크 시트를 나타냅니다.   Range는 셀을 나타냅니다.   Range는 Worksheet에 소속된 개체이며, Worksheet는 Workbook에 소속된 개체이고, Workbook은 Application에 소속된 개체입니다.

Application은 엑셀 응용 프로그램 전체를 나타내므로 별도로 구분하여 나타낼 필요가 없지만, 그 이하의 다른 개체들은 개체별로 구분하여 나타내어야 합니다.   Flash_Tank.xls 파일의 Sheet1에 있는 셀 B3는 다음과 같이 나타낼 수 있습니다.

Workbooks("Flash_Tank.xls").Worksheets("Sheet1").Range("B3")

Workbook 대신에 복수인 Workbooks를 사용하는 이유는 현재 열려져 있는 엑셀 파일 전체 가운데라는 의미에서 복수 명칭을 사용하는 것이며, 의미로는 열려져 있는 Workbooks 가운데 Flash_Tank.xls 이라는 의미입니다.   이렇게 열려져 있는 동일한 종류의 개체를 통틀어 VBA 용어로는 컬렉션(Collection)이라고 부릅니다.   복수형인 Workbook과 Worksheets는 컬렉션이며, Range는 컬렉션을 사용하지 않습니다.

복잡하지요.  자꾸 사용하다 보면 익숙해지고, 나중에 누가 개체가 뭐냐고 물어보면, 설명하기가 어려우면서도, 그것도 모르냐고 할 때가 올 것입니다.

 

2.  속성(Property)

속성 예를 들면, Range 개체의 속성 가운데 Address라는 주소를 나타내는 속성이 있습니다.  셀 B3를 지칭하는 Range 개체는 VBA 코드에서 Range("B3")라고 나타내는데, Range("B3").Address 는 $B$3 라는 문자열을 되돌립니다.   

셀 B3에 123 이라는 숫자가 들어 있다면, Range("B3").Value 는 123이라는 숫자를 되돌입니다.   예를 들어, B3 셀에 들어있는 kg/cm2 gauge 단위의 압력 값을 읽어서, 1.0332 kg/cm2 abs.의 대기압을 더해 절대 압력 값을 구하여, AbsPressure라는 변수에 입력하려고 한다면, AbsPressure = Range("B3").Value + 1.0332 라고 코딩하면 됩니다.  이렇게 속성이 값을 되돌리는 것을 "읽기"라고 합니다.

한편, 셀 B3에 123 이라는 숫자를 적어 넣을려면, Range("B3").Value = 123 하면 됩니다.  이와 같이 속성에 값을 적어 넣는 것을 "쓰기"라고 합니다.

속성에는 Value와 같이 읽을 수도 있고 쓸 수도 있는 속성이 있는 반면, Range 개체의 Address와 같이 읽기만 가능한 속성이 있습니다.

Range 개체의 속성 가운데, Formula(공식)이라는 읽기/쓰기 속성이 있습니다.  셀 A1에 "A3 곱하기 B3"라는 공식을 쓰려면, Range("A1").Formula = "=$A$3 * $B$3" 라고 코딩하면 됩니다.

Column

Range 개체의 속성 가운데, 다음 강의에서 사용될 Column이라는 속성이 있습니다.  Column 속성은 Range 개체의 Column 숫자를 나타내는데, 예를 들어 Range("B3")의 Column B는 A 다음에 있으므로 2번째 Column이며, Range("B3").Column 은 2라는 숫자를 나타냅니다.   

범위를 나타내는 Range 개체의 경우 Column 속성은 첫째 셀 범위의 첫째 열을 나타냅니다.  예를 들어, 아래 Range 개체의 설명에서 여러 셀 범위의 집합을 나타내는 Range("F3:K7, C9:G11, A1:B2").Column 은 첫째 셀 범위의 첫째 열이 F Column이므로, 6 라는 숫자를 나타냅니다.

3.  메소드(Method)

Range 개체의 메소드에 Calculate라는 메소드가 있습니다.  이 메소드는 셀에 있는 공식을 계산하는 메소드입니다.  셀 A1에 어떤 공식이 들어 있다면, Range("A1").Calculate 라고 하면 해당 공식이 계산되어 A1 셀에 계산된 결과 값이 나타나게 됩니다.

셀 B3에 있는 내용을 지우려면, Range 개체의 Clear 메소드를 사용해, Range("B3").Clear 하면 됩니다.

Sheet1을 Sheet3 다음에 복사하려면, Worksheet 개체의 Copy 메소드를 사용해, Worksheets("Sheet1").Copy after := Worksheets("Sheet3") 라고 코딩하면 됩니다.  Copy 메소드는 Range 개체에도 적용되는데, 셀 A1을 복사해 클립보드에 두려면, Range("A1").Copy 라고 코딩하면 되고, 클립보드에 복사된 내용을 셀 B1에 복사하려면 PasteSpecial 메소드를 사용해 Range("B1").PasteSpecial Paste =xlPasteAll 라고 코딩하면 됩니다.

4.  이벤트(Event)

속성과 메소드는 값을 설정하거나 어떤 일을 할 때 사용되므로, 코딩에서 주로 사용됩니다.   하지만, 이벤트는 코딩에서 사용되기 보다는, 코딩을 하는 장소를 제공한다고 할 수 있습니다.  어떤 일이 벌어졌을 때, 어떤 일을 한다고 하는 경우에, 어떤 일이 벌어졌을 때가 이벤트입니다.

Change

Worksheet에서 셀 값을 변경했을 때, 어떤 일이 자동으로 이루어 이루어 지도록 하고자 한다면, Worksheet에서 셀 값이 변경됐을 때를 의미하는, Worksheet의 Change 이벤트를 사용하면 됩니다.  

Worksheet의 Chage 이벤트 서브 프로시저(Sub Procedure)에, 자동으로 이루어지도록 하고자 하는 어떤 일을 코딩하면, 사용자가 Worksheet에서 셀 값을 변경하여 입력하면, Worksheet의 Change 이벤트 서브 프로시저에 코딩 된 작업이 수행됩니다.

사용자가 엑셀 시트 상에서 값을 입력했을 때도 Change 이벤트가 발생하며, 코드 상에서 Range("B3").Value = 7 이라고, 셀 값을 입력해도 Change 이벤트가 발생합니다.

셀에 들어 있는 공식의 계산에 의해 셀 값이 변경되었을 때는 Change 이벤트가 발생하지 않습니다.  이 경우에는 Calculate 이벤트가 발생합니다.  예를 들어, 셀 A1에 "= 3 * B3" 라는 공식이 입력되어 있는 상태에서, Range("B3").Value = 7 이라고 코딩하면, 셀 B3의 값이 7로 변경되었으므로, Change 이벤트가 발생하지만, 셀 A1의 값이 3 * 7 = 21로 변경된 것은 Change 이벤트를 발생시키지 않고, Calculate 이벤트를 발생시킵니다.

Change 이벤트가 발생하면, 변경된 셀이나 셀 범위가 Target 이라는 Range 개체로 되돌려지기 때문에, 변경된 셀이나 셀 범위을 알 수 있습니다.   Change 이벤트 서브 프로시저에서 어떻게 Target Range 개체를 사용하는지는 실제 사용 예에서 설명하기로 하겠습니다.

Calculate

위에 설명한 대로, Calculate 이벤트는 Worksheet에서 셀에 입력된 공식이 계산될 때 발생합니다.  Calculate 이벤트의 단점은, 어느 셀의 공식이 계산되었는지 알 수 있는 Target 이라는 Range 개체를 사용할 수가 없다는 점입니다.   Worksheet에서 어느 한 공식이라도 계산이 되면 Calculate 이벤트가 발생합니다.

Activate

Worksheet가 Activate 되었을 때 발생합니다.  Activate란 현재 창이라는 의미입니다.  예를 들어, 사용자가 Sheet1이 현재 창인 상태에서 Sheet2를 눌러 Sheet2가 현재 창이 되었을 때, Sheet2의 Activate 이벤트가 발생합니다.

 

5.  Range 개체

엑셀 VBA 가장 많이 사용하는 개체가 Range 개체입니다.  Range 개체는 엑셀의 셀을 나타냅니다.  하나의 셀을 나타내기도 하고, 한 직각 사각형 범위의 셀들을 나타내기도 하고, 여러 직각 사각형 범위의 셀의 집합을 나타내기도 합니다.

속성에서 언급하였듯이, 하나의 셀 B3을 나타낼 때는 Range("B3")라고 나타냅니다.  Range("b3")와 같이 대문자 대신에 소문자를 사용해도 됩니다.

셀 B3이 좌측 상단의 셀이고, 셀 E7 우측 하단의 셀인 직사각형 셀 범위는, Range("B3:E7") 이라고 나타낼 수도 있고, Range("B3", "E7")라고 나타낼 수도 있습니다.

여러 직사각형 범위 셀의 집합은 Range("F3:K7, C9:G11, A1:B2")와 같이 나타낼 수 있습니다.

이 밖에도 Range 개체를 사용해, 셀을 나타내는 방법은 많이 있는데, 나중에 필요할 때 설명하기로 하겠습니다.

6.  Cells 속성으로 Range 개체 나타내기

Worksheet 개체의 속성 가운데, 셀을 나타낼 수 있는 Cells 속성이 있습니다.   셀 B3는 Cells(3, 2)로 나타냅니다.  즉, Row와 Column의 위치가 Range 개체와 반대이면서, B3라고 나타내는 대신에 숫자로 위치를 나타냅니다.   엑셀에서 셀의 위치를 나타낼 때, B3와 같은 방식으로 나타내는 방식을 "A1" 방식이라고 하며, Cells에서와 같이 숫자로 나타내는 방식을 "R1C1" 방식이라고 합니다.   R은 Row를, C는 Column을 의미합니다.

Cells 형식으로 나타내면 Column의 경우 숫자를 세어야 함으로 불편하지만, 셀의 위치를 숫자로 나타낼 수 있으므로, 반복 계산 등을 위해 Loop를 거는 경우에 편리합니다.

7. ActiveWorkbook, ActiveSheet, ActiveCell 속성

현재 열려져 있는 Workbook, Worksheet, Cell 개체를 되돌려 줍니다.   코딩에서 상위 개체가 생략되어 있는 경우에는, 현재 열려져 있는 개체를 의미합니다.

예를 들어, 현제 열려져 있는 Worksheet의 셀 B3을 나타낼 때, ActiveSheet.Range("B3")라고 해도 되고, 그냥 Range("B3")라고 해도 됩니다.  하지만 현재 열려져 있는 Worksheet가 Sheet1인 상태에서 Sheet2의 셀 B3를 나타내려면, Worksheets("Sheet2").Range("B3")라고 해야 합니다.  이 표현에서도 Workbook의 표현이 빠져 있으므로, 현재 열려져 있는 Workbook의 Sheet2를 의미합니다.

 


Copyright (c) 2004 ENGSoft Inc., Seoul, Korea, All right reserved.