VBA 프로그래밍의 기초 -...

56
VBA 프로그래밍의 기초 (Fundamental of VBA)

Transcript of VBA 프로그래밍의 기초 -...

Page 1: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

VBA 프로그래밍의 기초(Fundamental of VBA)

Page 2: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

차 례 1. VBA란?

2. 매크로기록기

3. 프로시저

4. 변수와 연산자

5. 조건판단문

IF THEN ELSE 문

SELECT CASE 문

6. 반복문

FOR...NEXT 문

FOR EACH~NEXT 문

DO...LOOP 문

7. 문자열함수

STRCOMP함수

STRCONV함수

LEN함수

FORMAT함수

INSTR함수

LEFT함수

MID함수

RIGHT함수

LTRIM,TRIM,RTRIM함수

기타문자열 함수

8. 날짜함수

현재시점 알아내기

필요부분만 추출하기

날짜와 시간조각을 붙여놓기

날짜연산

9. 수학함수

수학함수 및 파생함수

삼각함수 및 파생함수

재무함수 및 파생함수

Page 3: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

수치변환

10. 텍스트파일 핸들링

파일핸들 또는 파일번호

파일 열기와 닫기

파일 읽기와 쓰기

파일 열기 대화상자

Page 4: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

VBA 란? VBA 란 마이크로소프트 오피스에 포함된 일종의 베이직 프로그래밍 언어이다. 특히 금융계에서는 가장 많이 사용하는 오피스 프로그램중 하나인 엑셀의 VBA 를 이용하여 수식과 함수만으로 해결하지 못하는 많은 일을 하고 있다. 여기에서는 VBA 에 대한 기본적인 이해를 돕고자 한다.

마이크로소프트 오피스 4.x 버전에서 처음으로 VBA 가 도입된 이후 이제는 VBA 에 관한 많은 정보를 얻을 수 있다. VBA 프로그래밍에 입문할 수 있는 여러 종류의 책이 서점의 서가에 꽂혀있고 선량한 네티즌이 자신의 VBA 지식을 인터넷에 올려 두고 있다. 그래서 많은 사람들이 VBA 를 할 수 있으리라 생각했는데, 돈 주고 산 책을 봐도 모르겠다는 사람들을 종종 만난다.

프로그래밍을 어려워하는 그들은 VBA 가 처음 해보는 프로그래밍 언어라는 공통점이 있는데 결국 그들에게 어려운 것은 VBA 가 아니라 프로그래밍 그 자체인 것이다.

VBA 는 다음과 같은 장점을 가지고 있다.

• •

베이직이 기반이므로 쉽다. 따라서 프로그래밍분야에 입문하기 쉽다.

별도로 프로그래밍 도구가 필요 없다. 마이크로소프트 오피스(이하 오피스)가 있으면 어디서든 프로그래밍을 할 수 있다.

실용적이라는 점이다. 사무실에서 가장 많이 사용하는 업무프로그램이 오피스이며 업무처리를 빠르고 편하게 정확하게 도와줄 것이다. 다른 언어로는 VBA만큼 쉽고 빠르게 개발할 수 없을 것이다.

네 번째 장점은 이 글을 좀 더 읽어 보시면 나올 것이다.

VBA 는 마이크로소프트의 베이직 가족 중 하나이며 마이크로소프트 비주얼베이직이 오피스 제품에 들어간 것이다. 지금은 오피스뿐만 아니라 드로잉 도구인 비지오, 오토캐드와 같은 여러 제품에도 VBA 가 포함되어 있다. VBA 는 베이직 언어로서의 본래의 기능(수치 연산, 문자열 조작, 파일 처리)뿐만 아니라 해당 어플리케이션을 조작하고 다룰 수 있는 기능을 제공한다.

엑셀 VBA 의 경우 베이직 언어로서 무언가를 계산한 결과나 그 과정을 워크시트에 기록하거나 워크시트의 값을 읽어 원하는 계산을 수행한다. 그리고 새로운 워크시트를 삽입하거나, 차트를 자동으로 그려주거나 사용자 정의 메뉴를 만들어 주는 등 엑셀을 조작한다.

파워포인트 VBA 라면 슬라이드, 그리기 개체, 애니메이션을 다룰 수 있도록 해줄 것이다. 아웃룩 VBA 경우 메일, 일정, 연락처, 작업일지 등등에 관한 조작을 자동화해 줄 것이다.

Page 5: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

즉 VBA 은 해당 어플리케이션에서의 반복적인 작업, 불편한 작업, 어프리케이션이 지원해주지 않는 작업등을 도와주는 베이직 언어의 일종이다. 마이크로소프트는 여러 종류의 베이직언어를 개발하였고 다음은 여러 베이직 언어이다.

베이직언어 사용영역 Quick BASIC DOS

Visual BASIC Windows

VBA Microsoft Office, AutoCAD

VBScript HTML, ASP(Active Server Page), WSH(Windows Shell Host)

위에서 본 것과 같이 베이직 가족들은 여러 분야에서 활동하고 있다. 활동 분야가 다를 뿐, 그들은 모두 베이직 언어를 기반으로 하고 있다. 따라서 여러분이 VBA 를 익히고 나면 다른 활동 분야의 베이직 언어를 쉽게 배울 수 있을 것이다. 하나를 배워 다양한 분야에서 사용할 수 있는 경우는 그리 흔치 않다. 이것이 VBA 의 네 번째 장점이다.

Page 6: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

매크로 기록기 VBA 를 배우는 방법 중 하나는 매크로 기록기를 활용해보라는 것이다. 매크로 기록기는 사용자의 작업을 기록하여 VBA 코드를 자동으로 만들어 준다. 그러나 모든 오피스 애플리케이션에서 매크로 기록기가 사용 가능한 것은 아니다. 다행히 엑셀은 훌륭한 매크로 기록기가 제공한다. 필자도 종종 프로그래밍작업 중 이를 이용하여 코딩을 한다.

매크로 기록기는 훌륭한 도구이지만 단순히 기록만 하기 때문에 사용자가 원하는 작업을 위해서는 기록된 코드를 수정해주어야 한다. 더구나 엑셀의 모든 작업을 기록할 수 있는 것은 아니다.

<참고- VBA 를 쉽게 배우는 방법>

마이크로소프트사에서는 VBA 를 쉽게 배우는 방법에 대해 다음과 같이 4 가지의 권고를 하고 있다. 그들에 따르면,

1. 우선 Microsoft Office 를 배우십시오.

Office 에 대해 더 많이 알수록, Visual Basic 에 더 쉽게 뛰어들 수 있습니다. 대부분의 Visual Basic 프로시저는 Office 에서 일련의 동작을 수행하고, 프로시저에서의 대부분의 명령은 Office 명령이나 동작과 같습니다.

따라서, Visual Basic 작업은 사용자 인터페이스 없이 Office 작업을 하는 것과 유사하며, 대화 상자에서 명령과 옵션을 선택하는 대신, Visual Basic 명령을 작성합니다.

명령을 작성하는데 사용한 문과 함수는, Office 에서 표현한 기능에 이미 익숙한 경우, 더욱 이해하기 쉬워집니다.

또한, Office 에 대해 잘 아는 경우, 매크로를 작성할 때 스스로에게 자주 묻는 질문, 즉 "매크로를 작성하는 가장 좋은 방법은 무엇일까?"에 잘 답할 수 있습니다. 단일 Office 명령에 의해 처리될 수 있는 작업에 사람들은 보통 긴 매크로를 작성하고 있습니다.

2. 무엇이 필요하고 그것이 언제 필요한지 파악하는 것이 필요합니다.

현재 작업에 무엇이 필요한지 파악하십시오. Visual Basic 은 처음 보기에는 매우 어려워 보일 수 있습니다. 특히, 프로그래밍 언어에 대한 경험이 없는 경우에는 더욱 그렇습니다.

Visual Basic 학습을 시작하는 좋은 방법은 특정 작업을 프로그램적으로 완성하는 방법을 연구하는 것입니다. 여러 다른 형식의 작업을 자동화하는 프로시저를 작성하는 경험을 얻게 되면, 많은 기초를 얻게 됩니다.

3. 매크로 레코더를 사용하십시오.

매크로 레코더(Microsoft Excel, Word, PowerPoint 와 함께 사용할 수 있는 기능)는 Office 에서의 사실상 모든 동작에 해당하는 Visual Basic 명령을 기록할 수 있습니다.

Page 7: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

매크로 레코더를 사용하여 Office 에서 수행되는 동작이 어떻게 Visual Basic 명령으로 번역되는지를 알 수 있으며, 그 반대도 마찬가지입니다. 또한, 매크로 일부를 기록하는 것이 명령을 작성하는 것보다 종종 더 빠르고 쉽다는 것을 알 수 있습니다.

4. Visual Basic 도움말을 사용하십시오.

도움말은 Visual Basic 을 배울 수 있는 매우 유용한 도구입니다. Visual Basic 모듈에서, 키워드를 입력하고 삽입 포인터를 키워드의 아무 곳에나 놓은 채, <F1>을 눌러 그 키워드에 대한 Visual Basic 도움말 항목을 바로 표시할 수 있습니다. 키워드에 대한 대부분의 Visual Basic 도움말 항목에는 매크로에 복사하고 붙여 을 수 있는 예제가 포함되어 있습니다.

다음은 매크로 기록기를 사용하여 기록된 매크로의 예이다. 간단히 B2 셀에 ‘금융공학 프로그래밍’을 입력하고 셀 서식을 변경하였다.

비교적 간단한 작업임에도 필요없는 코드가 너무 많다. 또한 유연성 역시 부족하다. 그래서 매크로 기록기 만으로는 프로그래밍을 할 수 없다. 단지 코드만 참조하는 용도이다.

Sub Macro1() '

' Macro1 Macro

' pp이(가) 2005-01-14에 기록한 매크로 '

Range("B2").Select

ActiveCell.FormulaR1C1 = "금융공학 프로그래밍" Range("B2").Select

Columns("B:B").EntireColumn.AutoFit

With Selection .HorizontalAlignment = xlCenter

.VerticalAlignment = xlCenter

.WrapText = False .Orientation = 0

.AddIndent = False

.IndentLevel = 0 .ShrinkToFit = False

.ReadingOrder = xlContext

.MergeCells = False End With

With Selection.Font

.Name = "굴림" .FontStyle = "보통"

.Size = 10

.Strikethrough = False .Superscript = False

.Subscript = False

.OutlineFont = False .Shadow = False

.Underline = xlUnderlineStyleNone

.ColorIndex = xlAutomatic End With

Selection.Borders(xlDiagonalDown).LineStyle = xlNone

Selection.Borders(xlDiagonalUp).LineStyle = xlNone

Page 8: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

Selection.Borders(xlEdgeLeft).LineStyle = xlNone

With Selection.Borders(xlEdgeTop) .LineStyle = xlDash

.Weight = xlThin

.ColorIndex = 46 End With

With Selection.Borders(xlEdgeBottom)

.LineStyle = xlDouble .Weight = xlThick

