본문 바로가기
VBA/엑사남_기초방

[기초방] VBA 100제 #93 [ 엑셀 테이블 변환 ]

by 일등미노왕국 2024. 10. 20.

테이블 변환은 기초방 처음부터 많이 풀어봤던 문제이다. 

복습의미로 풀어보았다.

더보기
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

 

 

  1. 반복문을 통한 데이터 처리
    • For Each rngA In rngAll 구문을 사용해 C5범위의 각 셀을 순회하며 처리한다.
      1. P열: 해당 셀의 행에 있는 B열의 학생 이름을 추가한다.
      2. Q열: 해당 셀의 4행에 있는 과목명을 추가한다.
      3. R열: 해당 셀의 점수를 추가한다.
  2. 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(학생, 과목, 점수)
)

코드 동작 설명

  1. 학생 변수 정의
    • B5:B15 범위에서 학생 이름을 가져온다.
    • SEQUENCE와 INT 함수를 사용해 과목 수에 맞춰 각 학생 이름이 반복되도록 한다.
  2. 과목 변수 정의
    • C4:I4 범위에서 과목명을 가져온다.
    • MOD 함수를 사용해 각 학생에 대해 과목이 순환되도록 한다.
  3. 점수 변수 정의
    • C5:I15 범위에서 학생과 과목의 점수를 가져온다.
    • 행과 열 인덱스를 SEQUENCE와 MOD 함수를 사용해 계산한다.
  4. HSTACK 함수 사용
    • HSTACK 함수를 사용해 학생, 과목, 점수를 가로로 배열하여 테이블 형식으로 출력한다.

예상 출력 예시

학생과목점수

홍길동 국어 90
홍길동 영어 85
홍길동 수학 80
홍길동 과학 70
김철수 국어 75
김철수 영어 80
김철수 수학 85
김철수 과학 90

 

기초방93.xlsm
0.02MB

댓글