엑셀 배열을 범위로 변환 :: ArrayToRng 명령문 사용법 총정리
엑셀 ArrayToRng 명령문 목차 바로가기
요약
엑셀 ArrayToRng 함수는 배열 전체 또는 열 번호를 지정하여 시트 위 범위로 출력하는 함수입니다. 배열의 특정 열 번호를 지정하여 범위로 출력할 수 있습니다.
명령문 구문
ArrayToRng 시작셀, 배열, [열번호], [하이퍼링크열번호]
패치안내
- 2022.05.01
: 하이퍼링크로 연결할 열 번호 인수를 추가하였습니다.
사용된 인수 및 변수 알아보기
인수 | 설명 |
시작셀 [Range] |
배열을 출력할 범위의 시작셀입니다. |
배열 [Variant] |
반환할 배열입니다. |
열번호 [String, 선택인수] |
배열의 특정 열 번호를 쉼표로 구분하여 입력합니다. 열 번호로 공란을 입력할 수도 있습니다. |
하이퍼링크열번호 [String, 선택인수] |
하이퍼링크로 연결 할 열 번호를 쉼표로 구분하여 입력합니다. |
예제파일 다운로드
- [엑셀VBA함수] ArrayToRng 명령문예제파일
상세 설명
엑셀 ArrayToRng 함수는 배열 전체 또는 열 번호를 지정하여 범위로 출력하는 사용자 지정함수입니다. 최대 2차원 배열까지 사용가능합니다. (시트는 2차원이므로 3차원 이상의 배열은 표시할 수 없습니다.)
본 명령문에는 Extract_Column 보조함수가 사용됩니다.
모든 배열을 한번에 출력하거나 배열의 특정 열 번호를 지정하여 범위로 출력할 수도 있습니다.
ArrayToRng Sheet1.Range("A1"), 배열을 입력하면 Sheet1의 A1셀을 기준으로 배열이 출력됩니다.
ArrayToRng Sheet1.Range("A1"), 배열, "3,5,6"을 입력하면 Sheet1의 A1셀을 기준으로 배열의 3번째, 5번째, 6번째 열이 출력됩니다.
실전 사용 예제
배열 예제 ( 7 x 7 배열)
가 a ㄱ 1 갸 구 기 나 b ㄴ 2 냐 누 니 다 c ㄷ 3 댜 두 디 라 d ㄹ 4 랴 루 리 마 e ㅁ 5 먀 무 미 바 f ㅂ 6 뱌 부 비 사 g ㅅ 7 샤 수 시 - 배열의 모든 값을 A1셀 위로 출력하기
ArrayToRng Range("A1"), 배열
- 배열의 두번째, 네번째 열만 A1셀 위로 출력하기
ArrayToRng Range("A1"), 배열, "2,4"
- 배열의 모든 열 중간에 공백을 추가하여 A1셀 위로 출력하기
ArrayToRng Range("A1"), 배열, "1,,2,,3,,4,,5,,6,,7"
엑셀 배열을 범위로 변환, ArrayToRng 명령문 동작원리
ArrayToRng 명령문 전체 코드
Sub ArrayToRng(startRng As Range, Arr As Variant, Optional ColumnNo As String = "", Optional LinkColumnNo As String = "") '############################################################### '오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com) '▶ ArrayToRng 함수 '▶ 배열을 범위 위로 반환합니다. '▶ 인수 설명 '_____________startRng : 배열을 반환할 기준 범위(셀) 입니다. '_____________Arr : 반환할 배열입니다. '_____________ColumnNo : [선택인수] 배열의 특정 열을 선택하여 범위로 반환합니다. 여러개 열을 반환할 경우 열 번호를 쉼표로 구분하여 입력합니다. ' 값으로 공란을 입력하면 열을 건너뜁니다. '_____________LinkColumNo : [선택인수] 하이퍼링크로 출력할 열 번호입니다. 쉼표로 구분하여 입력합니다. '▶ 사용 예제 'Dim v As Variant 'ReDim v(0 to 1) ''v(0) = "a" : v(1) = "b" 'ArrayToRng Sheet1.Range("A1"), v '▶ 사용된 보조 명령문 'Extract_Column 함수 '############################################################## On Error GoTo SingleDimension: Dim Cols As Variant: Dim Col As Variant Dim LinkCols As Variant: Dim LinkCol As Variant Dim i As Long: Dim X As Long: X = 1 Dim colNo As Long If ColumnNo = "" Then startRng.Cells(1, 1).Resize(UBound(Arr, 1) - LBound(Arr, 1) + 1, UBound(Arr, 2) - LBound(Arr, 2) + 1) = Arr If LinkColumnNo <> "" Then LinkCols = Split(LinkColumnNo, ",") For Each LinkCol In LinkCols For i = 1 To UBound(Arr, 1) - LBound(Arr, 1) + 1 colNo = CLng(Trim(LinkCol)) startRng.Parent.Hyperlinks.Add startRng.Cells(i, colNo), startRng.Cells(i, colNo).Value Next Next End If Else Cols = Split(ColumnNo, ",") LinkCols = Split(LinkColumnNo, ",") For Each Col In Cols If Trim(Col) <> "" Then startRng.Cells(1, X).Resize(UBound(Arr, 1) - LBound(Arr, 1) + 1) = Extract_Column(Arr, CLng(Trim(Col))) For Each LinkCol In LinkCols If Trim(LinkCol) = Trim(Col) Then For i = 1 To UBound(Arr, 1) - LBound(Arr, 1) + 1 startRng.Parent.Hyperlinks.Add startRng.Cells(i, X), startRng.Cells(i, X).Value Next End If Next End If X = X + 1 Next End If Exit Sub SingleDimension: Dim tempArr As Variant ReDim tempArr(LBound(Arr, 1) To UBound(Arr, 1), 1 To 1) For i = LBound(Arr, 1) To UBound(Arr, 1) tempArr(i, 1) = Arr(i) Next startRng.Cells(1, 1).Resize(UBound(Arr, 1) - LBound(Arr, 1) + 1, 1) = tempArr End Sub '######################## ' 배열에서 특정 열 데이터만 추출합니다. ' Array = Extract_Column(Array, 1) '######################## Function Extract_Column(DB As Variant, Col As Long) As Variant Dim i As Long Dim vArr As Variant ReDim vArr(LBound(DB) To UBound(DB), 1 To 1) For i = LBound(DB) To UBound(DB) vArr(i, 1) = DB(i, Col) Next Extract_Column = vArr End Function
명령문 동작원리 단계별 알아보기
- 배열 처리 중 오류가 발생하면 1차원 배열인 상황이므로 SingleDimension 레이블로 이동합니다.
On Error GoTo SingleDimension:
- 변수를 선언합니다.
Dim Cols As Variant: Dim Col As Variant Dim X As Long: X = 1
- ColumnNo 인수가 비어있을 경우, 전체 배열을 범위 위로 출력합니다.
If ColumnNo = "" Then startRng.Cells(1, 1).Resize(UBound(Arr, 1) - LBound(Arr, 1) + 1, UBound(Arr, 2) - LBound(Arr, 2) + 1) = Arr
- ColumnNo 인수가 비어있지 않을 경우, 각 ColumnNo를 하나씩 돌아가며 배열의 특정 열 값을 범위로 출력합니다.
Else Cols = Split(ColumnNo, ",") For Each Col In Cols If Trim(Col) <> "" Then startRng.Cells(1, X).Resize(UBound(Arr, 1) - LBound(Arr, 1) + 1) = Extract_Column(Arr, CLng(Trim(Col))) End If X = X + 1 Next End If
- 1차원 배열일 경우, 시트 위 범위 (2차원) 으로 출력하기 위하여 임시배열로 변환해야 합니다.
Dim tempArr As Variant: Dim i As Long ReDim tempArr(LBound(Arr, 1) To UBound(Arr, 1), 1 To 1) For i = LBound(Arr, 1) To UBound(Arr, 1) tempArr(i, 1) = Arr(i) Next
- 변환된 임시 배열을 시트 위로 출력하고 명령문을 종료합니다.
startRng.Cells(1, 1).Resize(UBound(Arr, 1) - LBound(Arr, 1) + 1, 1) = tempArr
- 배열의 모든 값을 A1셀 위로 출력하기