.ColorIndex = 46

End With Selection.Borders(xlEdgeRight).LineStyle = xlNone

With Selection.Interior

.ColorIndex = 15 .Pattern = xlSolid

.PatternColorIndex = xlAutomatic

End With End Sub

이제 초보자를 위하여 VBA 에 대한 기본적인 설명을 하였다. 다음 장에서는 VBA 에 대한 간단한 구문소개와 실습을 위한 코드와 설명을 일사천리로 진행하려고 한다.

여기서 나열하는 내용이 VBA 의 전부는 아니지만 프로그래밍에 필수적인 것만 골랐다. 프로그램이라는 것이 간단히 말하자면 사용자로부터 데이터를 입력받고 이를 처리하고 그 결과를 사용자에게 보여주는 것이다.

어느 프로그래밍 언어이든 기본적인 내용을 엇비슷하다. 데이터를 저장하기 위한 변수가 있고 연산도중 주어진 조건을 참이나 거짓으로 판단하는 조건 판단문과 일정한 작업을 계속 반복하기 위한 반복구문 등등이 있다.

그러한 관점에서 여러분은 엑셀의 워크시트에 데이터를 입력하고 이를 읽어 연산처리하고 그 결과를 워크시트에 기록하면 된다. 다행히 그에 필요한 VBA 구문이 많이 필요하지 않다. 더 필요한 내용을 VBA 에 대한 전문서적을 참고하길 바란다.

Page 9: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

프로시저 VBA 프로그램은 프로시저 단위로 구성된다. 간단한 프로그램이라면 하나의 프로시저로만 구성되지만 좀 복잡한 경우 기능별로 나눠 여러 개의 프로시저로 구성한다.

보통 초보자라면 하나의 프로시저에서 다 해결하는 식으로 작성하지만 초보를 벗어나면 프로그램을 여러 기능으로 나누어 각각의 고유한 기능을 수행하는 여러 개의 프로시저로 나누어 작성하게 된다. 다음은 보통의 프로그램 구조이다.

• •

프로그램이 한 개의 프로시저로 구성되는 경우

프로그램이 여러 개의 프로시저로 구성되는 경우

그리고 프로시저는 Sub프로시저와 Function 프로시저가 있다. Sub 프로시저와 Function 프로시저의 큰 차이점은 대강 다음과 같다.

Sub 프로시저 어떠한 작업을 코드 순서대로 실행하는 프로시저

Function 프로시저 어떠한 계산의 결과를 돌려주는 프로시저

VBA 프로그램은 모두 프로시저로 구성된다. 보통 Sub 프로시저와 Function 프로시저의 기본적인 구조는 다음과 같다.

Sub 프로시저이름 (매개변수)

코드

End Sub

Function 프로시저이름 (매개변수) As 리턴값의 타입

코드

프로시저이름 = 리턴값

End Function

위에서 “프로시저이름”은 필수이지만 “매개변수”와 “As 리턴 값의 타입” 은 필요에 따라 생략할 수 있다. 프로시저 이름에 대한 규칙은 다음과 같다.

• •

프로시저의 이름은 동일한 모듈 내에서 중복될 수 없다.

특수문자와 숫자로 시작할 수 없으며 한글이름도 가능하다.

Page 10: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

Sub Option1()

Dim payoff As Double Dim k As Double

Dim s As Double

Dim p As Double Dim response As String

p = 3000 k = 20000

payoff = payoff - p

response = InputBox("옵션 만기시점의 주식가격을 입력하세요", , k)

If Len(response) = 0 Then Exit Sub

s = CDbl(response)

If s > k Then

payoff = payoff + s - k End If

MsgBox "Payoff is " & payoff End Sub

위에서 Option1 은 프로시저의 이름이며 이것은 Sub 프로시저이다. 그리고 Option1 다음에 빈 괄호가 있는 데, 매개변수가 없더라도 괄호는 생략할 수 없다.

Function VanillaPayoff(iOpt As Integer, s As Double, x As Double) If iOpt = 1 Then

VanillaPayoff = Max(s - x, 0)

ElseIf iOpt = -1 Then VanillaPayoff = Max(x - s, 0)

End If

End Function

위의 예는 VanillaPayoff 라는 이름을 가진 Function 프로시저이다. 괄호안에는 iOpt, s, x 등 3 개의 매개변수가 있다. 즉 이 Function 을 이용하려면 3 개의 매개변수에 값을 주어야 한다.

Page 11: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

변수와 연산자 프로그램에서 다루는 데이터는 여러 종류이다. 문자열, 숫자, 참/거짓 등등 이렇게 다양한 종류의 데이터를 저장하기 위한 것이 변수이다. 엑셀에서는 숫자, 문자와 같은 데이터 외에 워크북,워크시트, 셀 범위 등등을 저장할 수 있는 변수를 선언할 수 있다. 변수선언은 다음과 같은 형식으로 사용할 수 있다.

Dim 변수이름 As 데이터형

엑셀 VBA 에서 다음과 같은 데이터형을 사용할 수 있다.

데이터 데이터형 정수 Byte, Integer, Long

실수 Single, Double

문자 String

날짜 Date

참거짓 Boolean

모든 데이터 Variant 혹은 ‘As 데이터형’ 생략

워크북 Workbook

워크시트 Worksheet

셀 범위 Range

Sub Option1()

Dim payoff As Double Dim k As Double

Dim s As Double

Dim p As Double Dim response As String

p = 3000 k = 20000

payoff = payoff - p

response = InputBox("옵션 만기시점의 주식가격을 입력하세요", , k)

If Len(response) = 0 Then Exit Sub

s = CDbl(response)

If s > k Then

payoff = payoff + s - k End If

MsgBox "Payoff is " & payoff End Sub

Page 12: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

보통 변수는 하나의 데이터만을 저장하지만 주식종가와 같은 연속적인 데이터처럼 여러 개의 데이터를 하나의 이름으로 저장하기 위한 변수를 사용하려면 배열을 사용한다. 배열이란 변수의 집합이라고 볼 수 있다. 배열의 선언은 변수와 비슷한 형식으로 선언한다.

Dim 배열명(배열의 크기) As 데이터형

배열의 크기는 보통 정수값을 지정한다. 그리고 배열내 원소는 0 번부터 시작한다. 따라서 배열의 크기를 10 으로 지정하면 배열내 원소번호는 0 부터 시작하여 10 까지 생성된다. 따라서 배열의 크기는 10+1 개가 된다. 가령 다음의 예를 살펴보자.

Dim Arr1(10) As Double

Dim Arr2(5) As Long

Arr1 은 0 부터 시작하여 10 까지 11 개의 원소를 가진 실수를 저장하는 배열이다. Arr2 는 0 부터 시작하여 5 까지 6 개의 원소를 가진 정수를 저장할 수 있는 배열이다. 그러나 배열은 시작 번호와 끝 번호를 지정하여 선언할 수 있다.

Dim Arr3(1 To 10) As Double Dim Arr4(2 To 5) As Long

Arr3 은 1 부터 시작하여 10 까지 10 개의 원소를 가진 실수를 저장하는 배열이다. Arr4 는 2 부터 시작하여 5 까지 4 개의 원소를 가진 정수를 저장할 수 있는 배열이다. 배열의 크기를 반드시 지정할 필요는 없다. 그러나 나중에 사용을 하려면 ReDim을 사용하여 배열의 크기를 지정할 수 있다.

Dim Arr5() As Double

ReDim Arr5(11)

Sub Historical_Volatility()

Dim closeprice() As Double

Dim yld() As Double Dim i As Long

Dim stdev As Double

Dim yld_year As Double

ReDim closeprice(1 To 11)

ReDim yld(2 To 11)

closeprice(1) = 969

closeprice(2) = 989 closeprice(3) = 995

closeprice(4) = 957

closeprice(5) = 915 closeprice(6) = 880

closeprice(7) = 858

closeprice(8) = 859 closeprice(9) = 848

closeprice(10) = 836

closeprice(11) = 845

Page 13: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

For i = LBound(closeprice) + 1 To UBound(closeprice) yld(i) = Log(closeprice(i) / closeprice(i - 1))

Next

stdev = Application.WorksheetFunction.stdev(yld())

yld_year = stdev * Sqr(52)

Debug.Print Format(stdev, "0.00%")

Debug.Print Format(yld_year, "0.00%")

End Sub

배열의 각 원소에 값을 쓰거나 읽는 경우 괄호안에 배열의 원소번호를 지정하여 사용한다. 위의 예에서 ‘closeprice(11)=845’와 같은 행이 그것이다. 11 은 closeprice 라는 배열의 원소인덱스이다.

배열과 관련하여 LBOUND()함수는 배열의 가장 작은 원소번호를 돌려 준다. UBOUND()함수는 배열의 가장 큰 원소번호를 돌려 준다.

LBound(Arr3) – 1을 돌려준다

UBound(Arr3) – 10을 돌려준다 LBound(Arr4) – 2를 돌려준다

UBound(Arr4) – 5를 돌려준다

연산자는 산술연산자, 논리연산자, 비교연산자 등이 있다. •

산술연산자란 덧셈, 뺄셈, 곱셈, 나눗셈 계산을 하기 위한 연산자이다.

비교연산자란 두 개의 값을 가지고 크거나 작거나 혹은 같음을 판단하여 TRUE 값이나 FALSE 값을 돌려주는 연산자이다.

논리연산자란 논리합, 논리곱 등을 말한다. 연산의 결과 주어진 조건이 만족하면 TRUE, 만족하지 않으면 FALSE을 돌려준다.

산술연산자 설명 예 결과

+ 더하기 10+5 15

- 빼기 10-5 5

* 곱하기 10*5 50

/ 나누기 10/5 2

₩ 정수나누기 11₩5 2

^ 지수 10^5 100000

Mod 나머지 10 Mod 5 0

- 음수 -10 -10

& 문자열 연결 “AB” & “CD” “ABCD”

₩는 나누기이지만 몫인 정수값을 돌려주는 나누기이다. 11/5 의 결과는 2.2 이지만 11₩5의 결과는 2 이다.

Mod 는 나누고 난 나머지를 돌려준다. 11 Mod 5 의 결과는 1 이다

Page 14: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

-는 빼기 기호와 같지만 부호를 반대로 돌리는 연산자이다. 플러스(+)는 마이너스(-)로, 마이너스(-)는 플러스(+)로 부호를 반대로 바꾼다.

& (‘앰퍼샌드’라고 부른다) 연산자는 문자열을 연결하여 하나의 문자열로 만드는 연산자이다.

비교연산자 설명 예 결과

> 크다 10>5 TRUE

< 작다 10<5 FALSE

>= 크거나 작다 10>=5 TRUE

<= 작거나 같다 10<=5 FALSE

= 같다 10=5 FALSE

<> 같지 않다 10<>5 TRUE

Like 비슷하다 “VBA” Like “V?A” TRUE

Sub demo_Comparison_Operators1()

Debug.Print 1 > 2 'False 값을 돌려준다.

