Skip Navigation Links.
Expand VBAVBA
엑셀프로그래밍이 필요한 이유
Expand ExcelExcel
Expand External LibraryExternal Library
Expand SolutionSolution
Expand EssayEssay

Variables|Array
|Int()|Rnd()|Multi-Dimensional-Array|Set|Range|
|Option Base|Dynamic-Array|

같은 타입의 정보가 한꺼번에 모여 있을때

실은 엑셀에 능숙하신 분들은 이미 배열을 사용하고 계신것이다
엑셀의 워크시트 자체가 배열인것이다
그것도 한방향배열이 아닌 쌍방향 배열..즉 다중배열을
능숙하게 다루고 있는것이다

예를 들어서 아래와 같은 워크시트의 범위("A1:H1")의 각각의 셀에
프로그래밍적으로 난수를 발생시켜 값을 입력하고 싶다고 할때
배열을 사용하면 편리한것이다
아래의 배열값다시만들기 버튼을 크릭하면 코드가 수정되고
VBA프로시져실행버튼을 크릭하면 시트의 범위에 값이 옮겨지는것을 볼수있다

A B C D E F G H
1


Sub excelItselfArray()
Dim lngX(1 To 8) As Long
lngX(1) = 343'Int(Rnd()*1000)+100 이하 모두 난수로 얻어진값
lngX(2) = 134
lngX(3) = 34
lngX(4) = 304
lngX(5) = 134
lngX(6) = 184
lngX(7) = 160
lngX(8) = 15

Range("A1:H1") = lngX  
End Sub

    


Range("A1:H1") = lngX
의 구문이 배열을 범위로 전달하는 구문인것이다
이것의 의미는 범위자체가 배열인것이다

그런데 위의 프로시져를 보아서는 별로 무엇이 편리하고..
효율적인지 감이 안올수도 있다
실제로는 위와 같이 구문을 작성하지 않는다
위는 초보님들에게 이해를 돕기 위한것이고 실제로는 아래와 같이
작성할것이다..물론 아직 다루지 않은 순환문이 들어간다
컴퓨터 프로그래밍은 이렇게 각각의 기능이 모두 어우러질때
효율적인 코딩이 이루어 진다
순환문없는 배열은 별 의미가 없다

A B C D E F G H
1


Sub excelItselfArrayWithLoop()
Dim lngX(1 To 8) As Long
Dim iX As Integer
For iX = 1 To 8 '배열의 갯수만큼 반복작업을 한다
     lngX(iX) = Int(Rnd() * 1000) + 100
Next
Range("A5:H5") = lngX
End Sub

다중배열/Multi-Dimenstional-Array

위의 배열은 한방향으로만 구성된 1차배열이였다
배열은 2차,3차..n차로 다중 배열을 구성할수 있다
엑셀의 워크시트는 열과 행으로 구성된 2차배열이다

Sub multi_dimensional_array()
Dim lngX(1 To 3, 1 To 8) As Long
Dim iX As Integer, iY As Integer
'순환문이 없다면 의미없는 바보같은 작업을 아래와 같이 한다
'lngX(1, 1) = Int(Rnd() * 1000) + 100
'lngX(1, 2) = Int(Rnd() * 1000) + 100
'lngX(1, 3) = Int(Rnd() * 1000) + 100
'.....
'lngX(2, 1) = Int(Rnd() * 1000) + 100
'lngX(2, 2) = Int(Rnd() * 1000) + 100
'lngX(2, 3) = Int(Rnd() * 1000) + 100
'.....

For iX = 1 To 3
    For iY = 1 To 8
        lngX(iX, iY) = Int(Rnd() * 1000) + 100
    Next
Next
Range("A5:H7") = lngX
End Sub



같은 정보를 같은 표현식에서 얻어지는 일정한 작업을 할때
배열은 아주 필연적으로 필요해지는것이다
그런데 엑셀에 능숙한 사람은 워크시트자체가 배열이기때문에
워크시트의 오브젝트를 순환작업하는것에 길들여져 있어서
배열의 중요성을 잘 모르게 된다
예를 들면 위와 같은 작업을 이렇게 할수도 있는것이다

