EXCEL의 VBA에서 2D 배열의 특정 열 또는 행을 1D 배열로 변환하는 방법

샘플



아래의 코드로 2차원 배열을 간단히 1차원 배열로 변환할 수 있습니다.
Public Sub Sample()
    Dim 二次元配列 As Variant
    Dim 一次元配列 As Variant

    二次元配列 = Range("A1:B6")

    '3行目を一次元配列化する
    一次元配列 = WorksheetFunction.Index(二次元配列, 3)
    Debug.Print "3行目= " & Join(一次元配列, ",")

    '1列目を一次元配列化する
    '一次元配列 = WorksheetFunction.Index(二次元配列, , 1) 'Index関数のHELP的にはできそうですがエラーになります
    'Transpose()関数を使って行と列を入替えます
    一次元配列 = WorksheetFunction.Index(WorksheetFunction.Transpose(二次元配列), 1)
    Debug.Print "1列目= " & Join(一次元配列, ",")
End Sub

위의 함수를 이러한 셀의 상태로 실행하면

결과는 다음과 같습니다.3行目= 鈴木,281列目= 名前,佐藤,鈴木,高橋,田中,山田
WorksheetFunction.Index() 함수를 사용하는 것으로 2차원 배열에서 1차원 배열로의 변환을 실현하고 있습니다.

2021/1/9 추가
데이터가 대량인 경우一次元配列 = WorksheetFunction.Index(WorksheetFunction.Transpose(二次元配列), 1) 의 부분은一次元配列 = WorksheetFunction.Transpose(WorksheetFunction.Index(二次元配列, 0, 1)) 그렇다면 더 빠릅니다.WorksheetFunction.Index(二次元配列, 0, 1) 의 결과는 1열의 2차원 배열이 반환되지만 WorksheetFunction.Transpose() 함수에 1열의 2차원 배열을 전달하면 1차원 배열을 반환하는 것 같습니다.

다음과 같이 사용자 정의 2 차원 배열도 가능합니다.


Public Sub Sample2()
    Dim 二次元配列(1 To 5, 1 To 5) As String
    Dim 一次元配列 As Variant

    Dim i, j
    For i = 1 To 5
        For j = 1 To 5
            二次元配列(i, j) = Chr(Asc("A") - 1 + j) & i
        Next
    Next

    '3行目を一次元配列化する
    一次元配列 = WorksheetFunction.Index(二次元配列, 3)
    Debug.Print "3行目= " & Join(一次元配列, ",")

    '1列目を一次元配列化する
    一次元配列 = WorksheetFunction.Index(WorksheetFunction.Transpose(二次元配列), 1)
    Debug.Print "1列目= " & Join(一次元配列, ",")
End Sub

결과는 다음과 같습니다.3行目= A3,B3,C3,D3,E31列目= A1,A2,A3,A4,A5
이 방법을 사용하면 샘플 코드와 같이 1차원 배열을 인수로 취하는 함수를 실행하는 코드를 매우 간결하게 기술할 수 있게 됩니다.

응용 예



여기에서는 필자의 상상입니다만(필자의 환경에서는 스필을 사용할 수 없기 때문에)
새롭게 도입된 Spill 함수의 하나인 SortBy() 함수로 이하와 같은 사용법을 할 수 있는 것이 아닐까 상상하고 있습니다.
Public Sub Sample3()
    Dim ソート前テーブル(1 To 5, 1 To 5)
    Dim ソート後テーブル As Variant
    Dim 一列目 As Variant
    Dim 二列目 As Variant

    Dim i, j
    For i = 1 To 5
        For j = 1 To 5
            テーブル(i, j) = いろいろ設定
        Next
    Next

    '1列目と2列目でソートする
    一列目 = WorksheetFunction.Index(WorksheetFunction.Transpose(ソート前テーブル), 1)
    二列目 = WorksheetFunction.Index(WorksheetFunction.Transpose(ソート前テーブル), 2)    
    ソート後テーブル = WorksheetFunction.SortBy(ソート前テーブル, 一列目, , 二列目)
End Sub

이것이 가능하면 내부 테이블의 정렬이 매우 간단해집니다. .
Spill을 사용할 수 있는 분 누군가 보고 부탁합니다.

좋은 웹페이지 즐겨찾기