Debug.Print 3 < 4 'True 값을 돌려준다. Debug.Print 5 <> 6 'True 값을 돌려준다.

End Sub

비교연산자는 보통 숫자의 크고 적음을 판별하기도 하지만 문자의 순서도 판단하기도 한다. 문자의 순서라는 것은 가, 나, 다, 라,… 와 같이 사전식 순서를 의미한다.

알파벳의 경우 A, B, C, D,…,Z,a,b,c,d,…,z 의 순서이다. 즉 소문자가 대문자보다 크고 뒤에 오는 문자가 앞의 문자보다 크다. 따라서 “B”가 “A”보다 크고 “a”가 “A”보다 크다. 다음의 예제를 보자.

Sub demo_Comparison_Operators2()

Debug.Print "A" > "a" 'False 값을 돌려준다.

Debug.Print "A" < "B" 'True 값을 돌려준다. Debug.Print "A" <> "a " 'True 값을 돌려준다.

End Sub

논리연산자 설명 A And B 양쪽이 모두 True 이면 True, 그렇지 않으면 False

A Or B 양쪽 중 적어도 하나가 True 이면 True, 양쪽이 모두 False 이면 False

Not A A 가 True 이면 False, False 이면 True

A Xor B 양쪽이 모두 True 또는 False 이면 False, 그렇지 않으면 True

A Eqv B 양쪽이 모두 True 또는 False 이면 True, 그렇지 않으면 False

A Imp B A 가 True 이고 B가 False 이면 False, 그렇지 않으면 True

Page 15: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

조건판단문 조건 판단문은 주어진 수식을 평가하여 참과 거짓을 구분하고 결과에 따라 다른 구문으로 실행을 옮기는 일을 한다.

1.IF THEN ELSE 문 가장 대표적인 조건판단문이 IF 구문이다. 앞서 설명한 비교 또는 논리연산자를 이용하여 조건식을 만들어 그 결과에 따라 달리 실행하도록 하는 것이다. IF 문은 다음과 같은 형식으로 사용한다.

If 조건1 Then

조건1이 참인 경우

ElseIf 조건2 Then

조건2가 참인 경우

Else

어느 조건도 아닌 경우

End If

Sub demo_Block_If( ) Dim A As Integer A = -21 If A > 0 Then MsgBox "A is greater than zero" ElseIf A < 0 Then MsgBox "A is lese than zero" Else MsgBox "A is zero" End If End Sub

위의 예에서 A 라는 변수는 -21 을 저장하고 있다. 그리고 If A>0 Then 문을 만나 A 라는 변수의 값을 판단한다. -21 은 0 보다 작아 If A>0 Then 문은 거짓이 되어 Then 이라 문장(MsgBox “A is greater than zero”)을 실행하지 않고 다음의 ElseIf A<0 Then 을 만나 판단을 하게 된다.

Page 16: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

2.SELECT CASE 문 하나의 조건식이나 변수로 여러 조건을 검사하고자 하는 경우 중첩된 블록 If 문을 사용할 수 있는데 이보다는 Select Case 문을 이용하는 것이 한결 간결하고 편하다.

Select Case 문은 식의 값에 따라 몇 개 그룹의 문 중의 하나를 실행한다. Select Case 문은 다음과 같은 형식으로 작성한다.

Select Case 조건식이나 변수

Case 비교대상1

실행문1

Case 비교대상2

실행문2

Case Else

실행문3

End Select

조건식이나 변수가 Case 문 비교대상에 부합하는 경우 Case 절 이후의 문을 수행한 후 End Select 문 다음의 문으로 넘어간다. Case Else 절은 다른 Case 문의 비교대상 중 조건식이나 변수와 부합하는 조건이 하나도 없는 경우 사용한다.

예상치 않은 경우를 처리하기 위하여 Select Case 문에 Case Else 문을 함께 사용한다. 각 Case 절 안에서 여러 식이나 범위를 사용할 수 있다. 예를 들면 다음과 같은 표현도 유효하다.

Case 1 To 4, 7 To 9, 11, 13, Is > 최대값

Sub demo_SelectCase() Dim Number As Byte Number = 8 Select Case Number Case 1 To 5 MsgBox "Between 1 and 5" Case 6, 7, 8 MsgBox "Between 6 and 8" Case Is > 8 And Number < 11 MsgBox "Greater than 8" Case Else MsgBox "Not between 1 and 10" End Select End Sub

위의 예에서 Number 라는 변수는 8 을 가지고 있으며 Select Case 문을 만나 여러가지 조건을 한번에 판단하게 된다.

Page 17: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

Number 변수는 Case 6,7,8 이라는 문과 일치하므로 MsgBox “Between 6 and 8” 을 실행하게 된다.

Page 18: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

반복문 반복문은 일정 문장을 미리 주어진 횟수만큼 반복하거나 주어진 조건이 만족할 때 가지 반복하는 구문이다.

1.FOR...NEXT 문 For...Next 사이의 문을 지정한 횟수만큼 실행한다.

For 카운터변수= 시작값 To 끝값 [Step step인수]

ㆍㆍㆍ

Next 카운터변수

카운터변수는 시작 값에서 출발하여 끝 값에 이르기까지 그 사이의 문장을 실행하는데 step 인수를 정해주지 않으면 1 씩 증가한다. step 인수는 양수 및 음수 모두 사용할 수 있다.

루프 안의 모든 문을 실행하고 나면, 카운터변수에는 step 인수값이 더해진다. 이때 루프를 더해진 값과 끝값을 비교하여 더해진 값이 끝 값보다 크면 루프를 종료한 후 Next 문 다음의 문을 계속하여 실행한다.

Sub Historical_Volatility()

Dim closeprice() As Double

Dim yld() As Double Dim i As Long

Dim stdev As Double

Dim yld_year As Double

ReDim closeprice(1 To 11)

ReDim yld(2 To 11)

closeprice(1) = 969

closeprice(2) = 989 closeprice(3) = 995

closeprice(4) = 957

closeprice(5) = 915 closeprice(6) = 880

closeprice(7) = 858

closeprice(8) = 859 closeprice(9) = 848

closeprice(10) = 836

closeprice(11) = 845

For i = LBound(closeprice) + 1 To UBound(closeprice)

yld(i) = Log(closeprice(i) / closeprice(i - 1)) Next

stdev = Application.WorksheetFunction.stdev(yld()) yld_year = stdev * Sqr(52)

Page 19: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

Debug.Print Format(stdev, "0.00%")

Debug.Print Format(yld_year, "0.00%") End Sub

Page 20: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

2.FOR EACH IN~NEXT 문 For~Next 문과 비슷하다. 보통 For~Next 문이 카운터를 늘리거나 줄여가며 정해진 횟수만큼 반복하는 것이라면 이것은 주어진 개체 컬렉션(개체들의 모음)내에서 각 개체를 반복하는 것이다.

사실 반복보다는 주어진 개체집합에서 각 개체마다 접근하여 주어진 작업을 하는 것이기 때문에 순회라는 단어가 어울릴 것 같다. 자주 접하는 컬렉션으로는 Workbooks, Sheets, Range 등등이 사용된다.

For Each 개체변수 In 개체컬렉션

Next

가령 하나의 통합문서에 워크시트가 16 개가 있고 각 워크시트의 이름을 바꾼다면 다음과 같을 것이다.

Sub Change_Sheets_Name Dim sht As Worksheet Dim Num As Integer Num=1 For Each sht In ThisWorkbook.Sheets Sht.Name=“나의 ” & Num & “번째 워크시트” Num=Num+1 Next End Sub

For Each~Next 는 일반적인 반복문과는 약간 다르다. For~Next 가 주어진 횟수만큼 반복하는 것이지만 For Each~Next 는 지정된 집합(컬렉션)내 각각의 원소를 순환하는 것이다. 마치 지하철 2 호선내 각 역을 전철이 순환하며 손님을 태우고 내려주는 일을 반복하는 것을 연상하면 쉬울 것이다.

이러한 개념을 굳이 프로그래밍 코드로 비유하자면 다음의 코드의 결과는 잠실역, 신천역,종합운동장역,…,성내역과 같은 것이 될 것이다.

For Each 지하철역 In 지하철 2호선의 역 … Next

Page 21: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

3.DO...LOOP 문 조건이 True 인 동안 또는 True 가 될 때까지 Do...Loop 문의 한 블록을 반복한다.

① Do While 조건식~Loop문

Do While 조건식

ㆍㆍㆍ

Loop

Do While~Loop문은 조건을 먼저 검사한 후 조건이 참(True)인 동안 거꾸로 말하면 조건이 거짓이(False) 될 때 까지 블록안의 문장을 수행한다.

② Do Until 조건식~Loop문

Do Until 조건식

ㆍㆍㆍ

Loop

Do Until~Loop문은 조건을 먼저 검사한 후 조건이 참(True)일 때까지 거꾸로 얘기하면 조건이 거짓인 동안 블록안의 문장을 수행한다.

③ Do~Loop While 조건식

Do

ㆍㆍㆍ

Loop While 조건식

Do~Loop While문은 먼저 블록안의 문장을 실행한후 조건을 검사하여 조건이 참(True)인 동안 거꾸로 말하면 조건이 거짓이(False) 될 때까지 블록안의 문장을 수행한다.

④ Do~Loop Until 조건식

Do

ㆍㆍㆍ

Loop Until 조건식

Page 22: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

Do~Loop Until문은 먼저 블록 안의 문장을 실행한 후 조건을 검사하여 조건이 참(True)일 때까지 거꾸로 얘기하면 조건이 거짓인 동안 블록 안의 문장을 수행한다.

⑤ Do~Loop

Do

ㆍㆍㆍ

Loop

Do~Loop문은 조건식 없이 사용할 수 있는데 이 경우 무한루프를 돌게 된다. 또한 Do~Loop 역시 중첩되게 사용할 수 있다. 루프를 빠져나오려면 ‘Exit Do’를 사용한다. 다음은 Do~Loop 에 대한 예이다. 모든 프로시저가 1~10 까지의 합(55)을 계산한다

Sub demoDoWhileLoop( ) Dim a As Integer Dim Sum As Integer Do While a <= 10 Sum = Sum + a a = a + 1 Loop MsgBox Sum End Sub

Do~Loop 문은 For~Next 와 같이 자주 사용하는 반복문이다. For~Next 가 정해진 반복횟수를 가지는 반면 Do~Loop 는 정해진 횟수만큼 반복하는 것은 아니고 Do또는 Loop 다음에 위치한 조건문에 따라 반복한다. 따라서 반복하는 횟수는 가변적이다.

Page 23: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

문자열 함수

StrComp() 앞서 비교연산자를 소개하였지만 다양한 가능을 가진 비교함수로

StrComp()가 있다. 이는 비교결과를 숫자로 알려주는데 다음과 같이

사용한다.

return값=StrComp(비교대상1, 비교대상2, 비교방식)

StrComp( )의 비교방식을 지정하는 옵션(상수)은 다음 표와 같다.

옵션 값 비교방식 vbBinaryCompare

