Range 개체

데이터 범위를 일정 행과 열로 나누기

노만e 2025. 4. 9. 22:06

 

 

🧩 데이터 범위를 일정 행과 열로 나누기

  • 실무에서 데이터 범위를 출력양식에 맞추어 일정한 행과 열로 분할 정리하는 경우가 많습니다.  그럴때 유용하게 사용할 수 있는 코드 입니다.

예) 출고/입고 데이터, 생산실적, 판매기록 등, 20행 x 3열

Sub CopyData_ByUserColumnSplit()
    Dim ws As Worksheet
    Dim dataRange As Range
    Dim headerRange As Range
    Dim chunkSize As Long
    Dim splitColumnCount As Long
    Dim actualDataColumnCount As Long
    Dim destStartCell As Range
    Dim destCols() As Long
    Dim destRows() As Long
    Dim currentRow As Long
    Dim totalDataRows As Long
    Dim colIndex As Long
    Dim copyRange As Range
    Dim i As Long

    Set ws = ActiveSheet ' 활성화된 워크시트를 사용

    ' ===== ① 데이터 범위 선택 =====
    On Error Resume Next
    Set dataRange = Application.InputBox("① 데이터 범위를 마우스로 선택하세요 (헤더 포함)", "데이터 선택", Type:=8)
    On Error GoTo 0
    If dataRange Is Nothing Then
        MsgBox "데이터 범위가 선택되지 않았습니다.", vbExclamation
        Exit Sub
    End If

    ' 데이터의 실제 열 수 파악 (예: A~C면 3)
    actualDataColumnCount = dataRange.Columns.Count

    ' ===== ② 덩어리 크기 입력 =====
    chunkSize = CLng(InputBox("② 몇 행씩 끊어서 붙여넣을까요? (예: 20)", "덩어리 크기"))
    If Not IsNumeric(chunkSize) Then
        MsgBox "숫자를 입력하세요.", vbExclamation
        Exit Sub
    End If

    ' ===== ③ 몇 열로 나눌지 입력 =====
    splitColumnCount = CLng(InputBox("③ 데이터를 몇 열로 나누어 붙여넣을까요? (예: 3)", "열 수"))
    If splitColumnCount < 1 Then
        MsgBox "1 이상의 값을 입력해주세요.", vbExclamation
        Exit Sub
    End If

    ' ===== ④ 시작 셀 선택 =====
    Set destStartCell = Application.InputBox("④ 붙여넣기를 시작할 셀을 마우스로 클릭하세요", "시작 셀", Type:=8)
    If destStartCell Is Nothing Then
        MsgBox "시작 셀이 선택되지 않았습니다.", vbExclamation
        Exit Sub
    End If

    ' ===== 열과 행 위치 배열 설정 =====
    ReDim destCols(1 To splitColumnCount) ' 각 열의 시작 열 주소 저장
    ReDim destRows(1 To splitColumnCount) ' 각 열의 현재 행 위치 저장

    For i = 1 To splitColumnCount
        destCols(i) = destStartCell.Column + (i - 1) * actualDataColumnCount ' 열 간격은 데이터 열 수만큼 띄움
        destRows(i) = destStartCell.Row ' 처음 시작 행 위치 설정 (헤더 포함)
    Next i

    ' 헤더 범위 저장
    Set headerRange = dataRange.Rows(1)
    totalDataRows = dataRange.Rows.Count
    currentRow = 2 ' 실제 데이터는 두 번째 줄부터 시작 (헤더 제외)

    ' ===== 복사 반복 루프 =====
    Do While currentRow <= totalDataRows
        For colIndex = 1 To splitColumnCount
            If currentRow > totalDataRows Then Exit Do

            Dim chunkEndRow As Long
            chunkEndRow = WorksheetFunction.Min(currentRow + chunkSize - 1, totalDataRows)

            ' 헤더 붙여넣기
            headerRange.Copy Destination:=ws.Cells(destRows(colIndex), destCols(colIndex))
            destRows(colIndex) = destRows(colIndex) + 1 ' 데이터 붙이기 전 한 줄 내림

            ' 데이터 덩어리 복사
            Set copyRange = dataRange.Range("A" & currentRow).Resize(chunkEndRow - currentRow + 1, actualDataColumnCount)
            copyRange.Copy Destination:=ws.Cells(destRows(colIndex), destCols(colIndex))

            ' 다음 데이터가 들어갈 행 위치 설정
            destRows(colIndex) = destRows(colIndex) + chunkSize
            currentRow = currentRow + chunkSize ' 다음 덩어리 시작 위치로 이동
        Next colIndex
    Loop

    ' 결과 메시지 출력
    MsgBox totalDataRows - 1 & " 데이터를 " & splitColumnCount & "개의 열에 나누어 복사했습니다!", vbInformation
End Sub

 

 

데이터_행열_나누기.xlsm
0.02MB