들어가며
뭐니 뭐니 해도 컴퓨터의 큰 장점 중 하나는 시키면 시키는 대로, 군말 없이 반복 작업을 신속하게 처리한다는 점입니다. 반복 작업을 처리할 수 있는 대표적인 방법 중 하나가 For ~ Next 문입니다.
조건문에 이어서 제어문까지 익히게 되면 여러분의 코딩 실력은 점점 완성도를 높여가게 됩니다. 떠날 준비되셨나요? 출발합니다.
For ~ Next 기본
For ~ Next 문을 사용하는 기본적인 형식은 다음과 같습니다. [ ] 부분은 생략할 수 있습니다.
For counter = 시작 수 To 끝 수 [Step 증가값]
명령문
명령문
Next [counter]
여기서 counter를 '순환 변수', '깃발(flag) 변수'라고도 부릅니다. 반복문을 한 번 실행할 때마다 몇 번째 순환을 돌고 있는지 깃발로 꽂아 표시하는 역할을 한다고 해서 붙인 이름입니다.
다음 코드를 실행하면 1부터 100까지 숫자의 합계가 구해집니다.
Sub for_next_1()
Dim iSum As Integer
Dim i As Integer
For i = 1 To 100
iSum = iSum + i
Next
MsgBox "결과: " & iSum
End Sub
시작되는 값과 끝나는 값을 상황에 따라 변경할 수 있도록 해 볼까요? 다음 코드는 시작할 숫자와 끝나는 숫자를 사용자로부터 입력받아서 두 숫자 사이의 합계를 보여줍니다.
Sub for_next_2()
Dim iStart As Long
Dim iEnd As Long
Dim lSum As Long
Dim i As Integer
iStart = Application.inputBox("시작할 숫자를 입력하세요")
iEnd = Application.inputBox("끝나는 숫자를 입력하세요")
If iStart >= iEnd Then
MsgBox "시작값이 끝값보다 크면 안됩니다"
Exit Sub
End If
For i = iStart To iEnd
lSum = lSum + i
Next
MsgBox "두 숫자 사이의 합계: " & lSum
End Sub
혹시 있을지 모를 오류(예. 시작값을 끝값보다 큰 값 입력)를 방지하기 위한 구문이 들어 있어서 그렇지 핵심적인 부분은 얼마 안 됩니다.
사용자로부터 값을 입력받기 위해 InputBox라는 것이 사용되었군요. 바로 이어서 설명합니다.
InputBox 메서드
InputBox 함수를 이용하면 사용자로부터 값을 입력받을 수 있습니다. MsgBox가 VBA의 대표적인 출력 도구라면 InputBox는 대표적인 입력 도구입니다. 두 가지 모두 사용자들과 직접 커뮤니케이션할 수 있는 유일한 도구입니다(하나는 입력용, 다른 것은 출력용).
InputBox 함수의 사용 형식은 다음과 같습니다.
InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)
실무에서는 Prompt, Title, Default, Type 정도가 주로 사용됩니다.
매개변수 | 설명 |
Prompt | InputBox에 표시할 텍스트 |
Title | InputBox의 제목에 표시할 내용 설정. 생략하면 '입력' 표시 |
Default | InputBox의 입력란에 표시할 디폴트값 설정 |
Left, Top | InputBox를 표시할 위치(왼쪽, 상단) |
HelpFile | 도움말 파일을 지정할 때 사용 |
HelpContextID | 도움말 파일의 context ID 지정 |
Type | 반환 데이터 유형 지정 |
다음 코드를 실행하면 입력받은 사용자의 이름이 메시지 상자에 표시됩니다. 매개변수 중에서 Prompt와 Default가 사용되었습니다. 중간에 Titel은 사용하지 않을 경우 콤마로 구분한 점에 유의하세요.
Sub inputBox_Method_1()
Dim sMsg As String
sMsg = Application.inputBox("이름 입력", , "이름을 입력하세요")
MsgBox "안녕하세요 " & sMsg & "님"
End Sub
InputBox 메서드는 이것 말고도 설명할 내용이 더 있습니다만, 이번 시간에는 이쯤 하도록 합니다. 나머지는 나중에 기회가 될 때 실제 코드를 통해 알아가도록 하겠습니다.
중첩 For ~ Next 문
중첩 For ~ Next는 For ~ Next 문 안에 또 For ~ Next가 들어있는 형태를 말합니다. 06강에서 구구단 테이블을 만드는 코드를 소개한 적이 있습니다. 그때는 반복문을 배우기 전이라 눈치로 흐름을 파악했지만 이제는 이해할 수 있습니다.
Sub 구구단_테이블()
Dim i As Integer
Dim j As Integer
For i = 2 To 9
For j = 1 To 9
Cells(j + 1, i - 1) = i & " X " & j & " = " & i * j
Next j
Next i
End Sub
바깥쪽 반복문(i)이 한 번 순환하는 동안, 안쪽 반복문(j)은 9번 순환합니다. 결국 72번(8 X 9)을 반복합니다. 한 번 순환할 때마다 그 결과를 Cells 속성으로 접근한 셀에 표시합니다.
Cells 속성은 'Cells(행번호, 열번호)'라는 사실을 다시 한 번 기억하시기 바랍니다. 예를 들어 B5라는 셀은 Cells(5, 2)와 같이 행과 열 순서가 서로 반대라는 점에 유의하세요.
For Each ~ In ~ Next 문
For Each ~ In ~ Next 문을 사용하면 컬렉션 개체의 각 요소에 접근할 때 편리합니다. 사용 형식은 다음과 같습니다.
For Each 개체변수 In 컬렉션 개체
명령문
명령문
[Exit For]
명령문
Next
컬렉션 개체에 대해서는 개체에 대해 소개할 때 언급했습니다. Workbooks, Worksheets, Cells처럼 개체명 뒤에 's'가 붙는 것이 컬렉션 개체죠? 현재 통합 문서에 있는 워크시트 이름을 A1 셀부터 아래로 표시하는 코드를 만들어봅니다.
Sub for_each_in_next()
Dim wsX As Worksheet ' 개체변수(순환)
Dim i As Integer ' 행 번호 지정을 위한 변수
' For Each ~ In ~ Next 문을 통해 문서 내의 모든 워크시트에 순차적으로 접근
For Each wsX In ActiveWorkbook.Worksheets
i = i + 1 ' 행 번호 1씩 증가
Cells(i, 1) = wsX.Name ' A열(1)에 시트 이름 표시
Next
End Sub
주석과 함께 코드를 읽어보세요. 이제 눈치로 파악하는 것이 아니라 진행되는 과정이 눈에 들어오기 시작할 겁니다. 만약 아직은 그렇지 않다 하더라도 걱정할 것 없습니다. 앞으로도 계속 반복되니까요.
For Each ~ In ~ Next 문도 실무에서 많이 사용됩니다. 사용 형식과 예제를 잘 익혀두세요.
나가며
반복문의 2가지 종류 중 하나인 For ~ Next 문의 뼈대를 이해하게 되었습니다. 축하합니다. 실무에서 마주하게 될 For ~ Next 반복문은 이 뼈대의 변주에 지나지 않습니다. 그러기 위해서는 오늘 내용을 철저히 숙지하는 것이 필요하겠죠.
'VBA' 카테고리의 다른 글
[VBA 입문] 14강. 실행 순서 제어(4) ㅡ GoTo 문 (2) | 2023.10.07 |
---|---|
[VBA 입문] 13강. 실행 순서 제어(3) ㅡ Do ~ Loop 문 (0) | 2023.10.06 |
[VBA 입문] 11강. 실행 순서 제어(1) ㅡ 조건 분기 (0) | 2023.10.04 |
[VBA 입문] 10강. 연산자, 변수와 상수 (112) | 2023.10.03 |
[VBA 입문] 09강. 레인지 개체(4) ㅡ 특별한 범위 선택하기 (104) | 2023.10.02 |