0 이진비교(Option Compare Binary)

vbTextCompare 1 Text 비교(Option Compare Text)

*옵션은 생략가능하며 생략시에는 Option Compare에 따른다.

StrComp( )의 결과값은 다음과 같다.

결과값 설명 -1 비교대상 1<비교대상 2

0 비교대상 1=비교대상 2

1 비교대상 1>비교대상 2

Sub demoStrComp() Dim MyStr1 As String

Dim MyStr2 As String

MyStr1 = "ABCD"

MyStr2 = "abcd"

'Text 비교, 0을 반환하며 둘이 같다

MsgBox StrComp(MyStr1, MyStr2, 1)

'이진비교, -1을 반환하며 MyStr1이 MyStr2보다 작다.

MsgBox StrComp(MyStr1, MyStr2, 0)

'생략하면 Option Compare의 지정에 따른다.

MsgBox StrComp(MyStr1, MyStr2)

End Sub

Page 24: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

StrConv( ) VBA는 문자열을 대소문자나 유니코드 등으로 바꾸는 StrConv( )함수

를 제공한다. 사용법은 다음과 같다.

Return 문자열=StrConv(입력문자열, 변환옵션)

변환옵션은 다음과 같다.

변환옵션 값 설명 예 vbUpperCase 1 문자열을 대문자로 upper case→UPPER

CASE

vbLowerCase 2 문자열을 소문자로 LOWER CASE→lower case

vbProperCase 3 각 단어의 첫글자만 대문자로 proper case→Proper Case

vbWide 4 1byte 문자를 2byte 로(반각문자를 전각문자로)

wide→wide

vbNarrow 8 2byte 문자를 1byte 로(전각문자를 반각문자로)

narrow→narrow

vbKatakana 16 히라가나를 가타가나로

vbHiragana 32 가타가나를 히라가나로

vbUnicode 64 ANSI 에서 Unicode 로

vbFromUnicode

128 Unicode 에서 ANSI 로

*vbKatakana와 vbHiragana 는 일본어 버전에 한함.

Sub demoStrConv() MsgBox StrConv("upper case", vbUpperCase)

MsgBox StrConv("LOWER CASE", vbLowerCase)

MsgBox StrConv("proper case", vbProperCase) MsgBox StrConv("wide", vbWide)

MsgBox StrConv("narrow", vbNarrow)

End Sub

Len( )함수 Len( )함수는 문자열의 길이를 돌려준다. 혹시 “AB CD”처럼 공백을 문

자로 생각 않을 수 있는데 공백도 엄연히 하나의 문자이다. 종종 실무

에선 특정 문자열이 비어 있는가를 검사할 때도 사용하는데 빈 문자열

Page 25: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

을 검사하기 위해 보통 다음과 같은 코드를 작성하는데

If TestStr=”” Then

ㆍㆍㆍ End If

이보다는 Len( ) 함수를 사용하는 것이 더 빠르고 효율적이다. 사실 필

자는 얼마나 빠른지는 모르겠다. 그저 남들이 그러니까 그런가 보다 하

고 있다.

If Len(TestStr)=0 Then

ㆍㆍㆍ End If

Sub demoLen() MsgBox Len("ABCD")

MsgBox Len("AB CD")

MsgBox Len("가나다라") End Sub

Format( )함수 제품번호, 우편번호, 전화번호등과 같이 형식이 정해진 것을 문자열 포

맷이라 한다. 이렇게 포맷을 만들어 주는 함수가 Format()함수이다. 이

때 포맷을 지시하는 단일문자를 플레이스홀더(placeholder)라고 한다.

플레이스홀더 설명 @ 해당위치에 문자가 있으면 표시, 없으면 공백표시

& 해당위치에 문자가 있으면 표시, 없으면 표시 않음

> 모든 문자를 대문자로 표시

< 모든 문자를 소문자로 표시

! 플레이스홀더를 왼쪽에서 오른쪽으로 채움. 기본적으로 플레이스홀더는 오른쪽에서 왼쪽으로 채워나간다.

플레이스홀더(placeholder)는 Format( )함수와 같이 사용한다.

Format( )함수는 문자열 뿐만 아니라 숫자, 날짜/시간 등을 포맷팅 할

수 있다.

다음의 예를 통해 Format()함수와 플레이스홀더(placeholder)에 대해

알아 보자.

Page 26: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

① MsgBox Format("5653300", "(@@@)@@@-@@@@")

( )565-3300을 출력한다. 오른쪽에서 왼쪽으로 채워가므로

"(@@@)@@@-@@@@"의 (@@@)부분의 @플레이스홀더

(placeholder)는 아무 문자도 채워지지 않았으므로 ( )처럼 대신 빈공

백으로 @플레이스홀더(placeholder)를 채워 나간다.

② MsgBox Format("025653300", "(@@@)@@@-@@@@")

( 02)565-3300을 출력한다. 오른쪽에서 왼쪽으로 채워가므로

"(@@@)@@@-@@@@"의 (@@@)부분의 @플레이스홀더

(placeholder)중 첫플레이스홀더(placeholder)만 채워지지 않았으므로

( 02)처럼 첫플레이스홀더(placeholder)를 빈공백으로 채워 나간다.

③ MsgBox Format("5653300", "(&&&)&&&-&&&&")

()565-3300을 출력한다. 오른쪽에서 왼쪽으로 채워가므로

"(&&&)&&&-&&&&"의 (&&&)부분의 &플레이스홀더(placeholder)는

아무 문자도 채워지지 않았으므로 ()처럼 아무것도 채우지 않는다.

④ MsgBox Format("025653300", "(&&&)&&&-&&&&")

(02)565-3300을 출력한다. 오른쪽에서 왼쪽으로 채워가므로

"(&&&)&&&-&&&&"의 (&&&)부분의 &플레이스홀더(placeholder)중

첫플레이스홀더(placeholder)만 채워지지 않았으므로 (02)처럼 첫플레

이스홀더(placeholder)에는 아무 것도 채우지 않는다.

⑤ “>”와 “<”는 대소문자로의 변환을 의미하는데 대소문자변환은 이미

앞에서 배운 StrConv( )함수가 있다.

MsgBox Format("HELLO", "<") ' "hello"를 표시

MsgBox Format("This is it", ">") ' "THIS IS IT"을 표시

⑥ “!”은 플레이스홀더(placeholder)의 채우는 방향을 왼쪽에서 오른쪽

으로 바꾼다.

MsgBox Format("5653300", "!(@@@)@@@-@@@@")

Page 27: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

InStr( )함수 InStr( )함수는 대소문자를 구별하면서 어떤 문자열을 포함하고 있는 지의 여부를 판단하는 함수로 지정된 위치에서 찾기를 시작할 수 있다. 일반적으로 함수는 다음과 같이 사용할 수 있다.

결과값=InStr(시작위치, string1, string2, 찾는 방식)

string1은 조사대상이 되는 문자열이며 string2는 찾을 문자열이다. 위

에서 시작위치와 찾는 방식은 생략 가능한데 생략하면 시작위치는 첫

번째 문자위치가 되며 찾는 방식은 Option Compare의 지정에 따른다.

주의할 점은 찾는 방식이 지정되면 반드시 시작위치를 적어 주어야 한

다. 그렇지 않으면 런타임 에러가 생긴다. 찾는 방식 지정은

vbBinaryCompare, vbTextCompare등 StrComp( )의 옵션과 같다.

결과값은 찾는 문자열이 시작되는 위치로 나온다. 여러 결과에 대한 설

명은 다음 표와 같다.

조건 InStr 반환값

string1 길이는 0 0

string1 이 Null Null

string2 길이가 0 start

string2 가 Null Null

string2 가 발견되지 않음 0

string2 가 string1 내에서 발견 일치된 지점의 위치

start > string2 0

InStr (1, "Tech on the Net", "the") 는 9를 돌려준다. InStr ("Tech on the Net", "the") 는 9를 돌려준다.

InStr (10, "Tech on the Net", "t") 는 15를 돌려준다.

Left( )함수 반환문자열=Left(문자열,추출문자수)

Left( )함수는 문자열로부터 왼쪽에서 문자수만큼의 문자를 반환한다.

예를 들면 다음 코드는 지정된 문자열에서 첫번째 두 문자(“Th”)를 반

환한다.

Page 28: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

MsgBox Left(“This is a Test”,2)

Mid( )함수 반환문자열=Mid(문자열, 시작위치, 추출문자수)

Mid( )함수는 문자열중 시작위치에서 추출문자수만큼의 문자를 뽑아 반

환한다. 예를 들면 다음 코드는 지정된 문자열에서 여섯번째 두 문자

(“is”)를 반환한다.

MsgBox Mid(“This is a Test”, 6, 2)

Right( )함수 반환문자열=Right(문자열, 추출문자수)

Right( )함수는 Left( )함수와는 반대의 역할을 한다. 문자열의 오른쪽에

서 추출문자수만큼 문자를 뽑아 반환한다. 예를 들면 다음 코드는 지정

된 문자열에서 여섯번째 두 문자(“st”)를 반환한다.

MsgBox Right(“This is a Test”, 2)

LTrim, Trim, RTrim 함수 LTrim, Trim, RTrim함수는 문자열내의 공백을 제거한다. LTrim( )함수

는 공백이 아닌 문자가 시작되기전 왼쪽의 공백을 제거하고 Trim( )함

수는 문자열 양쪽의 공백을 제거한다. Rtrim( )함수는 문자열의 오른쪽

공백을 제거한다.

Sub demoTrim()

MsgBox LTrim(" This is a test. ") MsgBox Trim(" This is a test. ")

MsgBox RTrim(" This is a test. ")

End Sub

주의할 점은 중간의 공백은 제거하지 않는다.

Page 29: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

기타 문자열 함수

함수명 설명

InStrRev() 문자열 내에서 지정한 문자열의 위치를 오른쪽에서 지정한 위치부터 찾는다.

Split() 지정된 문자열을 기준으로 문자열을 나누어 배열을 반환한다.

Join() 문자열 변수의 배열을 연결한 문자열을 반환한다.

Replace() 문자열을 내의 문자를 지정한 문자로 바꾼다.

Space() 지정한 수 만큼의 공백 문자열을 반환한다.

StrReverse() 문자열의 순서를 거꾸로 만들어서 반환한다.

MonthName() 해당 숫자를 월로 표기한다.

WeekDayName() 해당 숫자를 요일로 반환한다.

UCase() 문자를 모두 대문자로 반환한다.

LCase() 문자를 모두 소문자로 반환한다.

Page 30: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

날짜 함수 VBA 에서 날짜는 8 바이트의 부동소수점(floating-point) 값이다. 정수부분은 1899 년 12 월 30 일 이후의 날짜이며 소수부분은 저장된 시간을 나타낸다.

예를 들어 1998 년 8 월 22 일 오후 3시는 36029.625 인데 정수부분인 36029 는 1998 년 8 월 22 일이 1899 년 12 월 30일 이후부터 36,029 번째 날이며 0.625 는 하루를 1 로 보았을 때 그 중 62.5%인 오후 3 시라는 의미이다.

