티스토리 뷰

반응형

0. 개요

학년반이 뒤섞여 있는 엑셀파일에서 개인 사정에 의해서 반별로 분리해야할 필요가 생겼다.
검색을 해도 되겠지만, 향후 활용성을 대비해서 시간이 걸리더라도 chatgpt를 이용하기로 하였다.
결과는 아래와 같다.

1. 작성 프롬프트

가. 주제 : 반별로 데이터 분리하기

나. chatgpt 프롬프트

당신은 엑셀 전문가 입니다.
시트에 여러반의 데이터가 섞여 있습니다.
각 반별로 모아서 새로운 시트에 저장하고 싶습니다.
아래의 내용을 참고해서 VBA코드를 작성하세요.
엑셀파일의 첫번째 시트 정보는 다음과 같습니다.

1. 시트이름 : sheet
2. 시트 정보
    A열 : 학년
    B열 : 반
    C열 : 번호
    D열 : 성명
    E열 : 비고
3. 작업내용
- sheet의 내용은 유지하기
- B열의 반의 숫자만큼 새로운 시트를 각각 만들어서 분할하기
- 새로운 시트이름은 '{숫자}반' 형식으로 작성하기

2. 결과 코드

코드에서 에러가 발생했다. 변수 타입에 대한 에러였고, 엑셀에서 알려준대로 수정하였더니 정상 작동하였다.

에러 구문 : Dim className As String
수정 구문 : Dim className As Variant

가. chatgpt 작성 코드

Sub SplitDataByClass()
    Dim wsSource As Worksheet
    Dim wsNew As Worksheet
    Dim lastRow As Long
    Dim uniqueClasses As Collection
    Dim classCell As Range
    Dim className As String

    ' 원본 시트 설정
    Set wsSource = ThisWorkbook.Sheets("sheet")

    ' 중복되지 않는 반의 목록을 저장할 Collection 생성
    Set uniqueClasses = New Collection

    ' 원본 시트의 마지막 행을 가져오기
    lastRow = wsSource.Cells(wsSource.Rows.Count, "B").End(xlUp).Row

    ' 중복되지 않는 반 목록 수집
    On Error Resume Next
    For Each classCell In wsSource.Range("B2:B" & lastRow)
        uniqueClasses.Add classCell.Value, CStr(classCell.Value)
    Next classCell
    On Error GoTo 0

    ' 각 반별로 새로운 시트 생성
    For Each className In uniqueClasses
        ' 새로운 시트 생성
        Set wsNew = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))

        ' 새로운 시트 이름 설정
        wsNew.Name = className & "반"

        ' 원본 데이터 필터링 및 복사
        wsSource.Rows(1).AutoFilter Field:=2, Criteria1:=className
        wsSource.UsedRange.SpecialCells(xlCellTypeVisible).Copy Destination:=wsNew.Range("A1")

        ' 필터 해제
        wsSource.AutoFilterMode = False
    Next className

    ' 메시지 표시
    MsgBox "데이터가 반별로 분할되었습니다.", vbInformation
End Sub

나. 수정코드

Sub SplitDataByClass()
    Dim wsSource As Worksheet
    Dim wsNew As Worksheet
    Dim lastRow As Long
    Dim uniqueClasses As Collection
    Dim classCell As Range
    Dim className As Variant

    ' 원본 시트 설정
    Set wsSource = ThisWorkbook.Sheets("sheet")

    ' 중복되지 않는 반의 목록을 저장할 Collection 생성
    Set uniqueClasses = New Collection

    ' 원본 시트의 마지막 행을 가져오기
    lastRow = wsSource.Cells(wsSource.Rows.Count, "B").End(xlUp).Row

    ' 중복되지 않는 반 목록 수집
    On Error Resume Next
    For Each classCell In wsSource.Range("B2:B" & lastRow)
        uniqueClasses.Add classCell.Value, CStr(classCell.Value)
    Next classCell
    On Error GoTo 0

    ' 각 반별로 새로운 시트 생성
    For Each className In uniqueClasses
        ' 새로운 시트 생성
        Set wsNew = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))

        ' 새로운 시트 이름 설정
        wsNew.Name = className & "반"

        ' 원본 데이터 필터링 및 복사
        wsSource.Rows(1).AutoFilter Field:=2, Criteria1:=className
        wsSource.UsedRange.SpecialCells(xlCellTypeVisible).Copy Destination:=wsNew.Range("A1")

        ' 필터 해제
        wsSource.AutoFilterMode = False
    Next className

    ' 메시지 표시
    MsgBox "데이터가 반별로 분할되었습니다.", vbInformation
End Sub

반응형