Skip Navigation Links.
Expand VBAVBA
엑셀프로그래밍이 필요한 이유
Expand ExcelExcel
Expand External LibraryExternal Library
Expand SolutionSolution
Expand EssayEssay

Looping Structure|For~Next|For Each~Next|UBound()|LBound()|String()|
|Each|Next|For|Step|To|In|With|End With|

앞에서 변수등을 설명하면서 순환문을 잠깐..잠깐 보았을것이다
이제 제대로 순환문의 문법을 살펴보도록 한다
세상의 모든 컴퓨터언어는 같은 일,혹은 비슷한 일을 효율적으로
진행시키기 위하여 순환문이라는 것은 필수적이다
또한 순환문은 또 다른 하나의 Block Statement이다
순환을 시작하는것을 선언하고
순환을 끝낸다는 선언 두개의 열고,닫는 하나의 블록내에서 다양한 작업이
벌어지는것이다

VBA는 기본적으로 두가지 순환방법을 제공한다
하나는 For~Next 순환문이고
또 다른 하나는 Do~Loop 순환문이다
두개의 방법이 또 약간의 변화는 있으나 크게는 위의 두가지인것이다

For~Next순환문은 정해진 횟수만큼 순환하라는 이야기도
Do~Loop순환문은 순환을 하다가 조건이 만족될때가지 순환하라는것이다
이 페이지에서는 For~Next Looping Structure를 살펴본다

For~Next Looping

Dim iX As Integer
For iX=1 To 10
    어떤 작업내용
Next

문법은 위와 같이 아주 간단하다
iX의 값이 1,2,3,..10 이 될때까지 정해진 반복회수를 진행하는것이다 
실습을 해보자

Sub For_Next()
Dim iX As Integer, iTotal As Integer, sX As String
For iX = 1 To  10
  sX = sX & iX & ","
  iTotal = iTotal + iX
Next
MsgBox sX & Chr(10) & Chr(10) & "합계는 " & iTotal
End Sub

위의 노랑색 사각형내의 숫자를 직접 바꿔보시면 순환회수가 다르게 지정된다
Run버튼을 크릭해보시기 바란다
이것의 의미는 For iX =1 To 10 에서 1이나 10대신 변수를 사용해도 된다는 의미다
아래의 버튼을 크릭하면서 감각을 키우시기 바란다

Step키워드로 순환의 간격을 조정할수 있다

1에서 10까지 하나씩 순환하지 않고 2씩 건너 뛰면서 순환을 하고
싶을때도 있을것이다
아래의 문장에서 몇자씩 건너 뛰면서 문자를 얻고 싶을수도 있다

EXCEL IS USEFUL & POWERFUL,SO I'LL CRUSH DOWN EXCEL HERE

Sub For_Next()
Dim iX As Integer, iTotal As Integer, _
sX As String,sPara As String,iLen As Integer sPara="" iLen=Len(sPara) For iX = 1 To iLen  Step  2 sX = sX & Mid(sPara,iX,1) Next MsgBox sX End Sub

위의 노랑색셀의 값을 다른 숫자를 넣고 Run버튼을 크릭!!

큰수에서 부터 작은수로 순환/Reverse Looping

큰수로 부터 작은 수로 순환할 필요도 있을것이다
예를 들어서 아래의 문장을 꺼꾸로 나타나게 하고 싶다고 한다면

EXCEL IS VERY USEFUL AND POWERFUL,SO I'LL CRUSH DOWN EXCEL HERE!!

Sub reverseLooping()
Dim iX As Integer, iTotal As Integer, _
sX As String, sPara As String, iLen As Integer sPara = "EXCEL IS USEFUL AND POWERFUL," _&
"SO I 'LL CRUSH DOWN EXCEL HERE" iLen = Len(sPara) For iX = iLen To 1 Step -1 sX = sX & Mid(sPara, iX, 1) Next Range("A5")=sX End Sub

반복하여 크릭하여 보시기 바란다..위의 문장이 크릭할때마다 순서가 바뀔것이다

순환문안에서 또 순환문이 돈다/Nested Looping

순환문을 돌면서 또 순환을 할수도 있다..
VBA의 많은 Block구문들은 중첩하여 작업을 하게 된다
순환문안에 조건문도 들어가고,조건문 안에 순환문도 들어가고
순환문안에 순환문이 또 들어가기도 하고 ..그래서 재미있는것이다
아래의 워크시트를 행방향,열방향을 순환하면서 작업을 해보자
다중배열의 경우도 역시 중첩된 순환문으로 접근하는것이다
아래 버튼을 크릭하면 A열에 이름과 B열에 점수가 만들어지고
G열에 기준점수,H열에 점수에 대한 조치가 만들어 진다

ABCDEFGH
1
2
3
4
5
6
7
8
9



Vlookup함수등을 코드에서 사용하면 더 편리하겠으나..
중첩순환브록,If조건브록,With 브록등을 다양하게 보여드리기 위하여
좀 복잡한 쌤플을 보여드렸다
또한 정해진 갯수만큼 순환하지만 경우에 따라서는 중간에
순환을 중단하고 순환브록을 탈출하는 Exit For도 볼수 있고
중요한것은 For~Next와 같은 형식이나 순서가 아닌
오브젝트를 하나,하나 순환하는 방법도 같이 살펴보도록 한다