<그림-Date 는 사실상 실수로 처리된다>

본격적인 날짜/시간관련 함수와 실행문을 설명하기 앞서 먼저 알아둘 것은 날짜 리터럴(literal)이다. VBA 에서 문자열은 “ ” 안에 둘러싸인 문자를 문자열로 보는 것과 마찬가지로 날짜표시는 # #사이에 둔다.

가령 1998 년 8 월 22 일은 #8/22/1998# 이고 오늘 오후 3시는 #03:00 PM#이다. 만일 둘을 묶어 표시하면 #8/22/98 3:00:00 PM#이다.

현재시점 알아내기 VBA 는 컴퓨터의 하드웨어에서 현재의 날짜, 시간 등을 읽어 오는데 다음과 같은 함수를 이용한다.

함수 설명 Now 현재의 날짜와 시간을 돌려준다

Date 현재의 날짜만 돌려준다

Time 현재의 시간만 돌려준다

Sub demoPresent()

Page 31: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

Dim a As Date

a = Now

MsgBox a

a = Date

MsgBox a

a = Time

MsgBox a

End Sub

위의 예와 같이 날짜/시간함수의 값을 제대로 받으려면 변수(여기서는 a) 역시 Date 형이어야 한다. Date 와 Time 함수는 현재의 날짜와 시간을 돌려주는 역할도 하지만 반대로 # #에 싸인 날짜나 시간을 받아 현재의 날짜와 시간을 바꾸는 역할도 한다.

가령 날짜를 1998년 8월23일 자정으로 하려면 다음과 같다.

Sub demoAdjustSystemClock()

Date = #8/23/98#

Time = #12:00:00 AM# MsgBox Now

End Sub

필요 부분만 추출하기 날짜/시간를 다루면서 날짜만 필요하거나 시간부분만 필요할 수 있다. 먼저 날짜부분만을 다루기 위해 DateValue( )라는 함수가 있다.

Sub demoDateValue( ) MsgBox DateValue(Now)

End Sub

시간만 뽑아내려면 TimeValue( )함수를 사용한다.

Sub demoTimeValue( ) MsgBox TimeValue(Now)

End Sub

DateValue( )와 TimeValue( )함수는 문자열을 날짜로 변환하는 기능도 있다.

이외에도 년도, 월, 날, 시간, 분, 초등을 추출하는 함수는 아래 표와 같다.

함수 반환값 Year ( ) 날짜 값에서 년도에 해당하는 부분

Month( ) 날짜 값에서 월에 해당하는 부분

Day( ) 날짜 값에서 날에 해당하는 부분

Hour( ) 날짜 값에서 시간에 해당하는 부분

Minute( ) 날짜 값에서 분에 해당하는 부분

Page 32: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

Second( ) 날짜 값에서 초에 해당하는 부분

WeekDay( ) 날짜 값에서 요일에 해당하는 부분

DatePart( ) 위의 모든 것을 해준다.

Sub demoDateFunctions()

MsgBox Year(Now) MsgBox Month(Now)

MsgBox Day(Now)

MsgBox Hour(Now) MsgBox Minute(Now)

MsgBox Second(Now)

End Sub

위의 표에서 WeekDay( )함수는 요일을 반환하지만 “월”, ”화, ”수”,…등등으로 반환하는 것이 아니라 아래의 표와 같이 숫자값으로 반환한다.

리턴값 = Weekday( 날짜, 옵션 )

옵션은 주중 첫 날을 지정하는 상수값으로 일요일이 주의 첫요일인가 월요일이 주의 요일의 시작인가를 정하는 것이다. 지정되지 않았다면 일요일(vbSunday)으로 한다. 아마 다른 나라에서는 한 주의 시작이 일요일이 아니라 월요일인 경우도 있는 것 같다.

WeekDay( )함수에서 사용하는 옵션은 다음과 같다.

상수 값 설명 vbUseSystem 0 NLS API 설정을 사용

vbSunday 1 일요일 (기본값)

vbMonday 2 월요일

vbTuesday 3 화요일

vbWednesday 4 수요일

vbThursday 5 목요일

vbFriday 6 금요일

vbSaturday 7 토요일

WeekDay 함수는 다음과 같은 값 중의 하나를 반환한다.

상수 값 설명 vbSunday 1 일요일

vbMonday 2 월요일

vbTuesday 3 화요일

vbWednesday 4 수요일

vbThursday 5 목요일

vbFriday 6 금요일

Page 33: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

vbSaturday 7 토요일

Sub demoWeekDay()

Select Case WeekDay(Now)

Case vbSunday MsgBox "Today is Sunday"

Case vbMonday

MsgBox "Today is Monday" Case vbTuesday

MsgBox "Today is Tuesday"

Case vbWednesday MsgBox "Today is Wednesday"

Case vbThursday

MsgBox "Today is Thursday" Case vbFriday

MsgBox "Today is Friday"

Case vbSaturday MsgBox "Today is Saturday"

End Select

End Sub

DatePart( )함수는 위의 모든 것을 다룰 수 있다. 그래서 이것 하나만 알아두면 날짜/시간에서 필요한 부분을 모두 추출할 수 있다.

DatePart( )함수의 옵션은 아래 표와 같다.

옵션 설명 yyyy 년도

q 분기

m 달

y 년중 몇번째 날

d 날짜

w 요일

ww 년중 몇번째 주

h 시

n 분

s 초

특히 y 와 ww 옵션은 1 월 1 일부터 계산하여 지정한 시간까지 지나온 날의 수와 주의 수를 되돌려준다.

Sub demoDatePart() MsgBox DatePart("yyyy", Now)

MsgBox DatePart("q", Now)

MsgBox DatePart("m", Now) MsgBox DatePart("y", Now)

MsgBox DatePart("d", Now)

MsgBox DatePart("w", Now) MsgBox DatePart("ww", Now)

MsgBox DatePart("h", Now)

Page 34: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

MsgBox DatePart("n", Now)

MsgBox DatePart("s", Now) End Sub

위의 예에서 h, n, s 옵션 사용시 주의할 점이 있는데 위의 예와 같이 Now 대신 Date 를 사용하면 ‘0’을 출력한다. 이는 Date 함수가 시간에 대한 자료를 제공하지 않기 때문이다.

날짜와 시간 조각을 붙여놓기 병 주고 약 주는 것처럼 앞에서 날짜와 시간을 부위별로 잘라놓은 함수들을 배웠다. 이번에는 조각 조각 주워 모은 날짜와 시간 부위들을 하나로 붙여 놓은 함수 2 가지를 설명할 차례이다.

날짜는 연도, 월, 일로 나눌 수 있는데 이렇게 나눠진 정보를 한데 모아 하나의 날짜(VBA 에서 Date 형으로 사용할 수 있는 날짜)로 만들려면 DateSerial() 함수를 사용한다.

리턴값 = DateSerial( 연도, 월 , 일 )

가령 연도를 의미하는 “2002”, 월을 의미하는 “5”, 일자를 의미하는 “31”이 있다면 이를 하나로 모아 다음과 같이 #2002-05-19#로 만들어야 한다.

Sub demoDateSerial()

Dim dteDate As Date

dteDate = DateSerial("2002", "5", "19")

Debug.Print dteDate End Sub

시간 역시 시, 분, 초로 구분될 수 있다. 이렇게 나누어진 시간정보를

TimeSerial()함수를 사용하여 하나의 시간으로 만든다.

리턴값 = TimeSerial(시, 분 , 초)

날짜연산 날짜 연산이 언뜻 무슨 소리인가 할 지도 모르겠다. 3월 1일에 2를 곱

하면 6월 2일이란 소리인가? VBA는 날짜/시간을 8바이트 부동소수점

으로 처리하므로 날짜나 시간을 더하거나 빼는 경우 수치를 다루는 것

과 마찬가지로 +/-를 사용할 수 있다.

그러나 이 방법은 정확하지 않을 수 있어 VBA는 더 정확하고 편리한

Page 35: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

더하고 빼는 DateAdd( )와 DateDiff( )함수를 따로 제공한다.

날짜덧셈 DateAdd( )함수를 이용하여 날짜, 월, 년 등을 더할 수 있다.

DateAdd함수는 다음과 같이 사용한다.

리턴값 = DateAdd ( Interval, Number, Date )

Interval이란 연산할 시간의 간격단위를 나타내는 것으로 앞서 배운

DatePart( )함수의 옵션과 같다.

옵션 설명 yyyy 년도

q 분기

m 달

y 년중 몇번째 날

d 날짜

w 요일

ww 년중 몇번째 주

h 시

n 분

s 초

Number란 더해지는 값이다. 가령 Interval이 “yyyy”일때 Number가

1이면 1년을 더하겠다는 의미이며 Interval이 “q”일때 Number가 1이

면 1분기를 더하는 것이다. Date는 덧셈의 기준이 되는 날짜이다.

가령 앞으로 1년 후의 오늘이 무슨 요일인가 알려면 DateAdd( )함수와

앞서 배운 WeekDay( )함수를 조합하여 다음과 같이 하면 된다.

Sub demoDateAdd()

Dim OneYearLater As Date

OneYearLater = DateAdd("yyyy", 1, Now)

Select Case WeekDay(OneYearLater)

Case vbSunday MsgBox "This day of the next year is Sunday"

Page 36: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

Case vbMonday

MsgBox "This day of the next year is Monday" Case vbTuesday

MsgBox "This day of the next year is Tuesday"

Case vbWednesday MsgBox "This day of the next year is Wednesday"

Case vbThursday

MsgBox "This day of the next year is Thursday" Case vbFriday

MsgBox "This day of the next year is Friday"

Case vbSaturday MsgBox "This day of the next year is Saturday"

End Select

End Sub

날짜뺄셈 DateDiff( )함수는 두 날짜간의 시간간격을 알려준다. DateDiff( )함수는

다음과 같이 사용한다.

리턴값 = DateDiff( Interval, Date1, Date2, FirstDayOfWeek,

FirstWeekOfYear )

• • • •

Interval 은 DateAdd( )함수와 같다.

Date1,Date2 는 계산에 사용되는 날짜

FirstDayOfWeek 한주를 시작하는 요일로서 선택사항이다.

FirstWeekOfYear 일년을 시작하는 주로서 역시 선택사항이다.

다음의 예는 사용자로부터 “98-09-11” 같은 날짜입력을 받으면 현재

부터 입력한 날까지의 날짜수를 돌려준다.

Sub demoDateDiff() Dim TheDate As Date

TheDate = InputBox("Enter a date") MsgBox "Days from today: " & DateDiff("d", Now, TheDate)

End Sub

날짜뺄셈에서는 주의할 점이 있다. 다음 예를 보자.

