【ExcelVBA】셀에 대한 For Each의 순서

For Each로 셀 처리



VBA의 For 문장은 두 가지가 있습니다.
  • 시작과 끝의 인덱스를 지정한다.
  • 배열이나 리스트의 선두로부터 말미까지를 처리한다 For カウンタ変数 = 開始 To 終了

  • 인덱스를 지정할 필요가 없으면, 기술이 간결해지기 때문에 상기 2.를 추천하고 싶은 곳입니다.
    그 For Each 要素の変数 In 配列やリスト 루프입니다만, 워크 시트상의 셀을 처리하는 경우, 모르면 「왜??」가 되는 거동이 있으므로 정리해 둡니다. 특히 다른 언어와 저그 배열에 익숙한 사람.
    … 행 단위나 열 단위로 루프하는 쪽이 많다고 생각하기 때문에, 별로 필요가 없는 지식일지도 모릅니다만.

    샘플 데이터


    For Each 데이터를 설정 중입니다.



    샘플 프로그램



    샘플 데이터 범위의 셀 값을 Range("A1:C2") 로 차례로 "/"단락으로 결합해 가고, For Each 로 결과를 이미디에이트 윈도우에 출력합니다.
    ' 処理対象の指定方法によってFor Eachの順番が違う
    Sub TestOrder()
        ' Rangeで読み込み
        Dim str As String: str = ""
        Dim area As Range: Set area = Range("A1:C2")
        Dim cell As Variant: For Each cell In area
            str = str & IIf(Len(str) > 0, "/", "") & cell.Value
        Next
        Debug.Print "                     Range: " & str
    
        ' 二次元配列で読み込み
        str = ""
        For Each cell In area.Value
            str = str & IIf(Len(str) > 0, "/", "") & cell
        Next
        Debug.Print "          Multidimentional: " & str
    
        ' 配列をtranspose関数で行列を入れ替えるとRangeと同じ順番に
        str = ""
        For Each cell In WorksheetFunction.Transpose(area.Value)
            str = str & IIf(Len(str) > 0, "/", "") & cell
        Next
        Debug.Print "Transpose multidimentional: " & str
    End Sub
    

    실행 결과


    Debug.print 로 그대로 For Each 로 지정한 경우와 샘플 데이터의 범위를 배열에 격납하고 나서 지정했을 경우에, 처리하는 셀의 순서가 바뀝니다.
    Range라면 행 단위, 배열에 격납한 경우라면 열 단위가 됩니다. 처음에는 깜짝 놀란다.
                         Range: 陸/海/空/梅/竹/松
              Multidimentional: 陸/梅/海/竹/空/松
    Transpose multidimentional: 陸/海/空/梅/竹/松
    

    배열에 격납했을 경우는 Range2차원 배열은 (1, 1) 로 처리하면, 1차원째×2차원째가 아니라 2차원째×1차원째입니다…
    아마 3차원 이상의 배열도 차원이 큰 순서로 처리한다고 생각한다. 확인하지 않았지만.

    배열의 내용



    셀을 Variant 형식의 배열에 저장하면 다음과 같이 저장됩니다.
    첫 번째 차원은 행이고 두 번째 차원은 열의 다차원 배열입니다.


    위의 배열에 대해 종횡을 변환하는 워크시트 함수의 (1, 2) 를 사용하면 다음과 같이 변환됩니다.
    2차원째×1차원째로 처리하므로, Range를 그대로 지정했을 때와 같은 순서가 됩니다.


    감각적으로는 행×열이 확실히 옵니다…
    Cells 속성의 인수도 (1, 3) 그러나 첫 번째 인수의 행 x 두 번째 인수의 열의 이중 루프가 떠오르기 쉽지 않습니까?

    (다른 언어로) 저그 배열을 익숙해지면, 외측의 작은 차원 → 안쪽의 큰 차원의 이미지가 될 생각이므로, 기억해 두면 좋을지도입니다.
    Java로 POI를 사용해 Excel Fuck 할 때 뭔가, getRow는 있어도 getColumn적인 것이 없기 때문에, 기본이 행 베이스의 처리가 됩니다. (최신판은 모르지만)
    VBA의 다차원 배열은 (1, 1)

    좋은 웹페이지 즐겨찾기