Sub CopyColumnsUsingArray()

    Dim wsSource As Worksheet ' 원본 시트
    Dim wsTarget As Worksheet ' 대상 시트
    Dim sourceData As Variant ' 원본 데이터를 담을 배열
    Dim targetData() As Variant ' 대상 데이터를 담을 배열
    Dim lastRow As Long       ' 데이터가 있는 마지막 행

    ' 시트 설정
    Set wsSource = ThisWorkbook.Sheets("Sheet2")
    Set wsTarget = ThisWorkbook.Sheets("Sheet1")

    ' 데이터가 있는 마지막 행 찾기 (A열 기준)
    lastRow = wsSource.Cells(Rows.Count, "A").End(xlUp).Row

    ' Sheet2의 A, Z, B, AV 열 데이터를 배열에 저장 (반드시 A열부터 순서대로)
    ' Range(Cells(1, "A"), Cells(lastRow, "A"))는 A열 전체를 의미
    ' Range(Cells(1, "Z"), Cells(lastRow, "Z"))는 Z열 전체를 의미
    ' A, Z, B, AV 순서로 데이터를 읽어 배열에 저장하기 위해 각각의 열을 읽고 하나의 배열에 합친다.
    sourceData = Application.WorksheetFunction.Transpose( _
        Union(wsSource.Range("A1:A" & lastRow), _
              wsSource.Range("Z1:Z" & lastRow), _
              wsSource.Range("B1:B" & lastRow), _
              wsSource.Range("AV1:AV" & lastRow)).Value _
    )

    ' 배열 크기 재설정 (원본 데이터의 총 행수와 동일하게)
    ReDim targetData(1 To lastRow, 1 To 4) ' 4개의 열을 위해 크기 4로 재설정

    ' 배열 데이터를 각 열에 맞게 재배치
    Dim r As Variant
    For r = 1 To lastRow
        targetData(r, 1) = sourceData(r, 1) ' A열 -> A열
        targetData(r, 2) = sourceData(r, 2) ' Z열 -> E열
        targetData(r, 3) = sourceData(r, 3) ' B열 -> C열
        targetData(r, 4) = sourceData(r, 4) ' AV열 -> D열
    Next r

    ' 대상 시트의 A, E, C, D 열에 배열 데이터 붙여넣기
    ' Sheet1의 A열부터 시작하여 A, E, C, D 열에 순서대로 붙여넣기
    wsTarget.Range("A1").Resize(lastRow, 4).Value = targetData

    ' 개체 해제
    Set wsSource = Nothing
    Set wsTarget = Nothing

End Sub

위는 [ 엑셀 sheet2의 a, z, b, av 열을 sheet1의 a, e, c, d 열로 복사하기를 배열로 처리 ] 하는 코드입니다. 배열로 해야 빠르다고 여기 선생님께서 알려주셨거든요. 그런데 vba상의 구문에러는 없이 컴파일은 되는데, 실행버튼을 만들어 누르면

'9' 런타임에러가 발생하였습니다. 아래 첨자 사용이 잘못되었습니다.

라는 에러가 나고 [ Debug ] 클릭하면

targetData(r, 1) = sourceData(r, 1) ' A열 -> A열      '<-- 이쪽으로 에러를 안내합니다.

 

질문 : 배열에 대해 위 에러를 인터넷에 찾아 검색해봤는데 첨자가 아니라  [범위초과: Subscript out of range ] 로 인한 에러같기도 하고, Ubound 를 해줘야 한다는 것 같기도 하고, 배열에 대해 잘 몰라 그러는데...  코드를 올바르게 수정해주시면 감사드리겠습니다.