Sub demoDateDiff1() MsgBox DateDiff("h", #10:00:00 AM#, #12:59:59 PM#)

End Sub

Page 37: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

위에서 12시59분에서 10시까지는 거의 3시간이지만 DateDiff( )함수는

Interval이 “h”이므로 단순히 시간계산만 한다(즉 12시-10시).

Sub demoDateDiff2()

MsgBox DateDiff("m", #7/30/98#, #8/1/98#) End Sub

Page 38: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

수학함수 VBA에서는 VB에서 가져온 자체내장 함수와 Excel의 내장함수 등 다

양한 종류의 수치함수를 이용할 수 있다. 다음은 VBA 내장 수학함수

들이다.

수학함수 및 파생함수 함수 설명 Exp( ) E (자연로그의 밑, 약 2.718282 임)의 거듭 제곱을 돌려준다. Exp

함수는 Log 함수의 여함수이며 역로그함수(antilogarithm)이다. 입력값이 709.782712893 보다 크면 에러를 일으킨다.

Log( ) 자연로그값을 돌려준다. 입력값은 0 보다 커야 한다.

Sqr( ) 제곱근 값을 돌려준다. 입력값은 0 보다 커야 한다.

Sgn( ) 입력값이 음수이면 –1, 양수이면 1 을 돌려준다. 0 이면 0 을 돌려준다.

삼각함수 및 파생함수 VBA는 각의 단위로서 라디안(=각×원주율/180)을 사용한다.

함수 설명 Sin( ) 각의 사인(sine)값을 돌려준다

Cos( ) 각의 코사인(cosine)값을 돌려준다.

Tan( ) 각의 탄젠트(tangent)값을 돌려준다.

Atn( ) 각의 아크탄젠트(arctangent) 값을 돌려준다.

Sub demoAtan( )

MsgBox "원주율(PI)값은 " & 4 * Atn(1) & "입니다" End Sub

VBA는 자주 사용하지 않는 수리함수들을 따로 만들지 않는다. 다만 기

본적인 수리함수로 유도할 수 있는 함수들은 다음과 같다.

함수 파생 함수 Secant Sec(X) = 1 / Cos(X)

Cosecant Cosec(X) = 1 / Sin(X)

Cotangent Cotan(X) = 1 / Tan(X)

Inverse Sine Arcsin(X) = Atn(X / Sqr(-X * X + 1))

Page 39: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

Inverse Cosine Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)

Inverse Secant Arcsec(X) = Atn(X / Sqr(X * X ?1)) + Sgn((X) ?1) * (2 * Atn(1))

Inverse Cosecant Arccosec(X) = Atn(X / Sqr(X * X - 1)) + (Sgn(X) ?1) * (2 * Atn(1))

Inverse Cotangent Arccotan(X) = Atn(X) + 2 * Atn(1)

Hyperbolic Sine HSin(X) = (Exp(X) ?Exp(-X)) / 2

Hyperbolic Cosine HCos(X) = (Exp(X) + Exp(-X)) / 2

Hyperbolic Tangent HTan(X) = (Exp(X) ?Exp(-X)) / (Exp(X) + Exp(-X))

Hyperbolic Secant HSec(X) = 2 / (Exp(X) + Exp(-X))

Hyperbolic Cosecant HCosec(X) = 2 / (Exp(X) ?Exp(-X))

Hyperbolic Cotangent HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) ?Exp(-X))

Inverse Hyperbolic Sine HArcsin(X) = Log(X + Sqr(X * X + 1))

Inverse Hyperbolic Cosine

HArccos(X) = Log(X + Sqr(X * X ?1))

Inverse Hyperbolic Tangent

HArctan(X) = Log((1 + X) / (1 ?X)) / 2

Inverse Hyperbolic Secant

HArcsec(X) = Log((Sqr(-X * X + 1) + 1) / X)

Inverse Hyperbolic Cosecant

HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X)

Inverse Hyperbolic Cotangent

HArccotan(X) = Log((X + 1) / (X ?1)) / 2

Logarithm to base N LogN(X) = Log(X) / Log(N)

재무함수 및 파생함수 VBA는 일상에서 사용하는 금전적 거래를 계산할 수 있는 재무함수를

가지고 있다. 이들을 분류하면 감가상각 관련함수, 연금관련함수, 현금

흐름관련함수 등으로 나뉜다.

감가상각 함수 설명 DDB(cost, salvage, life, period ( , factor) )

Decling balance 방식을 사용하여 특정 주기시간 동안의 자산감가상각을 나타내는 Double 형값을 반환한다.

SLN( cost, salvage, life ) 단일주기에 대한 자산의 직선감가상각을 나타내는 Double 형 값을 반환한다.

SYD( cost, salvage, life, period ) 지정된 주기의 자산감가상각의 년간 합산을 나타내는 Double 형값을

Page 40: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

반환한다.

연금 함수 설명 FV(rate, nper , pmtf,pv [,type] ) 주기적 고정지불 및 고정이자율을

기반으로 하는 연금의 미래값을 나타내는 Double 형 값을 반환한다

Rate(nper , pmt, pv[, fv[,type[,guess]]] )

연금에 대한 주기별 이자율을 나타내는 Double 형 값을 반환한다

NPer(rate, pmt , pv[, fv[,type]] ) 연금에 대한 주기수를 나타내는 Double 형 값을 반환한다

IPmt(rate, per , nper, pv [, fv[,type]] )

주어진 연금기간의 이자지불을 나타내는 Double 형 값을 반환한다

Pmt(rate, nper , pv[,fv [,type]] ) 연금지불을 나타내는 Double 형 값을 반환한다

PPmt(rate, per, nper , pv [,fv[,type]] )

주어진 연금기간의 원금지불을 나타내는 Double 형 값을 반환한다

PV(rate, nper , pm,fv [,type] ) 미래에 고정이자율로 지불된 주기별 고정지불을 기반으로 하여 연금의 현재가를 나타내는 Double 형 값을 반환한다

현금흐름 함수 설명 IRR(values( ) [, guess] ) 일련의 기간별 현금흐름에 대한

내부수익률을 나타내는 Double 값을 반환한다

MIRR(values, finance_rate, reinvest_rate)

일련의 기간별 현금흐름에 대한 변경된 내부수익률을 나타내는 Double 값을 반환한다

NPV(rate, values( )) 일련의 기간별 현금흐름과 할인율을 토대로 하여 현재의 총 투자가를 나타내는 Double 값을 반환한다

수치변환 앞에서 데이터형을 설명하면서 수치 데이타형 들은 각각 지원하는 정밀

도를 말한 바 있는데 다른 데이터 형으로 형 변환시 원하지 않는 반올

림이나 버림이 있을 수 있다. VBA는 데이터형 변환을 위한 다음의 함

수들을 제공한다.

Page 41: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

형 변환 함수 변환자료형 설명 CBool ( ) Boolean CBool 함수를 사용하여 Boolean 으로 식을

변환한다. 식이 0 이 아닌 값을 평가하면 CBool 은 True 를 반환하고 그렇지 않으면 False 를 반환한다.

CByte( ) Byte 0 에서 255 까지의 숫자로 반올림한다

CCur( ) Currency -922,337,203,685,477.5808 에서 922,337,203,685,477.5807.로 Currency 데이터 형으로 형 변환한다.

CDate( ) Date 모든 적절한 날짜 식으로 변환한다

CDbl( ) Double 음수값인 경우 -1.79769313486232E308 에서 -4.94065645841247E-324 까지. 양수값인 경우 4.94065645841247E-324 에서 1.79769313486232E308 까지로 Double 형 데이터로 변환한다.

CDec( ) Decimal 소수점 이하 단위가 없는 경우 +/-79,228,162,514,264,337,593,543,950,335 소수점 이하 28 자릿수의 값으로써 그 범위는 +/-7.9228162514264337593543950335. 가장 작은 표현 가능한 숫자는 0.0000000000000000000000000001.

CInt( ) Integer -32,768 에서 32,767 까지 나머지는 반올림함.

CLng( ) Long -2,147,483,648 에서 2,147,483,647 까지 나머지는 반올림함.

CSng( ) Single 음수값인 경우 -3.402823E38 에서 -1.401298E-45 까지. 양수값인 경우 1.401298E-45 에서 3.402823E38 까지.

CVar( ) Variant 숫자인 경우 Double 과 같으며 숫자가 아닌 경우 String 과 같은 범위.

CStr( ) String 문자열 값으로 변환한다

진법변환 함수 설명 Hex 16 진수 값을 나타내는 문자열을 반환한다

Oct 8 진수 값을 나타내는 Variant 형을 반환한다

Val &H, &O로 시작하는 16 진수, 8 진수 값을 Double 형 10 진수로 반환한다.

*VBA에는 이진변환을 위한 함수는 없다.

Page 42: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

텍스트파일 핸들링 VBA은 Basic언어를 기반으로 하고 있어 많은 베이직의 유물을 가지고

있다. 현대적인 개체지향 프로그래밍이 나오기 전에 나온 언어라서, 파

일을 다루는 기능도 저수준의 파일입출력만을 지원한다.

베이직에서 다루는 파일의 종류에는 이진(Binary)파일, 순차

(Sequential)파일, 랜덤액세스(Random Access)파일이 있다. 이진

(Binary)파일이란 텍스트가 아닌 파일을 말한다. 즉 이미지 파일, 동영

상파일, 음악파일 등등이 이진 파일이다.

순차(Sequential)파일과 랜덤액세스(Random Access)파일은 텍스트파일

인데, 이것은 여러분이 일반적인 텍스트에디터(Notepad, AcroEdit)로

열어 그 내용을 볼 수 있는 파일이다.

그러나 순차(Sequential)파일은 파일을 읽거나 쓰려면 순서대로 파일의

처음부터 끝까지를 진행하지만 랜덤액세스(Random Access)파일은 마

치 LP레코드 판처럼 원하는 파일위치에서 바로 읽거나 기록할 수 있다.

순차(Sequential)파일은 카세트 테이프와 같은 구조이고, 랜덤액세스

(Random Access)파일은 LP레코드 판과 같은 구조라고 보면 된다. 여

기에서는 가장 활용도가 많고 이해하기 쉬운 순차파일만을 다룰 것이다.

그리고 이것은 저수준의 파일입출력인데 저수준이라는 것은 여러분이

해야 할 일이 많다는 뜻이다.

텍스트파일을 제대로 다루려면 앞서 설명한 문자열 함수를 충분히 익혀

두는 것이 좋다. 여기에서 다루는 구문은 텍스트파일에서 파일을 변수

에 읽거나 쓰는 작업이다. 실제 읽어들인 데이터를 처리하려면 각종 함

수를 익혀야 한다.

파일핸들 또는 파일번호 파일을 다루려면 몇 단계의 뻔한 절차가 있다. 우선 파일핸들을 얻어야

Page 43: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

한다. 파일핸들은 파일번호라고도 하는데, 운영체제에서 프로그램이 파

일을 구분할 수 있도록 만든 고유의 식별번호일 뿐이다. 그리고 이것은

정수형 숫자이다. 즉 중복되지 않는 정수일 뿐이다.

여러분이 파일번호 몇 번을 지정하거나 받아 이 번호를 갖고 열거나 닫

