[Excel VBA] 대량의 셀 값을 일괄 로드

Excel



여러 셀에 값을 한 번에 쓰기 의 엔트리의 반대로, 이번에는 대량의 셀의 값을 일괄로 읽어 보자.

이쪽도 Variant형의 2차원 배열을 사용합니다.

입력



100 열 1000 행 시트에 RANDBETWEEN 함수로 무작위 값을 넣고 값 붙여 넣기.
시트 이름은 "in"


출력



각 셀의 값의 행 번호, 열 번호 및 값을 출력한다. 1행째는 타이틀행으로 명세서는 2행째로부터.
시트 이름은 "out".


코드



포인트는 다음과 같습니다.
1. 출력용의 2차원 배열(Variant형.↓의 코드에서는 변수vout)를 만든다
2. 출력용의 2차원 배열에 값을 세트(1차원째가 행 방향, 2차원째가 열 방향)
3. 출력용의 2차원 배열과 행수, 열수가 같은 Range 객체(↓의 코드에서는 변수 rout)를 만든다.
4. 출력용 2차원 배열을 Range의 Value 속성에 설정합니다.

Excel 개체에 대한 액세스가 적기 때문에 빠릅니다. 1초가 걸리지 않습니다.
Option Explicit
Public Sub Flatten3()
    Dim a As Excel.Application
    Dim b As Workbook
    Dim w As Worksheet
    Dim rr As Range
    Dim v As Variant
    Dim i As Long
    Dim j As Long

    Dim wout As Worksheet
    Dim rout As Range

    Dim row As Long
    Dim column As Long
    Dim value As String

    Dim vout As Variant
    Dim rowCount As Long
    Dim k As Long

    Debug.Print Time & " - Flatten3 スタート"

    ''Workbook変数セット
    Set a = Application
    Set b = a.ThisWorkbook

    ''inシートの範囲指定
    Set w = b.Worksheets("in")
    Set rr = w.Range("A1")
    Set rr = w.Range(rr, rr.End(xlToRight).End(xlDown))

    ''outシートのクリア
    Set wout = b.Worksheets("out")
    wout.Range("2:1000000").ClearContents

    ''outシートの初期位置をA1に。
    Set rout = wout.Range("A1")

    ''100列1000行の値を一括してVariantに入れる→2次元配列になる。
    Debug.Print Time & " - Flatten3 読み込み"
    v = rr.value

    Debug.Print Time & " - Flatten3 ループ+書き込み用配列作成"

    ''出力用の配列を定義。行数100*1000、列数3
    rowCount = UBound(v, 1) * UBound(v, 2)
    ReDim vout(1 To rowCount, 1 To 3)

    ''列方向のループ
    For i = LBound(v, 1) To UBound(v, 1)
        ''行方向のループ
        For j = LBound(v, 2) To UBound(v, 2)
            row = i
            column = j
            value = v(i, j)        

            ''出力用配列にセット
            k = k + 1
            vout(k, 1) = row
            vout(k, 2) = column
            vout(k, 3) = value
        Next j
    Next i

    Debug.Print Time & " - Flatten3 配列から書き込み"
    ''A2を起点として、出力用配列と同サイズのRangeをセット
    Set rout = wout.Range("A2").Resize(rowCount, 3)

    ''配列から一括書き込み
    rout.value = vout

    Debug.Print Time & " - Flatten3 終了"
    MsgBox "終了!"
End Sub

좋은 웹페이지 즐겨찾기