【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)

    좋은 웹페이지 즐겨찾기