거나 읽거나 쓰면 된다. 마치 목욕탕에 가서 사물함열쇠를 갖고 다니

는 것처럼 말이다.

파일번호는 여러분이 임의의 정수(1,2와 같이)를 지정해도 되지만, 일을

한꺼번에 다루다 보면 중복될 수 있고 빠트릴 수 있다. 그래서

FreeFile()함수를 사용하여 파일번호는 얻는 것이 안전하다.

FreeFile (rangenumber)

rangenumber는 생략 가능하고 기본값 0을 지정하면 1 - 255 범위에

있는 파일 번호를 반환하고, 1을 지정하면 256 - 511 범위에 있는 파일

번호를 반환합니다

다음은 hFile이라는 정수형 변수를 선언하고 여기에 FreeFile함수를 사

용하여 파일번호를 얻는 예이다.

Dim hFile As Long hFile=FreeFile

파일 열기와 닫기 파일번호를 얻었으면 먼저 파일을 열어야 한다. 파일의 내용을 읽어오

든, 파일에 무엇을 기록하든 간에 파일번호를 얻은 다음 작업은 파일을

열어야 한다는 것이다. 파일을 열려면 Open문을 사용한다.

Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]

• pathname은 파일의 전체 경로 및 이름을 지정하는 문자열이다.

• mode 는 Append(추가기록용), Binary(이진파일용), Input(읽기용도), Output(새로쓰기용도), Random(랜덤액세스파일용)중 하나를 사용한다. 생략하면 Random 액세스용으로 파일을 열게 된다.

Page 44: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

• access 는 위의 mode 와 다소 중복되는 내용이다. 이는 열려 있는 파일에서 허용되는 작업을 지정할때 사용한다. Read, Write, Read Write 중 하나를 사용할 수 있으면 네트워크나 운영체제의 보안설정과 관련하여 지정하는 것이다.

• lock 은 다른 프로세스(프로그램과 비슷한 개념)에 의해 열려 있는 파일에 허용하는 작업이다. Shared, Lock Read, Lock Write, Lock Read Write 중 하나를 지정한다.

• filenumber 는 1 에서 511 사이에 있는 유효한 파일 번호로 FreeFile 함수로 사용 가능한 파일 번호를 얻는다.

• reclength - 32,767(바이트)보다 작거나 같은 수. 랜덤 액세스 파일의 경우 이 값은 레코드 길이가 되며 순차 파일의 경우 이 값은 버퍼에 있는 문자의 수이다.

다른 프로세스가 이미 파일을 열었고 지정한 액세스 형식이 허용되지

않으면 Open 연산은 실패하고 오류가 발생한다. mode가 Binary인 경

우 Len 절은 무시된다.

Binary, Input, Random 모드에서는 먼저 파일을 닫지 않고도 다른 파일

번호를 사용하여 파일을 열 수 있다. Append와 Output 모드에서는 다

른 파일 번호로 파일을 열기 전에 파일을 닫아야 한다.

다음 코드는 TESTFILE 파일을 순차파일로서, 읽기용으로서 여는 예이

다.

Open "TESTFILE" For Input As #1 ' 파일을 다른 모드로 다시 열기 전에 닫습니다.

Close #1

다음 예제 코드에서는 순차 출력용으로 파일을 열어 어떤 프로세스에서

도 파일에 읽기나 쓰기를 할 수 있다.

Open "TESTFILE" For Output Shared As #1 ' 파일을 다른 모드로 다시 열기 전에 닫습니다.

Close #1

다음 예제에서는 쓰기 작업만을 위해 이진 모드로 파일을 연다.

Open "TESTFILE" For Binary Access Write As #1 ' 파일을 다른 모드로 다시 열기 전에 닫습니다.

Close #1

이 예제 코드에서는 이진 모드로 읽기 위해 파일을 연다. 다른 프로세

스는 이 파일을 읽을 수 없다.

Page 45: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

Open "TESTFILE" For Binary Access Read Lock Read As #1

파일의 읽기와 쓰기 파일의 읽기와 쓰기를 위한 구문이 여러 있는데, 파일의 오픈 모드에

따라 사용하는 읽기/쓰기 구문이 다르다. 그래서 이를 다음과 같이 요

약해보았다.

오픈모드 읽기작업 쓰기작업 Input,Output,Append Input,Input #,Line Input # Print #,Write #

Random Get Put

Binary Input,Get Put

Input 함수 Input함수는 한 개의 문자를 읽어 들인다. 이것은 number에 지정한

문자갯수만큼 읽어 들여 이를 돌려주는 함수이다.

