회사 생존기/엑셀 VBA로 생존하기

VBA 반복문 1탄(for~next 사용하기)

택이형. 2023. 1. 3.

 

오늘은 VBA 반복문에 대해 알아보려고 하는데요. 반복문은 반복적인 작업을 대신해주는 만능키라고 할 수 있어요. 반복문은 지정한 횟수만큼, 혹은 무한으로 사용된 코드를 반복하게 만들어 주는 역할을 하는데요. 반복문을 사용하면 사람이 계산하기에 많은 시간이 소요되는 일도 빠르게 처리할 수 있다는 장점이 있으며, 반복작업에 따르는 실수를 예방할 수 있는 역할을 하기도 하죠.

 

For ~ Next문 사용하기

 

 

VBA에서도 반복문은 다양한 종류로 사용이 가능합니다. 오늘은 VBA반복문의 첫 시간으로 For ~ Next문을 사용한 반복문에 대해 알아보는 시간을 갖도록 해요. VBA반복문 2탄에서는 For each ~ Next문을 사용하여 반복문을 표현할 예정인데요.

For ~ Next문과 For each ~ Next문의 사용방법의 차이를 생각하면서 학습하시면 실력향상에 큰 도움이 될 것에요. 그럼 시작해 보시죠!

 

▼ For ~ Next문을 이미 알고 계시다면 바로 다음 단계로 넘어가시길 바랍니다.

 

VBA 반복문 2탄(For each ~ Next 사용하기)

『 For ~ next문과 For each ~ next문만 자유롭게 사용가능하다면 업무자동화에 한 발짝 더 다가섰다고 할 수 있습니다. 그만큼 사용빈도가 높고 중요한 내용이라고 할 수 있습니다. 업무자동화를 위해

lst914.tistory.com

 

 

 For ~ Next문의 기본문법을 알아보자.

 

예시를 한번 살펴보시죠.

For~next 예시
For~next 예시

 

a3셀의 점수에 따라 b3셀에 "A", "B", "C", "F"를 입력하고, 마지막 행이 존재하는 a10셀까지 동일한 작업을 반복하여 기입하는 매크로를 작성해 보려고 해요. 물론 반복문을 사용하지 않고 range 혹은 cells 개체를 통해 하나씩 반복해줄 수도 있는데요. 그러한 노가다를 하지 않고자 반복문을 사용하는 것이죠!

 

 sub for_next()

' 기본문법
' for 변수 = 시작값 to 종료값 step 증가값(감소값)
     ' 반복이 필요한 구문
' Next

Dim i as long, cnt as long

cnt = range("a2").End(xlDown).Row
' 행의 수를 카운팅 하는 방법으로 A열의 마지막 로우의 번호를 출력
' cnt = range("a2").CurrentRegion.Rows.Count 로 대체 가능

For i = 3 to cnt
' 3부터 cnt까지 반복(행의 수를 카운팅한 번호까지)

     If Cells(i, "a") >= 90 then
        Cells(i, "B") = "A"
' a3셀의 값이 90과 같거나 크면 b3셀에 "A"를 출력

     Elseif Cells(i,"a") >= 80 then
        Cells(i, "b") = "B"
' a3셀의 값이 80과 같거나 크면 b3셀에 "B"를 출력

     Elseif Cells(i,"a") >= 70 then
        Cells(i, "b") = "C"
' a3셀의 값이 70과 같거나 크면 b3셀에 "C"를 출력

     Else
        Cells(i,"b") = "F"
' a3셀의 값이 70 미만이면 b3셀에 "F"를 출력
     
     End if
' IF절 종료

next

End sub

 

순서대로 매크로를 살펴보겠습니다. 우리가 원하고자 하는 값을 입력할 때 반복문을 사용하지 않고도 매크로 작성이 가능합니다. 다만 위에서도 말씀드렸다시피 반복문을 사용하지 않고 단순작업을 통해 매크로를 짠다면 엑셀에서 직접 IF함수를 사용하는 것보다 훨씬 더 비효율적인 방법이 될 것은 자명한 일입니다.

 

심지어, 데이터가 늘어나는 시트라면 동일한 코드를 반복적으로 붙여 넣는 수고는 자연스레 따라오게 될 것입니다.

우리가 VBA를 사용하는 이유가 노가다를 하지 않고 업무자동화를 이룩하기 위한 것이기 때문에 위와 같이 작업하면 작업소요만 늘어나는 최악의 결과를 나타내게 됩니다.

 

그럼 For ~ next의 기본문법 부터 살펴볼게요.

For 변수 = 시작값 to 종료값 [step 증가값(감소값)]
         반복이 필요한 구문
Next 
※ 변수는 보통 i를 사용함(사실 아무거나 넣어도 상관없으나 습관란게 무서운 것이죠.)

 

