Excel & IT Info

아이엑셀러 닷컴, 엑셀러TV

VBA

[VBA 입문] 12강. 실행 순서 제어(2) ㅡ For ~ Next 문

권현욱(엑셀러) 2023. 10. 5. 08:00
반응형

들어가며

뭐니 뭐니 해도 컴퓨터의 큰 장점 중 하나는 시키면 시키는 대로, 군말 없이 반복 작업을 신속하게 처리한다는 점입니다. 반복 작업을 처리할 수 있는 대표적인 방법 중 하나가 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 반복문은 이 뼈대의 변주에 지나지 않습니다. 그러기 위해서는 오늘 내용을 철저히 숙지하는 것이 필요하겠죠.

반응형