전 국민 코딩 시대 엑셀 VBA 기초 8 - 배열(동적 배열, Redim)

Описание к видео 전 국민 코딩 시대 엑셀 VBA 기초 8 - 배열(동적 배열, Redim)

전 국민 코딩 시대 엑셀 VBA 기초 8 - 배열(동적 배열, Redim)

"전 국민 코딩 시대 엑셀 VBA 기초 8 - 배열(동적 배열, Redim)"에 대해 알아보겠습니다.

배열은 "정적 배열"과 "동적 배열"로 구분되는데, 정적 배열은 "Dim A(10) As Integer"과 같이 배열 선언 시 배열의 크기를 정하여 사용하는 방식이고 "동적 배열은 반대로 배열 선언 시 "Dim A() As Integer"와 같이 배열의 크기를 정해 놓지 않고 나중에 "Redim"으로 배열을 크기를 변경하는 방식입니다.

배열의 개념을 이해하기 위해서는 정적 배열이 유리하지만, 실제 프로그래밍에 있어서는 동적 배열이 많이 사용됩니다.

1. 배열(Array) 선언 방법
가. 인덱스 표시
"Dim MyArray(0 To 10) As Integer "과같이 인덱스를 지정하여 0부터 10까지라고 지정하여 11개의 기억 장소를 할당하는 방식입니다.

나. 기억 공간 표기
"Dim A(10) As Integer "과같이 시작 인덱스를 지정해도 0부터 10까지 11개의 기억 장소가 할당됩니다.

결론은 "Dim A(0 To 10) As Integer " 과 "Dim A(10) As Integer "는 같은 의미가 되지만, 나중에 실전에 들어가면 "Dim A(0 To 10) As Integer" 인덱스 표기 방식도 많이 사용하며, 본문은 "기억 공간 표기"방법으로 진행합니다.

작성된 시트의 마지막 Row(행) 구하기

어느 유통 회사의 판매원 명부에서
판매원 명부는 고정적이지 않기 때문에 엑셀 시트에 5명의 데이터가 있지만,

시간이 지나면 이 데이터의 수는 당연히 늘어날 겁니다.

프로그래머는 프로그래밍을 할 때 예상되는 상황에 대한 대처를 해 놓아야 합니다.

만약 위와 같은 판매원 명부의 판매원 수를 최대 100명으로 예상하여 프로그래밍을 하였다가 100명을 초과하는 상황이 발생할 수 있기 때문입니다.

뭐~일부러 골탕 먹이려고 그러지 않는 한 이런 일이 발생하지 않게 하는 것이 프로그래머의 기본자세겠죠.

그래서 프로그래머는 항상 동적인 개념으로 프로그래밍을 합니다.

Sheet 3에 5명의 데이터가 있을 때,

"This_Sheet.Range("A2:I6").Clear"을 실행하면 5명에 해당하는 데이터가 지워집니다.

그런데 Sheet 3에 10명의 데이터가 있을 때, "This_Sheet.Range("A2:I6").Clear"을 실행하면

("A2:I6") 5명에 해당하는 데이터만 지워지고 나머지 5명의 데이터는 지워지지 않습니다.

이런 경우는 원하는 결과가 아니겠죠.

그럼 전체 인원이 몇 명인지도 모르는데 어떻게 하라는 건가?

"This_Sheet.Range("A2:I6").Clear"에서 ("A2:I10000")으로 해볼까?

이렇게 하면 당장은 "I10000"가지는 해결이 됩니다.
그러나 "I10000"이하인 경우 쓸데없는 작업을 하는 거고, 또 "I10000"을 초과하는 경우는 어떻게 할건가?

엑셀 시트에서 [Ctrl] 키를 클릭하고 있는 상태에서 아래 화살표 키를 클릭하면, 마지막 Row(행)로 커서가 이동됩니다.

엑셀 시트의 최대 Row(행) 값은 1,048,576이 되겠네요.
"I1048576"로 지정해야 할까요?

VBA에는 시트의 셀 기준 마지막 Row(행) 구하는 기능이 있습니다.

시트의 셀값 기준 마지막 Row(행)을 구하는 방법은 "Cells(Rows.Count, "A").End(xlUp).Row"으로 해결됩니다.

"This_Row = This_Sheet.Cells(Rows.Count, "A").End(xlUp).Row"에서 "This_Sheet"의 "A"열 기준 시트의 마지막 내용이 입력된 Row(행) 값을 반환합니다.

"This_Row"는 This_Sheet의 A 열의 마지막 Row(행) 값을 갖게 되므로, "This_Sheet.Range("A2" & ":" & "I" & This_Row).Clear"에 의해 This_Sheet의 A열 2행부터 I 열 "ThisRow"범위의 내용을 지웁니다.

Dim This_Sheet As Worksheet
Dim This_Row As Long
' This_Sheet Sheet3 설정
Set This_Sheet = Sheet3
This_Row = This_Sheet.Cells(Rows.Count, "A").End(xlUp).Row

This_Sheet.Range("A2" & ":" & "I" & This_Row).Clear
Debug.Print "Row="; This_Row

동적 배열

이전에 정적 배열에 대해 알아보았는데요.