변수 = 시작값 to 종료값에는 반복을 시작할 값부터 마지막으로 반복할 횟수를 종료값에 넣어주면 되는데요. Step의 경우는 시작값부터 종료값까지 원하는 숫자간격을 반영할 수 있도록 해주는 조건값이에요~ 하나씩 증가시킬 경우에는 생략이 가능합니다.

 

Dim i as long, cnt as long

cnt = range("a2").End(xlDown).Row
' 행의 수를 카운팅 하는 방법으로 A열의 마지막 로우의 번호를 출력
' cnt = range("a2").CurrentRegion.Rows.Count 로 대체 가능

 

먼저 변수 선언을 하겠습니다. i의 경우는 For의 변수로 사용될 예정이며, Cnt의 경우는 데이터가 있는 마지막 행의 열을 담을 예정입니다. 그래야 수기작업 없이 데이터가 늘어나도 자동반영이 될 테니까요.

여기서 중요한 부분은 range("a2").End(xlDown).Row인데요. A2셀을 시작으로 데이터가 있는 가장 마지막셀로 이동하여 행번호를 출력하겠다는 내용입니다. 이번 내용의 자동화를 위해서는 가장 중요한 부분이 되겠습니다.

 

For i = 3 to cnt
' 3부터 cnt까지 반복(행의 수를 카운팅 한 번호까지)

     If Cells(i, "a") >= 90 then
        Cells(i, "B") = "A"
' a3셀의 값이 90과 같거나 크면 b3셀에 "A"를 출력

     Elseif Cells(i,"a") >= 80 then
        Cells(i, "b") = "B"
' a3셀의 값이 80과 같거나 크면 b3셀에 "B"를 출력

     Elseif Cells(i,"a") >= 70 then
        Cells(i, "b") = "C"
' a3셀의 값이 70과 같거나 크면 b3셀에 "C"를 출력

     Else
        Cells(i,"b") = "F"
' a3셀의 값이 70 미만이면 b3셀에 "F"를 출력
     
     End if
' IF절 종료

next

 

For i = 3 to cnt는 『3부터 데이터가 있는 마지막 행까지 반복하겠다.』는 내용입니다. 

앞에서 나왔던 IF가 본격적으로 등장할 차례입니다. If Cells(i, "a") >= 90 then Cells(i, "B") = "A"  중에서는

당연 Cells(3,"a") Cells(3, "a")에 집중해야 합니다. A3셀을 시작으로 A10셀(Cnt로 설정된 마지막 행)까지를 반복하겠다는 내용이기 때문이죠. 결국 A3셀부터 A10까지의 점수가 90점이 높다면 B3셀부터 B10셀까지 "A"등급을 부여하겠다는 것이죠.

 

그 이후에는 IF구문에 의해 "B ~ F등급"을 B열에 부여하게 됩니다.

조금 복잡해 보일 수 있으나, 반복문과 IF문을 분리해서 보시면 이해가 빠르게 되실 거예요.

 


 활용 : For ~ Next문을 활용하여 구구단을 만들어 봅시다.

 

지금까지 For ~ next문을 활용한 간단한 예제를 해결해 보았습니다. 조금 더 심화내용으로 적용하여 구구단을 만들어 보도록 할게요. 빈 워크시트에 구구단을 표현할 예정이기 때문에 별도의 예제파일은 없어요. 바로 코딩 후 실행시키면 구구단이 완성되도록 만들어 볼 예정입니다~

 

우선 코드를 먼저 보신 후 한 단계씩 설명하는 방식으로 접근해 보도록 할게요.

Sub gugu()

Dim i As Long, j As Long
' i, j변수에 1~9의 숫자를 넣을 것이기 때문에 Long타입을 선언

For i = 1 To 9
    Sheets("sheet1").Cells(1, i) = i & "단"
' 1행에 1단~9단까지를 표현해 주기 위한 코드
' 셀위치를 Cells속성으로 표현하였으며, 1행은 고정하고 i변수를 통해 1~9까지 반복 적용.


    For j = 1 To 9 step 1
' step 1은 1부터 9까지 1씩 증가하도록 설정(생략 가능).
' step 2 적용 시 1부터 9까지 2씩 증가함.
     
         Sheets("sheet1").Cells(j + 1, i) = i & " X " & j & " = " & i * j
' 1행에 1~9단을 표현하였기 때문에 2행부터 구구단이 적용되어야 함.
' 셀위치를 Cells속성으로 표현하였으며, j + 1은 행(2행 시작)을, i는 열(1열 시작)을 나타냄.
' 선택된 셀위치에 i 과 j 변수를 사용하여 구구단 식이 완성되도록 반복문을 돌림 

    Next
' j 종료

Next
' i 종료

Range("a1").CurrentRegion.EntireColumn.AutoFit
'데이터가 다 보이도록 열간격 조정

End Sub

 

구구단의 원리를 생각해 보면 1부터 9까지를 순차적으로 곱해서 나오는 결과라는 것을 알 수 있어요.

