컴퓨터/엑셀

vba 2차원배열 variant 이용, range 이용

풍경소리^^ 2024. 4. 19. 16:49
Sub vlookup2차원배열_variant()
    Dim rngS As Variant
    Dim rngF As Variant
    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim rngS_Col As Long
    Dim arr()
    Dim COL As Long '추출열 갯수
    
    
    'worksheet 셀의 범위를 배열로 집어 넣을 때는 variant 타입으로 선언해야 한다
    Application.ScreenUpdating = False
    
    If Not IsEmpty(Sheets("Sheet2").Range("B2")) Then
        Sheets("Sheet2").Range("B2", Cells(Rows.Count, "B").End(xlUp)).Resize(, 4).ClearContents
    End If
    rngS_Col = Sheets("Sheet2").UsedRange.Columns.Count
    rngS = Sheets("Sheet1").Range("A2", Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)).Resize(, rngS_Col) '기준열
    rngF = Sheets("Sheet2").Range("A2", Sheets("Sheet2").Cells(Rows.Count, "A").End(xlUp)) '타겟열
    
'    COL = 5 '추출열 갯수
    COL = Sheets("Sheet2").UsedRange.Columns.Count - 1
    ReDim arr(1 To UBound(rngF), 1 To COL) ' 7행 5열
    For i = 1 To UBound(rngF, 1) '특정 배열의 index의 최대값, 1차원
        For j = 1 To UBound(rngS, 1)
            If rngF(i, 1) = rngS(j, 1) Then
'                arr(i, 1) = rngS(j, 2)
'                arr(i, 2) = rngS(j, 3)
'                arr(i, 3) = rngS(j, 4)
'                arr(i, 4) = rngS(j, 5)
'                arr(i, 5) = rngS(j, 6)
                For k = 1 To COL
                    arr(i, k) = rngS(j, k + 1) ' k+1 그 다음 열부터, A다음 열부터
                Next k
                Exit For
            End If
        Next j
    Next i
    Sheets("Sheet2").Cells(2, "B").Resize(UBound(arr, 1), COL) = arr
    
    Application.ScreenUpdating = True
End Sub

 

Sub vlookup2차원배열_BDF가져오기()
    Dim rngS As Variant
    Dim rngF As Variant
    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim rngS_Col As Long
    Dim arr()
    Dim COL As Long '추출열 갯수
    
    'worksheet 셀의 범위를 배열로 집어 넣을 때는 variant 타입으로 선언해야 한다
    Application.ScreenUpdating = False
    
    If Not IsEmpty(Sheets("Sheet2").Range("B2")) Then
        Sheets("Sheet2").Range("B2:F" & Cells(Rows.Count, "B").End(xlUp).Row).ClearContents
    End If
    rngS_Col = Sheets("Sheet2").UsedRange.Columns.Count
    rngS = Sheets("Sheet1").Range("A2", Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)).Resize(, rngS_Col) '기준열
    rngF = Sheets("Sheet2").Range("A2", Sheets("Sheet2").Cells(Rows.Count, "A").End(xlUp)) '타겟열
    
    COL = 5 '추출열 갯수
    ReDim arr(1 To UBound(rngF), 1 To COL) ' 7행 5열
    For i = 1 To UBound(rngF, 1) '특정 배열의 index의 최대값, 1차원
        For j = 1 To UBound(rngS, 1)
            If rngF(i, 1) = rngS(j, 1) Then
                arr(i, 1) = rngS(j, 2) ' B열 가져오기
                arr(i, 3) = rngS(j, 4) ' D열 가져오기
                arr(i, 5) = rngS(j, 6) ' F열 가져오기
                Exit For
            End If
        Next j
    Next i
    Sheets("Sheet2").Cells(2, "B").Resize(UBound(arr, 1), COL) = arr
    Application.ScreenUpdating = True
End Sub

 

Sub vlookup2차원배열_range()
    Dim rngS As Range
    Dim rngF As Range ' 변경된 부분
    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim rngS_Col As Long
    Dim arr()
    Dim COL As Long '추출열 갯수
    
    
    'worksheet 셀의 범위를 배열로 집어 넣을 때는 variant 타입으로 선언해야 한다
    Application.ScreenUpdating = False
    
    If Not IsEmpty(Sheets("Sheet2").Range("B2")) Then
        Sheets("Sheet2").Range("B2", Cells(Rows.Count, "B").End(xlUp)).Resize(, 4).ClearContents
    End If
    rngS_Col = Sheets("Sheet2").UsedRange.Columns.Count
    Set rngS = Sheets("Sheet1").Range("A2", Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)).Resize(, rngS_Col) ' 변경된 부분 '기준열
    Set rngF = Sheets("Sheet2").Range("A2", Sheets("Sheet2").Cells(Rows.Count, "A").End(xlUp)) ' 변경된 부분 '타겟열
    
    COL = Sheets("Sheet2").UsedRange.Columns.Count - 1
    ReDim arr(1 To rngF.Rows.Count, 1 To COL) ' 변경된 부분 '타겟 범위의 행 수만큼 배열 크기 설정
    For i = 1 To rngF.Rows.Count ' 변경된 부분 '타겟 범위의 행 수만큼 반복
        For j = 1 To rngS.Rows.Count
            If rngF.Cells(i, 1).Value = rngS.Cells(j, 1).Value Then
                For k = 1 To COL
'                    arr(i, 1) = rngS(j, 2) ' B열 가져오기
'                    arr(i, 3) = rngS(j, 4) ' D열 가져오기
'                    arr(i, 5) = rngS(j, 6) ' F열 가져오기
                    arr(i, k) = rngS.Cells(j, k + 1).Value
                Next k
                Exit For
            End If
        Next j
    Next i
    Sheets("Sheet2").Cells(2, "B").Resize(rngF.Rows.Count, COL) = arr ' 변경된 부분 '타겟 범위의 행 수에 맞게 배열 출력
    
    Application.ScreenUpdating = True
End Sub