OffsetとResizeの解説(Resize使うとマクロが速くなるよって話)


RangeやCellsだけで対象セルを特定できるのは、比較的簡単なケースです。実務はそんなに甘くありません。操作の対象セルを、縦横無尽に操るためには、どうしてもOffsetプロパティとResizeプロパティが必須です。この動画では、ビギナーが間違えやすいポイントや、Resizeを使うとマクロが速くなるケースをご紹介します。

↓左上にあるをクリックすると、チャンネル登録できます。ぜひ、チャンネル登録をお願いします。あなたのチャンネル登録が、私のやる気を維持向上してくれます(笑)

Sub Macro1()
    Dim この範囲 As Range
    Range("A1").AutoFilter 1, "田中"
    Set この範囲 = Range("A1").CurrentRegion.Offset(1, 0)
    この範囲.Resize(この範囲.Rows.Count - 1).Interior.Color = 255
    Range("A1").AutoFilter
End Sub
Sub Macro2()
    Range("A1").AutoFilter 1, "田中"
    Range(Range("A2"), Cells(Rows.Count, 4).End(xlUp)).Interior.Color = 255
    Range("A1").AutoFilter
End Sub
Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
Sub Macro1()
    Dim i As Long, ST As Long
    ST = GetTickCount
    With WorksheetFunction
        For i = 2 To Range("A1").End(xlDown).Row
            Cells(i, 2) = .VLookup(Cells(i, 1), Range("名前"), 2, False)
            Cells(i, 3) = .VLookup(Cells(i, 1), Range("地域"), 2, False)
            Cells(i, 4) = .VLookup(Cells(i, 1), Range("記号"), 2, False)
            Cells(i, 5) = .VLookup(Cells(i, 1), Range("数値"), 2, False)
        Next i
    End With
    Debug.Print (GetTickCount - ST) / 1000
End Sub
Sub Macro2()
    Dim i As Long, A(3) As String, ST As Variant
    ST = GetTickCount
    With WorksheetFunction
        For i = 2 To Range("A1").End(xlDown).Row
            A(0) = .VLookup(Cells(i, 1), Range("名前"), 2, False)
            A(1) = .VLookup(Cells(i, 1), Range("地域"), 2, False)
            A(2) = .VLookup(Cells(i, 1), Range("記号"), 2, False)
            A(3) = .VLookup(Cells(i, 1), Range("数値"), 2, False)
            Cells(i, 1).Offset(0, 1).Resize(, 4) = A
        Next i
    End With
    Debug.Print (GetTickCount - ST) / 1000
End Sub

動画で使用したブックのダウンロード(20200716.xlsm)

Office TANAKAのYouTubeチャンネルはこちら(動画一覧ページ)