이러한 원리를 VBA로 구현하기 위해 I와 J변수를 사용하여 1부터 9까지 반복될 수 있도록 변수로 선언하였죠.

 

Sub gugu()
Dim i As Long, j As Long

 

 i, j변수에 1~9의 숫자를 넣을 것이기 때문에 Long타입을 선언하기 위한 작업입니다.

 

For i = 1 To 9
    Sheets("sheet1").Cells(1, i) = i & "단"
  
    For j = 1 To 9 
 
         Sheets("sheet1").Cells(j + 1, i) = i & " X " & j & " = " & i * j

    Next
Next

 

For i = 1 to 9  Sheets("sheet1").Cells(1, i) = i & "단"을 사용하여 1행에 1단~9단이라는 텍스트가 출력되도록 반복문 작성하였습니다. 또한 구구단 구현을 하기 위해 행으로 1~9까지 1씩 증가하며 열 방향으로 채워지는 역할을 하게 되죠.

 

For j = 1 To 9Sheets("sheet1").Cells(j + 1, i) 구문으로 들어오게 되면 J변수의 반복(1~9까지)이 완료되어야 다시 I변수가 담긴 For문으로 이동한다는 점을 이해하셔야 합니다. "F9버튼"을 통해 어떻게 작동하는지 하나씩 확인해 보시면 쉽게 이해하실 수 있습니다. 1단이 완성된 후 For i로 이동하여 2단을 만들기 시작하네요.

 

J변수로 인해 구구단이 채워져 가는 과정
J변수로 인해 구구단이 채워져 가는 과정

 

 

결국 I변수에 사용된 1~9는 열 방향으로, J변수의 1~9는 행방향으로 채워지면서 구구단을 완성하게 됩니다.

= i & " X " & j & " = " & i * j는 구구단 식을 완성하기 위해 문자열로 나타낸 내용입니다. 만약 식이 아닌 숫자가 바로 표현되게 하고 싶으시다면 i * j 만 사용하시면 바로 완성되겠네요.

Range("a1").CurrentRegion.EntireColumn.AutoFit
end sub

 

 

구구단 식으로 표현되다 보니 셀에 다 담기지 않는 모습을 볼 수 있는데요. A1셀을 기준으로 연속된 범위를 설정하여 셀의 넓이를 조정해주는 구문입니다. 셀범위 선택을 위해 CurrentRegion라는 반가운 친구가 등장하였네요.

자 그럼 구구단 완성 결과를 한번 보시죠!

 

구구단 완성
구구단 완성

 


마치며

지금까지 For ~ next문의 기본문법과 사용법에 대해 알아보았는데요. 반복문과 IF문만 제대로 숙지하여도 루틴업무의 자동화를 이루는 것은 어렵지 않으실 것이라 생각됩니다. 실제로 택이형의 경우도 반복문과 IF문만 알고 있던 초보시절에도 간단한 자동화를 통해 시간을 절약했던 경험이 있으니까요. 제가 했다는 것은 직장인 여러분도 충분히 하실 수 있다는 반증입니다. 지금도 회사에서 열일하고 계시는 직장인 여러분을 응원합니다. 

 

▼▼▼함께 읽으면 좋은 글▼▼▼

 

VBA 빈셀 채우기!(피벗테이블 오류 최소화 방법)

『 피벗테이블을 사용할 때 가장 주의하여야 할 점은 셀병합으로 인해 숫자가 누락되는 것입니다. 또한 합계가 되는 기준셀의 명칭이 없게 되면 우리가 원하는 값에 도달할 수 없다는 것이죠.

lst914.tistory.com

 

 

VBA로 셀병합 해제 후 빈셀 채우기(빈셀 채우기와 찰떡궁합!)

병합되어 있는 표는 피벗테이블을 사용할 때 오류 발생이 높은 형태로 알려져 있습니다. 오류를 최소화하기 위해서는 셀병합은 되도록이면 사용하지 않는 습관을 들이는 것이 가장 좋을 것입니

lst914.tistory.com

 

 

VBA로 행ㆍ열 삽입, 삭제하기(entirerow, entirecolumn, resize활용)

데이터로우를 구축하거나, 가공할 때 행열을 삽입하거나 삭제하는 작업을 하게 됩니다. 또한 특정 조건에 맞는 행의 수를 삽입하거나 열의 수를 삭제함으로써 원하는 형태로 가공하는 작업을

lst914.tistory.com

 

 

Like로 조건에 맞는 데이터 추출하기!

『 회사 실무자들이 업무를 처리하다 보면 상품 혹은 거래처 코드가 123-a-11aa와 같은 형태로 부여되고 있다는 것을 알 수 있습니다. 숫자와 영문, 특수문자가 혼합된 코드를 가지고 원하는 부분

lst914.tistory.com

 

 

노력 없이는 아무것도 바뀌지 않는다.

댓글