Input(number, [#]filenumber)

아래 예제에서는 파일로부터 한번에 하나의 문자를 읽어와 직접 실행 창에 출력하기 위해 Input 함수를

사용합니다. 이 예제에서 TESTFILE은 여러 행에 걸친 예제 데이터를 가진 텍스트 파일로 가정합니다.

Dim MyChar

Open "TESTFILE" For Input As #1 ' 파일을 엽니다. Do While Not EOF(1) ' 파일의 끝을 만날 때까지 반복합니다.

MyChar = Input(1, #1) ' 한 문자를 가져옵니다.

Debug.Print MyChar ' 직접 실행 창에 인쇄합니다. Loop

Close #1 ' 파일을 닫습니다.

input# 문 input#문는 한 줄을 읽어 들인 후 이를 분리하여 지정한 각각의 변수에

저장한다. 읽어들이는 줄이 컴마로 분리되어 있으면 지정한 변수에 순

서대로 저장한다.

Input #filenumber, varname1, varname2,...

Dim iFileNum As Integer

Dim strName, strNumber, strDepart

'사용가능한 파일번호 얻기

iFileNum = FreeFile

Page 46: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

'현재 디렉토리에 있는 person.txt파일 열기

Open "Person.txt" For Input As iFileNum

'데이터 읽기

Input #iFileNum, strName, strNumber, strDepart

'데이터 출력

txtName.Text = strName : txtNumber.Text = strNumber : txtDepart.Text = strDepart

Close iFileNum

Input #문은 Line Input #보다 자주 사용하지는 않지만 Write #문을 사

용하여 만든 텍스트 파일을 읽어오는데 효과적이다.

Line Input # 문

Line Input#문은 열려 있는 순차 파일에서 하나의 행을 읽어서 String

변수에 저장한다.

Line Input #filenumber, varname

varname에는 문자형 변수를 둔다. 실제 파일을 읽어 들인 후 이것을

앞서 설명한 문자열 함수중 SPLIT()함수를 사용하여 데이터를 분리할

수 있다.

Sub demo_LineInput() 'Open문을 이용하여 읽어올 파일을 열어 준후 EOF를 만날 때까지 파일의 데이터를 읽어 옵니다.

'마지막으로 파일은 Close문을 이용하여 닫아 줍니다. '파일을 읽어 올 때 Line Input #문으로 라인 단위로 문자열 읽어 왔습니다.

'File_Data는 읽어온 문자열을 계속 누적하여 보관하기 위해서 사용합니다.

'Line Input # 문은 캐리지 리턴과 라인피드 문자를 추가하지 않고 건너뜁니다. '그렇기 때문에 라인 단위로 읽어온 데이터는 vbCrLf가 없습니다.

'사용자가 직접 추가 시켜 주어야 합니다.

'Line Input # 문으로 읽어 온 데이터는 일반적으로 Print #을 사용하여 파일을 저장합니다. 'File_Data에 저장된 데이터를 출력은 [직접 실행창]에 출력합니다.

Dim File_Line As String Dim File_Data As String

Dim fn As Long

fn = FreeFile

' 파일 읽을 수 있도록 열어준다.

Open "test.txt" For Input As #fn

' 파일의 내용을 읽어 온다.

Do While Not EOF(fn) Line Input #fn, File_Line

File_Line = File_Line & vbCrLf

File_Data = File_Data & File_Line Loop

Page 47: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

' 파일을 닫아 준다. Close #fn

' 읽어온 내용을 직접실행창에 출력한다.

Debug.Print File_Data End Sub

Print # 문 파일에 데이터를 쓰기 위해서는 Print # 문을 사용한다.

Print #filenumber, output

여러 개의 output을 사용하는 경우 컴마(,) 또는 세미콜론(;)으로 구분

한다. 컴마를 사용하면 출력하는 데이터 사이에 탭 (Tab)을 두는 것이

고 세미콜론(;)을 사용하면 바로 붙여서 출력한다. 출력시 형식을 지정

하려면 Spc(), Tab()함수등을 같이 사용한다.

Sub demo_Print()

Open "TESTFILE.txt" For Output As #1 ' 출력을 위해 파일을 엽니다.

Print #1, "This is a test" ' 텍스트를 파일에 출력합니다. Print #1, ' 파일에 공란을 출력합니다.

Print #1, "Zone 1"; Tab; "Zone 2" ' 두 인쇄 영역에 출력합니다.

Print #1, "Hello"; " "; "World" ' 문자열을 공백으로 구분합니다. Print #1, Spc(5); "5 leading spaces " ' 5개의 공백으로 문자열을 구분합니다.

Print #1, Tab(10); "Hello" ' 10열에 단어를 인쇄합니다.

' Boolean, Date, Null과 Error 값을 할당합니다.

Dim MyBool, MyDate, MyNull, MyError

MyBool = False

MyDate = #2/12/1969#

MyNull = Null MyError = CVErr(32767)

' True, False, Null과 Error 시스템 설정에 따라 번역합니다 ' 날짜 문자열은 표준 약식 날짜 형식을 사용하여 적습니다.

Print #1, MyBool; " is a Boolean value"

Print #1, MyDate; " is a date" Print #1, MyNull; " is a null value"

Print #1, MyError; " is an error value"

Close #1 ' 파일을 닫습니다 End Sub

Write # 문 데이터를 순차 파일에 기록한다.

Write #filenumber, outputlist

Page 48: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

Write # 문으로 기록된 데이터는 일반적으로 Input #을 사용하여 읽는

다. 이것은 Print#과 달리 출력하는 데이터의 형식에 맞추어 파일에 기

록한다. 가령 문자열 데이터를 출력하면 쌍따옴표안에 데이터를 입력한

다. 숫자 데이터는 항상 마침표를 소수 구분 기호로 사용하여 파일에

기록된다. Boolean 데이터의 경우 #TRUE# 또는 #FALSE#가 파일에

기록되고. Date 데이터는 일반적인 날짜 형식을 사용하여 파일에 기록

된다.

Sub demo_Write()

Open "TESTFILE.txt" For Output As #1 ' 출력을 위해 파일을 엽니다.

Write #1, "Hello World", 234 ' 쉼표로 구분된 데이터를 작성합니다.

Write #1, ' 비어있는 행을 작성합니다.

Dim MyBool, MyDate, MyNull, MyError

' Boolean, Date, Null과 Error 값을 할당합니다.

MyBool = False

MyDate = #2/12/1969# MyNull = Null

MyError = CVErr(32767)

' Boolean 데이터는 #TRUE#나 #FALSE#로 작성됩니다. 날짜 문자열은

' 일반적인 날짜 형식으로 작성됩니다. 예를 들면 #1994-07-13#

' 1994년 7월 13일을 나타냅니다. Null 데이터는 #NULL#로 작성됩니다. ' Error 데이터는 #ERROR errorcode#로 작성됩니다.

Write #1, MyBool; " is a Boolean value"

Write #1, MyDate; " is a date" Write #1, MyNull; " is a null value"

Write #1, MyError; " is an error value"

Close #1 ' 파일을 닫습니다.

End Sub

기타 구문 순차파일에서 사용하는 기타 관련구문을 정리해보았다.

• LOF(filenumber)함수는 파일의 크기를 바이트단위로 알려준다.

Dim FileLength

Open "TESTFILE" For Input As #1 ' 파일을 엽니다. FileLength = LOF(1) ' 파일의 길이를 구합니다.

Close #1 ' 파일을 닫습니다.

• 파일의 길이를 알아내는 함수로는 FileLen()함수가 있다.

MySize = FileLen("TESTFILE") ' 파일 길이(바이트)를 반환합니다

Page 49: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

• EOF(filenumber)함수는 파일의 끝인가를 True/False 값으로 돌려준다.

Dim InputData Open "MYFILE" For Input As #1 ' 입력을 위해 파일을 엽니다.

Do While Not EOF(1) ' 파일의 끝을 확인합니다.

Line Input #1, InputData ' 데이터 행을 읽어 들입니다. Debug.Print InputData ' 직접 실행 창에 인쇄합니다.

Loop

Close #1 ' 파일을 닫습니다.

파일열기 대화상자 파일을 읽고자 할때 앞서의 코드에서는 OPEN문을 이용하면서 파일의

이름을 지정하였다. 그러나 대화상자를 이용하여 사용자가 파일을 선택

하여 읽어오도록 하려면 Application개체의 GetOpenFilename메서드를

사용한다.

GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

• FileFilter 열려는 파일의 종류를 지정하는 요소이다. 예를 들면 "텍스트 파일(*.txt),*.txt,추가 기능(*.xla),*.xla"라고 하면 두 개의 파일, 즉 텍스트 파일과 추가 기능 파일에 대한 필터를 지정하는 것이다. 이것을 생략하면 기본값은 "모든 파일(*.*),*.*"이다.

• FilterIndex 위의 파일필터에서 가장 먼저 보일 필터의 번호를 지정하는 것이다. 1 부터 FileFilter 에서 지정한 필터 개수까지 기본 파일 필터링 조건의 인덱스 번호를 지정한다. 생략하거나 현재 파일 필터 수보다 많으면 첫 번째 필터가 사용됩니다.

• Title 대화 상자 제목을 지정한다. 생략하면 대화 상자 제목은 "열기"가 된다.

• MultiSelect True 이면 여러 개의 파일 이름을 사용할 수 있다. False 이거나 인수를 생략하면 하나의 파일 이름만 선택할 수 있다. 기본값은 False

다음은 파일을 필터링하여 문자열 파일로 설정한 다른 이름으로 저장

대화 상자를 표시하는 예제이다. 파일 이름을 선택하면 이 예제는 메시

지 상자에 해당 파일 이름을 표시한다.

fileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt") If fileToOpen <> False Then

Page 50: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

MsgBox "Open " & fileToOpen

End If

위의 코드를 실행하면 다음과 같은 대화상자를 만날 수 있다. 착각하기

쉬운 것은 이것이 파일을 직접 열어주는 기능은 아니다. 다만 선택한

파일의 경로와 이름을 돌려주는 역할을 하는 것이다. 따라서 실제 파일

을 여는 것은 앞서 설명한 OPEN문을 사용한다.

<그림-열기 대화상자>

반대로 저장하기 대화상자도 위와 같이 만들 수 있는데, 이때에는

Application개체의 GetSaveAsFilename메서드를 사용한다. 사용하는

방법은 GetOpenFilename과 비슷하므로 자세한 사용법은 VBA도움말

을 참조한다.

프로그래밍 실습 프로그래밍분야는 읽고 이해하는 부분보다는 직접 실습하는 것이 훨씬

유용하다. 아무리 머리속에서 이리 저리 하면 될 것이다라고 생각하지

만 막상 실행에 옮기려면 생각하지 못한 문제를 만나기도 한다.

Page 51: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

간단한 실습이므로 설계과정은 무척 간단하다. 프로그램의 목적은 블랙

숄즈 방정식을 이용하여 콜 옵션의 이론가격을 계산하는 것이다. 먼저

워크시트에서 필요한 데이터를 기록한다. 그리고 워크시트에 명령 버튼

을 만들고 이를 클릭하면 데이터를 읽어 들인다. 그리고 연산을 통해

결과를 워크시트로 출력한다.

다음 그림과 같이 Sheet1에 $B$16:$C$20 셀 영역은 콜 옵션 이론가

격 계산에 필요한 데이터이다. 그리고 옆의 ‘계산’이라는 명령 버튼

(계산

) 을 클릭하면 연산을 통해 $C$22 셀에 계산한 콜 옵션 이

론가격을 출력하는 것이다.

<그림-완성된 워크시트>

다음의 프로그래밍을 위한 코드를 보면서 어떻게 워크시트를 읽고 쓰는

지 알아보도록 하자.

Sub 워크시트읽고쓰기()

Dim sht As Worksheet

Page 52: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

Dim col As Long

Dim s As Double

Dim k As Double

Dim T As Double Dim r As Double

Dim v As Double

Dim d1 As Double

Dim d2 As Double

Dim c As Double

col = 3

Set sht = Sheet1

s = Sheet1.Cells(16, col).Value k = Sheet1.Cells(17, col).Value

r = Sheet1.Cells(18, col).Value

T = Sheet1.Cells(19, col).Value v = Sheet1.Cells(20, col).Value

d1 = Log(s / k) + (r + Application.WorksheetFunction.Power(v, 2) * 0.5) * T d1 = d1 / (v * Sqr(T))

d2 = d1 - v * Sqr(T)

With Application.WorksheetFunction

c = s * .NormSDist(d1) - k * Exp(-r * T) * .NormSDist(d2)

End With

Sheet1.Cells(22, col) = c

End Sub

이제는 코드를 한 줄 한 줄 설명할 차례이다.

Dim sht As Worksheet

‘sht’는 변수로서 데이터 형이 Worksheet 이다. 이는 기존의 숫자, 문

자와 같은 데이터가 아니라 워크시트를 저장하는 개체형 변수이다. 이

워크시트는 Sheet1이 될 것이다. 개체형 변수인 워크시트를 다음과 같

이 입력한다.

Set sht = Sheet1

일반 변수의 경우에는 ‘변수=값’과 같은 형식으로 값을 입력하지만 개

체형 변수의 경우 ‘Set’을 앞에 붙여 두어야 한다. sht에 워크시트를 입

력하는 경우 VBE의 프로젝트 탐색기에서 보이는 이름을 사용할 수 있

다.

Page 53: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

<그림-프로젝트 탐색기에서 본 워크시트>

위의 그림에서 살펴보면 현재 3장의 워크시트가 있고 각각의 이름은

“연습1”, “연습2”, “연습3”이다. 이 워크시트의 이름은 VBE 프로젝트

탐색기에서는 괄호안에 표시된다. 즉 괄호안에 표시된“연습1”, “연습2”,

“연습3”는 엑셀에서 보았을 떄의 이름이다.

비주얼베이직 편집기인 VBE의 관점에 Sheet1은 워크시트 “연습1”과

같으며, Sheet2는 워크시트 “연습2”와 같다. 따라서 프로그래밍적으로

첫 번째 워크시트에 접근하려면 VBE의 Sheet1으로 접근하거나 “연습

1”과 같은 워크시트이름으로 접근한다.

즉 위의 Set sht=Worksheets(“연습1”)와 같이 사용해도 되고 Set

sht=Sheet1으로 해도 된다.

Dim col As Long

‘col’은 데이터가 있는 열(C열)을 가리키는 변수가 될 것이다. 그래서

아래와 같이 C열(세 번째 열이므로 3)의 번호를 col 변수에 입력한다.

Page 54: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

col = 3

s = Sheet1.Cells(16, col)

k = Sheet1.Cells(17, col)

r = Sheet1.Cells(18, col) T = Sheet1.Cells(19, col)

v = Sheet1.Cells(20, col)

워크시트에는 수 십만개의 셀이 존재한다. 이 셀은 Cells로 표시한다.

수 십만개의 셀을 일일이 지정하려면 행과 열 번호를 이용하여 표시한

다. 예를 들어 ‘Sheet1.Cells(1,2)’이라고 하면 Sheet1의 1번째 행과

2번째 열이 교차하는 셀이며 이는 $B$1 셀을 의미한다.

s = Sheet1.Cells(16, col)에서 col=3이므로 16번째 행과 3번째 열이

교차하는 셀($C$16)을 의미한다. $C$16 셀의 값을 변수 s에 저장한다

는 의미이다. Range 개체를 사용하여 Range(“C16”)이라고 해도 된다.

Sheet1.Cells(22, col) = c

이제 연산을 거쳐 나온 콜 옵션 이론가는 변수 c에 저장되어 있으며 이

를 출력할 차례이다. 출력은 입력의 반대이므로 원하는 셀에 변수를 대

입한다.

명령 버튼은 [양식]도구모음의 명령버튼을 클릭한 후 워크시트의 원하

는 위치를 클릭하면 그려진다. 클릭하면 바로 [매크로 지정] 대화상자

가 나오는데 이때 미리 작성해 둔 서브 프로시저의 이름을 선택하면 된

다.

Page 55: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

<그림-매크로 지정 대화상자>

크기를 조정하거나 명령 버튼의 이름을 변경하는 것은 워크시트에 상자

나 원을 그려놓고 변경하는 방법과 같다.

Page 56: VBA 프로그래밍의 기초 - pds6.egloos.compds6.egloos.com/pds/200711/28/36/Fundamental_of_VBA.pdf · 네티즌이 자신의 vba지식을 인터넷에 올려 두고 있다. 그래서

요약

프로시저 VBA 프로그램 = SUM(프로시저)

프로시저는 Sub와 Function 두 종류이다(사실 하나 더 있지

만…)

Sub= 순서대로 실행

Function= 순서대로 실행+결과돌려줌

변수/연산자 변수선언은 Dim 변수명

배열선언은 Dim 배열변수명(크기)

연산자는 사칙연산(+,-,*,/), 지수연산(^), 문자열 연결(&),

논리연산(And, Or, Not)

조건판단문 If~End If : 일대일비교하는 경우

Select Case ~ End Select : 하나의 변수에 대해 여러 조건

과 비교하는 경우

반복문 For~Next : 횟수가 미리 정해진 반복

Do~Loop : 특정 조건을 만족할 때 까지 반복

워크시트 읽고쓰기 읽는 경우 : 변수 = Worksheets(“시트명”).Cells(행번호, 열

번호)

쓰는 경우 : Worksheets(“시트명”).Cells(행번호, 열번호)=변