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

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

택이형. 2023. 1. 9.

 

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

 

 

fore each ~ next

 

 

 

For Each ~ Next문은 For ~ Next에 Each가 추가된 형태입니다. For ~ Next가 지정한 횟수만큼 반복하는 반복문이었다면, For Each ~ Next는 범위 내 개체 또는 배열 내의 요소를 하나씩 접근하여 명령을 실행하는 반복문입니다. 말로는 이해가 어려우니 문법과 예제를 통해 알아보도록 하겠습니다.

 

▼ 아직 For ~ Next가 익숙해지지 않았다면 먼저 숙지하고 오시는 것이 도움이 됩니다.

 

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

『 오늘은 VBA 반복문에 대해 알아보려고 하는데요. 반복문은 반복적인 작업을 대신해주는 만능키라고 할 수 있어요. 반복문은 지정한 횟수만큼, 혹은 무한으로 사용된 코드를 반복하게 만들어

lst914.tistory.com

 

 

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

 

For each ~ Next의 문법은 다음과 같습니다. 앞서 학습했던 For ~ next와 비슷한 형태를 갖고 있네요.

 

For each 변수 in 범위(컬렉션)
    반복할 내용
next

 

for each ~ next 반복문에서 사용할 개체변수를 개체 형식으로 선언하고 범위 내의 개체를 개체 변수에 입력 후 반복문을 실행합니다. 범위 내 개체 모두 실행이 완료되면 종료되는 프로세스입니다.

 

회사별 평가점수를 입력할 시트를 1개 만들고 삼성, LG, SK별 워크시트를 각각 1개씩 만들어 줍니다. 총 4개의 워크시트가 필요하며, 데이터는 각 회사별 워크시트에만 입력 후 『점수』 워크시트에 종합하는 프로시저를 만들어 보겠습니다.

 

먼저 기본정보가 입력된 예시를 한번 살펴보시죠.

 

For each ~ Next문의 예시
For each ~ Next문의 예시

 

워크시트별 회사명과 평균점수를 『점수』 워크시트에 차례대로 붙여 넣는 프로시저를 만들어 보도록 하겠습니다.

Sub test2()

Dim WS As Worksheet
Dim row As Long
' 변수의 속성이 다르기 때문에 줄 바꿈을 하여 구분해 주었습니다.

row = 3
' 점수 워크시트에 기입해야 하는 행이 3행입니다.

For Each WS In Worksheets
' 워크시트 하나하나를 비교하겠다.

     If WS.Name <> "점수" Then
      ' 워크시트의 이름이 점수가 아니면
          Range("B" & row).Value = WS.Name
             ' "B3"셀에 워크시트의 명칭(회사명)을 입력
          Range("C" & row).Value = WS.Range("c2").Value
             ' "C3"셀에 평균점수를 입력
          row = row + 1
             ' 행의 위치를 +1씩 이동하여 반복
     End If
' 처음으로 돌아가서 종료될 때까지 반복
Next

End Sub

 

 

 

 

 

순서대로 한번 살펴볼까요? 

Dim WS As Worksheet / Dim row As Long의 경우 각각이 가지는 속성이 다르기 때문에 줄 바꿈을 통해 구분해 주었어요.

row = 3는 "점수" 워크시트에 기입해야 하는 행이 3행이기 때문에 3행부터 시작하고자 변수로 선언해준 값입니다.

For Each WS In Worksheets ~ Next는 엑셀 워크시트 하나하나를 WS 개체로 반영하겠다는 내용이며, 그 안에 있는 반복할 실행문을 반복하기 위한 시작점이며, Next는 종료되는 부분이라고 생각하시면 좋을 실 것 같아요.

 

다음은 IF문을 사용하여 워크시트별로 확인하는 절차를 진행하게 되는데요.

If WS.Name <> "점수" Then는 개별 WS의 이름이 "점수"인지를 확인하고 일치하지 않으면 다음 단계로 넘어가겠다는 내용입니다. 다음 행에 사용된 Range("B" & row).Value = WS.Name는 WS가 점수가 아니라면 B3셀에 WS의 이름을 넣겠다는 것이며, Range("C" & row).Value = WS.Range("c2").Value은 C3셀에 평균값을 넣겠다는 것을 나타냅니다.

 

row = row + 1은 "B3", "C3"셀에 각각의 값이 반영되었으니, "B4", "C4"셀에 값을 반영하기 위해 행의 수를 한 단계 높여주는 작업을 진행한 것입니다. 이렇게 되면 다시 For Each WS In Worksheets로 돌아가서 워크시트의 숫자만큼 반복하여 작업이 진행됩니다. 실행이 완료되었을 때 비로소 Next를 통해 For Each문을 빠져나오게 되는 것이죠.

 

그럼 결과물을 한번 보시죠!

 

For Each ~ Next 결과
For Each ~ Next 결과

 


마치며

VBA에서 반복문만 자유롭게 사용할 수 있다면 정말 많은 것들을 자동화시킬 수 있습니다. 엑셀은 "기술"이 아닌 "기능"이라고 하죠. 반복해서 연습한다면 누구나 도달가능한 능력입니다. 지금은 힘들지라도 업무자동화를 이룩하여 나만의 시간을 만들기 위해 계속 노력해 보자고요!

 

 

▼함께 보면 좋은 정보

 

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

『 오늘은 VBA 반복문에 대해 알아보려고 하는데요. 반복문은 반복적인 작업을 대신해주는 만능키라고 할 수 있어요. 반복문은 지정한 횟수만큼, 혹은 무한으로 사용된 코드를 반복하게 만들어

lst914.tistory.com

 

 

Do ~ Loop문(While, Until)

드디어 VBA반복문의 마지막 Do ~ Loop문에 도달하였습니다. 반복문의 사용방법과 효과는 다 비슷비슷합니다. 다만 상황에 따라 어떠한 반복문을 선택할지를 결정하면 되는 것이죠. 오늘은 Do ~ Loop

lst914.tistory.com

 

 

VBA로 엑셀 데이터 필터기능 적용하기!

『 수많은 raw데이터 중에서 내가 원하는 부분만 걸러서 보기 위해서 엑셀의 필터기능을 많이 사용하고 계십니다. 필터기능 역시 VBA를 통해 구현이 가능한데요. 원하는 기준으로 필터 적용 후 필

lst914.tistory.com

 

 

VBA로 로우 데이터 정렬하기(1개의 기준으로 정렬, 2개이상의 기준으로 정렬)

『 엑셀작업을 할 때 가장 많이 시간이 소용되는 것은 데이터를 원하는 형태로 정리하는 것인데요. 주로 엑셀의 정렬기능을 이용하여 데이터를 가공하곤 합니다. 하지만 매번 바뀌는 로우데이

lst914.tistory.com

 

노력은 배신하지 않는다.

댓글