<엑셀VBA 입문 11-2강> 배열(Array)

<엑셀VBA 입문 11-2강> 배열(Array)

<엑셀VBA 입문 11강> 배열 다루기 편이 너무 복잡하고 어렵게 쓰여진 것 같아서 다시 쓴다.

11 다시 2강이다.

VBA 배열을 배우기 위해서는 기본적으로 변수에 대해 알아야 한다.

혹시 변수에 대해 잘 모른다면 아래 글을 읽어보면 된다.

<엑셀VBA 입문 0.1강> 변수 (https://blog.naver.com/bb_/221313471573)

변수란 간단하게 값을 담는 상자라고 보면 된다.
배열이란 여러개의 변수가 연속된 것이다. 영어로는 Array[어레이]라고 한다.
다시 말해 변수가 상자라면, 배열은 상자 여러개를 이어붙여놓은 것이다.

1. 배열의 선언

배열의 선언은 “Dim 배열명(크기)” 라고 쓰면 된다.

ex) Dim arr(5)

예를 들어 Dim arr(5) 는 5칸의 배열을 뜻한다. 변수가 5개 연속되어 있다고 보면 된다.

사이즈가 5인 배열은 인덱스 0번부터 인덱스 4번까지의 공간을 갖게 된다.

즉, arr(0), arr(1), arr(2), arr(3), arr(4) 이렇게 5칸을 가지게 되는 것이다.

따라서 배열의 마지막 칸은 (사이즈 – 1)의 값을 갖는다. 알기 쉽게 Last Index[라스트 인덱스]라고 부르자.

2. 배열의 사용

배열을 만드는 이유는 반복문(for문) 처리에 용이하기 때문이다.

사이즈가 5인 배열이 있다면, 인덱스 0번부터 인덱스 4번까지 for문을 돌면서 데이터를 일괄 처리할 수 있다.

3. 배열의 정렬

공부삼아 배열의 값을 정렬하는 함수를 만들어보자.

네이버 메인페이지에서 신문사 이름을 긁어왔다. 이 단어들을 배열에 넣고, 배열을 가나다순(오름차순)으로 정렬하는 함수다.

소스코드는 아래와 같다.

Sub 매크로1()

‘ 매크로1 매크로

‘ 바로 가기 키: Ctrl+k

Dim arr(9)

arr(0) = “매일경제”
arr(1) = “한국경제”
arr(2) = “서울경제”
arr(3) = “국민일보”
arr(4) = “중앙일보”
arr(5) = “조선일보”
arr(6) = “한겨레”
arr(7) = “경향신문”
arr(8) = “매일경제”

‘정렬 이전 배열 표시한다.
MsgBox (getArrayString(arr))

‘배열 정렬한다.
Call sortArray(arr)

‘정렬 이후 배열 표시한다.
MsgBox (getArrayString(arr))

End Sub

‘sortArray : 배열 정렬하기
Function sortArray(arr)
    Dim cnt
    cnt = getArraySize(arr)
   
    Dim lastIdx
    lastIdx = cnt – 1
   
    Dim tempVal
   
    For i = 0 To lastIdx
        For k = i + 1 To lastIdx
            If checkFrontText(arr(i), arr(k)) Then
                tempVal = arr(i)
                arr(i) = arr(k)
                arr(k) = tempVal
            End If
        Next k
    Next i

End Function

‘getArrayString : 배열 텍스트로 만들기
Function getArrayString(arr)
    Dim cnt
    cnt = getArraySize(arr)
   
    Dim lastIdx
    lastIdx = cnt – 1

    Dim result
    result = “”

    For i = 0 To lastIdx
        result = result & i & ” : ” & arr(i) & Chr(10) & Chr(13)
    Next i
   
    getArrayString = result

End Function

‘checkFrontText : 단어 2개를 비교해서 앞쪽에 위치해야 할 경우 true 리턴
Function checkFrontText(text1, text2)

    Dim len1
    Dim len2
    len1 = Len(text1)
    len2 = Len(text2)
   
    ‘공통 길이를 구한다. 둘 중 짧은 길이가 공통된 길이다.
    Dim commonLen
    If len1 < len2 Then
        commonLen = len1
    Else
        commonLen = len2
    End If
   
   
    ‘공통 길이만큼 글자수를 돌면서
    ‘한 글자라도 다르면 true 또는 false를 리턴한다.
    Dim ch1
    Dim ch2
    For i = 1 To commonLen
        ch1 = Mid(text1, i, 1)
        ch2 = Mid(text2, i, 1)
       
        If ch1 > ch2 Then
            checkFrontText = True
            Exit Function
           
        ElseIf ch1 < ch2 Then
            checkFrontText = False
            Exit Function
        End If
    Next i
   
   
    ‘공통 길이만큼 비교했는데 문자열이 동일하다면, 짧은 문자열이 앞에 오도록 한다.
    If len1 > len2 Then
        checkFrontText = True
        Exit Function
    Else
        checkFrontText = False
        Exit Function
    End If
   
End Function

‘getArraySize : 배열 사이즈 가져오기
Function getArraySize(arr)
    getArraySize = UBound(arr) – LBound(arr)
End Function

4. 과제실습

시간이 허락한다면 추가적으로 과제를 실습해보자.

엑셀에서 특정 영역을 드래그해서 선택한 후, Ctrl + k 키를 누르면 오름차순 정렬되는 함수를 만드시오.

힌트를 주자면 Ctrl+K를 누르면 실행되는 함수의 내용은, 크게 3가지 함수로 나눌 수 있다.

(1-1) 드래그된 영역을 배열로 담는다.

(1-2) 배열을 오름차순 정렬(쏘팅)한다.

(1-3) 드래그된 영역의 셀 값을 수정한다.

이어지는 글 <엑셀VBA 입문 12강> 특정파일 특정시트의 특정셀을 가져오는 매크로 : https://blog.naver.com/bb_/221288948784

이어지는 글 <엑셀VBA 입문 13강> 선택영역 한꺼번에 변경하기(VBA Selection)  : https://blog.naver.com/bb_/221303389424

이어지는 글 <엑셀VBA 입문 14강> On Error 구문의 사용 : https://blog.naver.com/bb_/221329746966