Sub evaluateGrade()
Dim rngPoint As Range, iPointRow As Integer, _
iRefRow As Integer Dim rngRefTable As Range, iX As Integer, iY As Integer Dim rngTempX As Range, rngTempY As Range 'A1:C9범위 접근 Set rngPoint = Range("A1").CurrentRegion 'G1:H7범위 접근 Set rngRefTable = Range("G1").CurrentRegion 'G1:H7범위의 제목행제외 접근 Set rngRefTable = rngRefTable.Offset(1). _
Resize(rngRefTable.Rows.Count - 1) 'A1:C9범위의 행갯수(외부순환횟수) iPointRow = rngPoint.Rows.Count 'G2:H7범위의 행갯수(내부순환횟수) iRefRow = rngRefTable.Rows.Count On Error Resume Next '외부순환 For iX = 1 To iPointRow '외부순환 For iY = 1 To iRefRow '내부순환 '각행에서 점수셀에 접근 Set rngTempX = rngPoint.Rows(iX).Cells(2) '조견테이블범위의 점수셀에 접근 Set rngTempY = rngRefTable.Rows(iY).Cells(1) '점수의 범위 비교 If rngTempX >= rngTempY _ And rngTempX <= rngTempY + 10 Then '범위내에 들어오는 점수이면 OK!!해당 등급전달 rngTempX.Offset(0, 1) = rngTempY.Offset(0, 1) '내부순환은 더이상 진행할 필요없으니..중단 Exit For End If Next If rngTempX.Offset(0, 1)="" Then rngTempX.Offset(0, 1)="F" If rngTempX.Offset(0, 1) = "F" Then With Range(rngTempX.Offset(0,-1),rngTempX.Offset(0,1)) .Interior.ColorIndex = 3 .Font.ColorIndex = 2 End With End If Next End Sub
Sub evaluateGradeLoopWithObj()
Dim rngPoint As Range, rngX As Range, rngY As Range
Dim rngRefTable As Range, iX As Integer, iY As Integer
Dim rngTempX As Range, rngTempY As Range
'점수테이블의 첫번째열에 접근
Set rngPoint = Range("A1").CurrentRegion.Columns(1)
Set rngRefTable = Range("G1").CurrentRegion.Columns(1)
'조견테이블의 두번째열에 접근
Set rngRefTable = rngRefTable.Offset(1). _
Resize(rngRefTable.Rows.Count - 1) On Error Resume Next '점수테이블의 열(rngPoint)의 각각의 셀을 순환 For Each rngX In rngPoint.Cells '조견테이블의 열(rngRefTable)의 각각의 셀을 순환 For Each rngY In rngRefTable.Cells '두개의 셀의 값이 맞는지 분석 If rngX.Offset(0, 1) >= rngY _ And rngX.Offset(0, 1) <= rngY + 10 Then '맞으면 조견테이블셀의 옆의셀(Offset(0,1)값을 '점수테이블이 셀의 옆셀에 전달한다 rngX.Offset(0, 2) = rngY.Offset(0, 1) '순환중간에 맞는것을 찾았다면 더이상 순환이 필요없다 '그래서 순환문의 탈출(Exit For) Exit For End If Next '내부순환이 끝났는데도 맞는 값이 없다면 'F로 처리하고.. If rngX.Offset(0, 2) = "" Then rngX.Offset(0, 2) = "F" If rngX.Offset(0, 2) = "F" Then 'F일 경우 외부셀을 확장하여 빨강색서식을 한다 With Range(rngX, rngX.Offset(0, 2)) .Interior.ColorIndex = 3 .Font.ColorIndex = 2 End With End If Next End Sub


프로그래밍은 아래의 그림과 같이 조건문을 다루는 브록
순환문을 다루는 브록
코딩을 간편하게 하기 위한 With브록등..
상호브록속으로 들어가기도 하고 혼자 있기도 하고
그러면서 각각의 브록은 하나하나의 명령문으로 구성되는것이다
이제 VBA의 문법은 중요한것은 모두 다룬셈이다
문법은 단순하다,하지만 숙달되지 않으면 어렵다
단순하나..숙달과 문제를 보는 감각을 요하는것!!
문제는 얼마나 융통성있게 구성하느냐의 문제인것이다




For Next Loop

For Each~Next Looping

위에서 For Each Object In Collection Object를 잠깐 사용하였었다
아직 오브젝트를 이야기 하지 않은 상태라서 좀 이해가 안되더라도
앞으로 계속 나올것이니까..차차 익숙해져 가도록 한다
배열을 순환할때 For문을 통하여 Index번호로 배열요소의 값을 얻기도 하고
쓰기도 하였다
For Each object In CollectionObject
의 구문으로도 배열을 순환할수 있다

Dim arrX(1 To 3) As String,iX As Integer
arrX(1)="꼴뚜기"
arrX(2)="오징어"
arrX(3)="낙지"
For iX=1 To 3
MsgBox arrX(iX)
Next

와 같이 하였었다
위의 구문을 아래와 같이 해도 되는것이다

Dim arrX(1 To 3) As String,varX As Variant
arrX(1)="꼴뚜기"
arrX(2)="오징어"
arrX(3)="낙지"
For Each varX In arrX
MsgBox varX
Next

두번째것이 간단하고 편리할것이다
이때 각각의 배열의 요소 역할을 하는 varX는 반드시
Variant타입변수로 선언하고 사용한다는 점!!
기억하시기 바라고 특별히 꺼꾸로 순환한다거나 배열의 요소를
어떤 순서에 의하여 찾아서 순환을 할 필요가 있을때는
번호로 찾는 순환문을 사용하시면 된다