티스토리 뷰
이전 글에서는 엑셀 매크로에서 반복문 처리를 위한 For Next의 사용법에 대해서 알아보았습니다. For Next 구문에 대해서 아직 잘 모르시는 분들은 아래의 글을 참고하시기 바랍니다.
이 글에서는 For Next 구문과는 동일한 방식으로 반복문에 사용되기는 하지만, 조금은 다른 방식으로 사용되는 For Each Next 구문에 대해서 알아보도록 하겠습니다. 먼저 For Next와 For Each Next 구문의 차이점에 대해서 알아볼까요.
For Next는 지정된 횟수를 반복하게끔 처리하는 반복 구문입니다. For Each Next 구문은 입력되는 Collection의 갯수만큼 반복할 수 있은 반복 구문입니다. For Next는 숫자를 통해서 처리를 했다고 한다면, For Each Next는 배열과 같은 Collection 기반의 자료구조를 기반으로 반복 횟수를 정하고 처리하게 됩니다.
즉, For Each Next 구문은 컬렉션의 개체를 순환하면서 데이터를 처리하거나, 값을 읽어오는 수단으로 많이 사용이 됩니다. 컴파일러 내부적으로 For Next 구문보다 For Each Next 구문의 처리속도가 훨씬 월등히 빠르기 때문에 컬렌셕 기반의 반복 구문을 사용할 때는 For Each Next 구문을 사용하는것이 더 효율적입니다.
VBA 뿐만 아니라 For Each 구문은 .NET Framework 기반에서도 많이 사용되는 구문입니다. C# 과 관련된 이전 글에서 For Each 구문에 대해서 정의를 해 놓았으니 관심이 있으신 분들은 아래의 링크에서 좀더 상세한 내용을 확인하실 수 있습니다.
For Each Next 구문의 사용 방법은 아래와 같습니다.
For Each 변수이름 In 컬렉션
' Code
Next
For Each 구문을 이용하기 위해서는 변수 이름과 컬렉션에 대한 내역만 넣어주시면 됩니다. 변수이름은 컬렉션의 데이터 타입과 동일해야 합니다. For Each 구문이 처음으로 실행되면 변수이름에는 컬렉션의 첫번째 데이터가, 두번째 반복시에는 두번째 데이터가 들어가게 됩니다. 10번째 반복수행이 되면 컬렉션의 10번째 데이터가 들어가게끔 되겠죠.
이전 글에서 만들어본 로또 프로그램을 For Each 구문을 이용하여 일부분을 변경해 보았습니다.
Sub GetLottoNumbers()
Dim nums(6) As Integer
Dim randomValue, index As Integer
Dim duplicatedIndex As Integer
Dim isDuplicated
For index = 1 To 6
Do
randomValue = Int((45 + 1) * Rnd())
For duplicatedIndex = 1 To 6
If nums(duplicatedIndex) = randomValue Then
isDuplicated = True
Exit For
Else
isDuplicated = False
End If
Next
Loop While (isDuplicated)
nums(index) = randomValue
Next
index = 1
For Each ran In Range("A1:A6")
ran.Value = nums(index)
index = index + 1
Next
End Sub
위의 코드를 보시면 아시겠지만, 배열을 계산하고 이를 Excel에 등록하는 부분만 변경이 되었습니다. 이전의 코드에서는 Cells를 통해서 직접 Row, Column을 지정하여 데이터를 등록하였습니다만, 이번 변경된 코드는 Range 오브젝트를 이용하여 Range를 지정하고 지정된 곳에 값을 넣었습니다.
Range 오브젝트를 사용하는 방법은 여러가지가 있습니다.
- Range(Cell1, Cell2) : Cell1과 Cell2를 넣게 되면 Cell1과 Cell2사이의 모든 셀들이 지정이 되게 됩니다.
- Range("A1") : 지정된 하나의 Cell만 Range에 지정이 되게 됩니다.
- Rnage("A1:A6") : A1부터 A6까지 사이의 모든 셀들이 지정이 되게 됩니다.
'프로그래밍 팁s > Excel(Macro, VBA)' 카테고리의 다른 글
[엑셀 매크로 VBA] IIF 함수에 대해서 (0) | 2014.12.05 |
---|---|
[엑셀 매크로 VBA] 조건문 - IF문과 비교 / 논리연산자에 대해서 (0) | 2014.12.04 |
[엑셀 매크로 VBA] 반복문 - For Next (로또 프로그램) (0) | 2014.11.28 |
[엑셀 매크로 VBA] 변수의 범위 - 지역변수, 전역변수, 정적변수 (0) | 2014.11.25 |
[엑셀 매크로 VBA] 정적 배열과 동적 배열을 선언하고 사용하는 방법 (6) | 2014.11.24 |