정적 배열은 아예 배열의 크기를 정해놓고 하는 방식이었죠.
그런데, 실제 프로그래밍에 있어서는 가변의 상황이 많이 발생하기 때문에 동적 배열을 사용해야 한다고 언급했었습니다.

배열 처리에 있어서 가장 먼저 문제가 되는 것은 배열 변수의 Type입니다.
"Dim A(5, 10) As Integer"라고 하였을 때 5행 10열의 배열이 정수형으로 "A(5, 10)"으로 기억 공간이 할당되기 때문에 "숫자, 문자, 날짜"등이 혼합되어 있을 때는 이렇게 Type을 고정으로 사용할 수 없습니다.

이와 같이 배열에 "숫자, 문자, 날짜"등이 혼합되어 있는 배열은 Variant로 선언합니다.

Variant 변수는 정수, 실수, 문자열, 날짜 등 다양한 유형의 데이터를 저장할 수 있습니다.

Variant 변수를 사용할 때 명확한 데이터 유형을 지정하지 않아도 되기 때문에 편리하지만, Variant를 지나치게 사용하면 코드의 성능이 저하될 수 있다는 점 참고 바랍니다.

Sheet1을 읽어서 직접 실행 창에 출력하기.

1. Dim A_Arr() As Variant
"Dim A_Arr() As Variant"에 의해 배열 변수 "A_Arr"는 Variant Type의 동적 변수로 선언되었습니다.

2. This_Row = This_Sheet.Cells(Rows.Count, "A").End(xlUp).Row
"This_Row = This_Sheet.Cells(Rows.Count, "A").End(xlUp).Row"에 의해 Sheet1의 Row(행)의 수가 변수 "This_Row"에 할당 되었습니다.

3. ReDim A_Arr(1 To This_Row, 1 To 9)
"ReDim A_Arr(1 To This_Row, 1 To 9)"으로 배열 변수 "A_Arr"의 배열을 재 선언합니다.

"This_Row"값은 6이 할당되고, 열의 크기는 "1 To 9"이므로 "Dim A_Arr(7, 9)"로 배열 변수를 선언 한 것과 같은 결과가 됩니다.

Sheet2에 있는 10명의 데이터를 출력 할 수 있게 이 부분은 직접 해 보시기 바랍니다.

Sheet1 복사

이번에는 Sheet1의 내용을 배열에 저장 후 Sheet3으로 복사하는 방법을 알아 보겠습니다.

Sheet1은 This_Sheet로 설정 되어 있으니, Sheet3을 To_Sheet라는 개체 변수로 선언 합니다.

그리고, 배열에 This_Sheet1(Sheet1)의 값을 Insert하였던것을 반대로
To_Sheet(Sheet3)에 배열변수 값을 할당 하면 To_Sheet(Sheet3)로 복사 완료 입니다.

그런데, This_Sheet1(Sheet1)의 각 셀은 테두리선이 있는데,
To_Sheet(Sheet3)로 복사한 셀에는 테두리선이 없네요?

엑셀 셀 테두리 선

엑셀 VBA 코드로 엑셀 시트에 테두리 선 그리기와 테두리 색상 설정하는 방법에 대해 알아보겠습니다.

1. Borders.LineStyle
선의 종류는 Borders.LineStyle에서 설정합니다.
"Borders.LineStyle=0"은 무선(선 없음), "Borders.LineStyle=1" 실선, "Borders.LineStyle=2"는 점선이 되겠습니다.

2. 셀 정렬(Alignment)
가. 셀 가로 정렬(HorizontalAlignment)
"HorizontalAlignment"는 셀을 가로로 정렬하며, "HorizontalAlignment= xlLeft"는 좌측, "HorizontalAlignment= xlCenter"는 중앙, "HorizontalAlignment= xlRight"는 중앙으로 셀의 내용이 정렬됩니다.

나. 셀 세로 정렬(VerticalAlignment)
셀 세로 정렬은 "VerticalAlignment"으로 설정하며, 셀의 세로 상단 정렬은 "VerticalAlignment = xlTop", 셀의 세로 중앙 정렬은 "VerticalAlignment = xlCenter", 셀의 하단 정렬 "VerticalAlignment = xlBottom"으로 설정합니다.

따라서 아래의 코드를 보면 "Borders.LineStyle=0"이고, "VerticalAlignment = xlCenter"과 "HorizontalAlignment= xlCenter"으로 설정되어 결과는 무선(선 없음)에 셀의 내용은 중앙 정렬이 된 결과를 받게 됩니다.

엑셀 테두리 선은 아래의 코드에 의해 진행됩니다.
' To_Sheet.Range("A" & I).Resize(1, 9)"에서 "To_Sheet.Range("A" & I)" 위치에 "Resize(1, 9)"열에 " .Borders.LineStyle = 1"스타일의 테두리 선이 적용됩니다.
With To_Sheet.Range("A" & I).Resize(1, 9)
.Borders.LineStyle = 1
.HorizontalAlignment = xlCenter
End With

이상 "전 국민 코딩 시대 엑셀 VBA 기초 8 - 배열(동적 배열, Redim)"에 대해 알아보았습니다.
==============
참고 : 네이버 블로그 -
전 국민 코딩 시대 엑셀 VBA 기초 8 - 배열(동적 배열, Redim)
https://blog.naver.com/jxbjultd/22344...

Комментарии

Информация по комментариям в разработке