トップページ(目次)

406.超高速処理ができるコード 配列について

配列は難解ですが、使えるようになると非常に便利なコードです。 使えなくても問題がありませんが、例えば、1万行を指定条件で処理する場合、 圧倒的なスピードアップになります。 ゼロから独学で使えるようになったので、その経験を踏まえて、わかりやすさに特化してご紹介します。
サンプル:売上の個数によって、会社ごとに 売上 小・中・大 で条件を分けて置換する場合
<考え方> 現在のデータを配列に格納(対象データ = Range("B2:B10"))  ↓ Ifで必要な処理を行い  ↓ エクセル上にデータを戻す(Range("B2:B10") = 対象データ)
[実行前後]
 → 
Sub 指定条件に置き換え置換する_配列版()
    
    対象データ = Range("B2:B10")
    
    For 配列行 = 1 To 9 'データの個数が9個のため9回処理する
        
        If 30 <= 対象データ(配列行, 1) Then '30~の場合
            
            '何もしない
            
        ElseIf 20 <= 対象データ(配列行, 1) Then '20~の場合
            
            対象データ(配列行, 1) = "売上 大"
            
        ElseIf 10 <= 対象データ(配列行, 1) Then '10~の場合
            
            対象データ(配列行, 1) = "売上 中"
            
        ElseIf 1 <= 対象データ(配列行, 1) Then '1~の場合
            
            対象データ(配列行, 1) = "売上 小"
            
        End If
        
    Next 配列行
    
    Range("B2:B10") = 対象データ
    
End Sub
VBAメニューの [表示] > [ローカルウィンドウ] を表示させて、 対応するデータを確認しながら作ると作りやすいです。 ローカルウィンドウの内容はこちら↓、これを見ながらForとIfを組んでいきます
 [実行前後]
 →   

<少し進化>最終行と配列量を変数に入れる B列の最終行を変数で取得し、配列の大きさを動的に取得することもできます。 最終行 = Cells(Rows.Count, "B").End(xlUp).Row = 10 LBound(対象データ)と書けば、配列(対象データ)内の最小値を取得 = 1 UBound(対象データ)と書けば、配列(対象データ)内の最大値を取得 = 9 これを理解して、自由に使いこなせるようになれれば、いろいろ転用できます。
Sub 指定条件に置き換え置換する_配列版_最終行変数版()

    最終行 = Cells(Rows.Count, "B").End(xlUp).Row
    
    対象データ = Range("B2:B" & 最終行)
    
    For 配列行 = LBound(対象データ) To UBound(対象データ)
        
        If 30 <= 対象データ(配列行, 1) Then '30~の場合
            
            '何もしない
            
        ElseIf 20 <= 対象データ(配列行, 1) Then '20~の場合
            
            対象データ(配列行, 1) = "売上 大"
            
        ElseIf 10 <= 対象データ(配列行, 1) Then '10~の場合
            
            対象データ(配列行, 1) = "売上 中"
            
        ElseIf 1 <= 対象データ(配列行, 1) Then '1~の場合
            
            対象データ(配列行, 1) = "売上 小"
            
        End If
        
    Next 配列行
    
    Range("B2:B" & 最終行) = 対象データ
    
End Sub
注意点として、配列(対象データ)が1個のみの場合、配列が機能しないので使えません。 その場合、最終行が2だった場合のみ別処理を行い条件分岐させます
Sub 指定条件に置き換え置換する_配列版_最終行変数版_一個のみ分岐()

    最終行 = Cells(Rows.Count, "B").End(xlUp).Row
    
    If 最終行 <> 2 Then '通常処理
    
        対象データ = Range("B2:B" & 最終行)
        
        For 配列行 = LBound(対象データ) To UBound(対象データ)
            
            If 30 <= 対象データ(配列行, 1) Then '30~の場合
                
                '何もしない
                
            ElseIf 20 <= 対象データ(配列行, 1) Then '20~の場合
                
                対象データ(配列行, 1) = "売上 大"
                
            ElseIf 10 <= 対象データ(配列行, 1) Then '10~の場合
                
                対象データ(配列行, 1) = "売上 中"
                
            ElseIf 1 <= 対象データ(配列行, 1) Then '1~の場合
                
                対象データ(配列行, 1) = "売上 小"
                
            End If
            
        Next 配列行
        
        Range("B2:B" & 最終行) = 対象データ
    
    Else '最終行 = 2(売上データが1個だけ)の場合
    
            If 30 <= Range("B2") Then '30~の場合
                
                '何もしない
                
            ElseIf 20 <= Range("B2") Then '20~の場合
                
                Range("B2") = "売上 大"
                
            ElseIf 10 <= Range("B2") Then '10~の場合
                
                Range("B2") = "売上 中"
                
            ElseIf 1 <= Range("B2") Then '1~の場合
                
                Range("B2") = "売上 小"
                
            End If
    
    End If

End Sub
慣れるまで少し時間かかりますが、頑張って習得しましょう。

Copyright © 2021 https://excel3000.web.fc2.com/ All Rights Reserved.
    inserted by FC2 system