Sub loopAroundCells()
Dim rAll As Range
Dim rRow As Range
Dim rCell As Range
'오브젝트타입변수는 아직 이해못해도 괞찮다
'전체범위를 rAll변수에 담고
Set rAll = Range("A5:H7")
'범위의 각각의 행을 순환한다(행방향)
For Each rRow In rAll.Rows
'각각의 행의 각각의 셀을 순환한다(열방향)
    For Each rCell In rRow.Cells
        rCell = Int(Rnd() * 1000) + 100
    Next
Next
'행방향,열방향의 순환의 의미는 결국은 엑셀시트자체가
'2차배열 그자체임을 알수 있다
End Sub


Excel Worksheet Itself Is Array

배열변수의 선언에 있어서

변수의 선언은 아래와 같이
Dim strX(2) As String
이라고 선언하기도 하고
Dim strX(1 To 2) As String
이라고 할수도 있겠으나 주의 할점이 있다
모듈시트상의 프로시져의 외부 선언부에
Option Base 1
이라고 특별히 선언을 하지 않는다면
Dim strX(2) As String

Dim strX(1 To 2) As String
의 의미는 틀리게 된다
Dim strX(2)

strX(0)

strX(1)
로 접근하고
Dim strX(1 To 2)
는 strX(1)과 strX(2)로 접근하는것이다
다시 말해서
Option Base 1
이라고 선언을 하지 않은 상태에서는
항상 배열은 0에서 부터 시작되는것이다
만약
Option Base 1
이라고 선언하지 않은 상태에서
Dim strX(2) As String
이라고 배열변수선언한후
strX(2)에 접근하려고 하면(값을 넣거나,읽거나 할때)
에러가 발생하는것이다
왜냐하면 strX(0),strX(1)두개의 배열요소가 존재하는것이지
strX(2)라는 배열요소는 존재하지 않으니까..당연히 에러가 나는것이다
Option Base 1
을 선언하지 않고 1에서 부터 시작하고 싶다면
Dim strX(1 To 2)
라고 하는것이 편리할것이다

동적배열/Dynamic Array

위에서 배열요소를 선언할때

Dim sX(1 To 5) As String

이라던가

Dim sX(5) As String

으로 할때는 이미 배열의 요소의 갯수를 지정한 상태이다
즉 이미 정해진 정적배열(Static Array)라고 할수 있다
그러나 실제에 있어서는 프로그래밍이 실행될때(Run Time) 배열의 요소의
갯수가 정해지는 경우가 많다
실행될때 배열의 갯수를 자유롭게 정해지도록 하는것이 동적배열이다

Sub Redim_Input_SeveralTimeWithPreserve()
'배열의 요소의 갯수를 정하지 않고 선언한다
Dim sX() As String
Dim sName As String
Dim iLimit As Integer, iX As Integer, sTemp As String
Range("A5").CurrentRegion.ClearContents
Do
    sName = InputBox("회원이름을 입력하세요,중단은 취소버튼!!")
    If sName = "" Then Exit Do
'배열요소의 갯수를 확장시킨다
'Preserve키워드는 이전에 입력한 정보를 지우지 말고
'그대로 유지시키라는 명령이다
     ReDim Preserve sX(iLimit)
    sX(iLimit) = sName
'다음 배열요소의 확장을 위하여 1씩 추가한다
    iLimit = iLimit + 1
Loop
If iLimit = 0 Then
    MsgBox "입력하신 회원명단은 한명도 없습니다"
Else
    MsgBox "입력하신 회원명단은 " & iLimit &  _
" 명이고 시트에 기록됩니다"
'워크시트에 한꺼번에 옮긴다 Range(Range("A5"), Range("A5").Offset(iLimit - 1, 0)) = _
Application.Transpose(sX) End If End Sub




Redim 명령(Re-Demension)이 배열의 요소의 갯수를 지정하지 않은것을
다시 지정하겠다는 명령이 되는것이고
갯수는 프로시져가 실행중 iLimit변수에 InputBox함수를 통하여
사용자로 부터 받게 되는것이고
iLimit변수의 크기만큼 배열의 크기를 정하는것이다
10명을 연속입력하던 100명을 입력하던 융통성있게 배열의 크기를 변화시키는것이다
그래서 동적배열인것이다