테이블 변환은 기초방 처음부터 많이 풀어봤던 문제이다.
복습의미로 풀어보았다.
더보기
Option Explicit ' 변수 선언을 강제하여 오류를 예방함
Sub 기초방93()
' 변수 선언: 데이터 범위와 개별 셀을 위한 변수
Dim rngAll As Range, rngA As Range
' C5:I15 범위를 rngAll에 설정 (데이터가 포함된 범위)
Set rngAll = [C5:I15]
' P5:R100 범위의 내용을 초기화 (이전 데이터 삭제)
[P5:R100].ClearContents
' C5:I15 범위의 각 셀을 순회하며 처리
For Each rngA In rngAll
' P열의 마지막 행에 해당 학생의 이름(B열 값) 입력
Cells(Rows.Count, "P").End(3)(2) = Cells(rngA.Row, "B")
' Q열의 마지막 행에 해당 과목명(4행의 값) 입력
Cells(Rows.Count, "Q").End(3)(2) = Cells(4, rngA.Column)
' R열의 마지막 행에 해당 점수(현재 셀의 값) 입력
Cells(Rows.Count, "R").End(3)(2) = rngA(1, 1)
' 다음 셀로 이동하여 반복
Next rngA
End Sub
- 반복문을 통한 데이터 처리
- For Each rngA In rngAll 구문을 사용해 C5범위의 각 셀을 순회하며 처리한다.
- P열: 해당 셀의 행에 있는 B열의 학생 이름을 추가한다.
- Q열: 해당 셀의 4행에 있는 과목명을 추가한다.
- R열: 해당 셀의 점수를 추가한다.
- For Each rngA In rngAll 구문을 사용해 C5범위의 각 셀을 순회하며 처리한다.
- Next rngA
- 각 셀을 처리한 뒤 다음 셀로 이동하며 반복을 계속한다.
실행 예시
- 원본 데이터 (C5:I15):
B열C열 (국어)D열 (영어)E열 (수학)F열 (과학)
4행 | 국어 | 영어 | 수학 | 과학 | |
5행 | 홍길동 | 90 | 85 | 80 | 70 |
6행 | 김철수 | 75 | 80 | 85 | 90 |
- 결과 데이터 (P5:R100):
P열 (학생 이름)Q열 (과목명)R열 (점수)
홍길동 | 국어 | 90 |
홍길동 | 영어 | 85 |
홍길동 | 수학 | 80 |
홍길동 | 과학 | 70 |
김철수 | 국어 | 75 |
김철수 | 영어 | 80 |
김철수 | 수학 | 85 |
김철수 | 과학 | 90 |
코드 동작 요약
- C5범위의 학생 점수를 순회하며, P열에 학생 이름, Q열에 과목명, R열에 점수를 입력한다.
- 마지막 행에 데이터를 추가해 기존 데이터가 삭제되지 않도록 한다.
엑셀 365에서 LET 함수와 관련 함수 설명
엑셀 365에는 **LET 함수**와 함께 여러 강력한 동적 배열 함수가 도입되어 복잡한 계산을 더 쉽게 처리할 수 있다. 이 포스팅에서는 LET 함수와 함께 사용된 SEQUENCE, INDEX, MOD, HSTACK 함수들을 소개하고, 예제 코드가 어떻게 작동하는지 설명한다.
1. LET 함수란?
LET 함수는 변수를 정의하여 동일한 계산을 반복적으로 사용하지 않고 효율적으로 작업할 수 있게 도와주는 함수다. 이로 인해 계산 속도가 빨라지고, 복잡한 수식을 단순화할 수 있다.
LET 함수 문법
=LET(변수1, 값1, 변수2, 값2, ... , 계산식)
- 변수: LET 함수 내에서 사용할 변수를 정의한다.
- 값: 각 변수에 할당할 값을 지정한다.
- 계산식: 마지막에 이 함수에서 계산할 최종 결과를 반환한다.
2. 코드에 사용된 함수 설명
SEQUENCE 함수
SEQUENCE 함수는 연속된 숫자 배열을 생성한다.
문법
excel
코드 복사
SEQUENCE(행 수, 열 수, 시작 값, 증가 단위)
SEQUENCE(행 수, 열 수, 시작 값, 증가 단위)
- 행 수: 생성할 행의 개수.
- 열 수: 생성할 열의 개수.
- 시작 값: 배열의 시작 숫자.
- 증가 단위: 각 값 사이의 증가 폭.
예시
excel
코드 복사
=SEQUENCE(3, 2, 1, 1)
=SEQUENCE(3, 2, 1, 1)
출력 결과:
코드 복사
1 2 3 4 5 6
1 2
3 4
5 6
INDEX 함수
INDEX 함수는 배열 또는 범위에서 특정 위치의 값을 반환한다.
문법
INDEX(배열, 행 번호, [열 번호])
- 배열: 값을 가져올 데이터 범위.
- 행 번호: 값을 가져올 행 번호.
- 열 번호: 값을 가져올 열 번호 (선택적).
예시
=INDEX(A1:C3, 2, 1)
출력 결과: A2 셀의 값
MOD 함수
MOD 함수는 나눗셈의 나머지를 반환한다. 주로 순환되는 패턴을 처리할 때 유용하다.
문법
MOD(숫자, 나눌 값)
예시
=MOD(7, 3)
출력 결과: 1 (7을 3으로 나눈 나머지)
HSTACK 함수
HSTACK 함수는 여러 배열을 가로 방향으로 쌓아 새로운 배열을 생성한다.
문법
HSTACK(배열1, 배열2, ...)
- 각 배열을 가로로 연결하여 하나의 큰 배열을 만든다.
예시
=HSTACK({1, 2}, {3, 4})
출력 결과:
1 2 3 4
3. LET 함수 예제 코드 분석
=LET(
→학생, "B5:B15 범위에서 각 학생의 이름을 가져옴. / INT 함수를 사용해 과목 수만큼 학생이 반복되도록 정수 인덱스를 계산함.",
학생, INDEX(B5:B15, INT(SEQUENCE(ROWS(B5:B15) * COLUMNS(C5:I15), 1, 0) / COLUMNS(C5:I15)) + 1),
→과목, "C4:I4 범위에서 과목을 순환하며 가져오는 변수. MOD 함수를 사용해 과목이 학생별로 반복되도록 만듦.",
과목, INDEX(C4:I4, MOD(SEQUENCE(ROWS(B5:B15) * COLUMNS(C5:I15), 1, 0), COLUMNS(C5:I15)) + 1),
→점수, "C5:I15 범위에서 학생과 과목에 해당하는 점수를 가져오는 변수. 학생과 과목 인덱스를 계산해 올바른 점수를 참조함.",
점수, INDEX(
C5:I15,
INT(SEQUENCE(ROWS(B5:B15) * COLUMNS(C5:I15), 1, 0) / COLUMNS(C5:I15)) + 1,
MOD(SEQUENCE(ROWS(B5:B15) * COLUMNS(C5:I15), 1, 0), COLUMNS(C5:I15)) + 1
),
→HSTACK, "학생, 과목, 점수를 가로로 쌓아 하나의 테이블로 출력하는 함수.",
HSTACK(학생, 과목, 점수)
)
코드 동작 설명
- 학생 변수 정의
- B5:B15 범위에서 학생 이름을 가져온다.
- SEQUENCE와 INT 함수를 사용해 과목 수에 맞춰 각 학생 이름이 반복되도록 한다.
- 과목 변수 정의
- C4:I4 범위에서 과목명을 가져온다.
- MOD 함수를 사용해 각 학생에 대해 과목이 순환되도록 한다.
- 점수 변수 정의
- C5:I15 범위에서 학생과 과목의 점수를 가져온다.
- 행과 열 인덱스를 SEQUENCE와 MOD 함수를 사용해 계산한다.
- HSTACK 함수 사용
- HSTACK 함수를 사용해 학생, 과목, 점수를 가로로 배열하여 테이블 형식으로 출력한다.
예상 출력 예시
학생과목점수
홍길동 | 국어 | 90 |
홍길동 | 영어 | 85 |
홍길동 | 수학 | 80 |
홍길동 | 과학 | 70 |
김철수 | 국어 | 75 |
김철수 | 영어 | 80 |
김철수 | 수학 | 85 |
김철수 | 과학 | 90 |
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #95 [열을 역순으로 복사] (0) | 2024.10.25 |
---|---|
[기초방] VBA 100제 #94 [ ADODB 데이터조회 ] (6) | 2024.10.20 |
[기초방] VBA 100제 #92 [ 엑셀 데이터 병합 자동화 ] (4) | 2024.10.18 |
[기초방] VBA 100제 #91 [ 표에서 다중검색하기 ] (1) | 2024.01.07 |
[기초방] VBA 100제 #90 [ 부분합 구하기 ] (2) | 2023.11.01 |
댓글