VBAの基本操作（応用２）

今回はVBAの基本操作（応用１）の続きになります。それでは行ってみましょう！

まずは前回作成したマクロをボタンで動作できるようにしてみます。
![ボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958041/b4f60e36-7319-85aa-5646-3a9e8050d90e.png)
写真のように[開発]→[挿入]→[フォームコントロール]と開き一番左上にある四角のボタンをクリックします。
![ボタン２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958041/9bbd759b-7ba9-6201-9564-d2fcdb838dff.png)
先ほど作成したプロシージャ名を選択して[OK]をクリックします。
そしてカーソルをドラックアンドドロップでボタンの大きさをきめます。
![ボタン３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958041/f6cc8287-5476-825c-7eb6-4eea7d8dd490.png)
写真のようにボタンが出来たら完了です。試しに抽出したデータを削除してみてボタンによる動作確認をしてみましょう！

```:総額と注文書あたりの平均額の算出
Sub test2()
    Cells(1, 8) = "総合計"
    Cells(1, 9) = "総平均"
    
    Dim i
    Dim endRow
    S = 0 '注文の総額
    ctrRow = 1

　　'最終行を取得する
    endRow = Range("A2").End(xlDown).Row
    
　　'注文額の入力されているセルの範囲
    For i = 1 To endRow
        S = S + Cells(i + 1, 7)
    Next i
    
　　'すべての注文書の総額の入力
    Cells(2, 8) = S

　　'一つの注文書あたり平均額
    Cells(2, 9) = S / endRow

　　'金額表示の整理
    Cells(2, 8).NumberFormatLocal = "#,###"
    Cells(2, 9).NumberFormatLocal = "#,###.##"
End Sub
```
この処理の中で`End(xlDown).Row`を使っていますがこれはデータ群の最終行を取得することができます。[Ctrl]+[▽]をイメージしてもらえれば分かりやすいかと思います。

```:平均値以下のデータを赤く塗りつぶす
Sub test3()
    Dim i
    endRow = Range("A2").End(xlDown).Row  '最終行を取得する
    
　　'注文額のセルの範囲
    For i = 1 To endRow

　　　　'注文額の列にあるセルが「空白」の場合
        If Cells(i + 1, 7) = "" Then

　　　　　　'何もしない
            Exit Sub

　　　　'セルが「空白」でない場合
        Else

　　　　　　　'セルの値が平均額より低い場合
            If Cells(i + 1, 7) < Cells(2, 9) Then

　　　　　　　　　'セルを赤くする
                Range(Cells(i + 1, 1), Cells(i + 1, 7)).Interior.Color = RGB(250, 0, 0)

            End If
        End If
    Next i
End Sub
```

```:最大小計のデータを青く塗りつぶす
Sub test4()
    S = 0  '最大小計

  　'最終行を取得する
    endRow = Range("A2").End(xlDown).Row
    
　　'注文額が入力されている範囲
    For i = 1 To endRow

　　　　 'もしS(最大小計)よりセルの値が大きい場合
        If S < Cells(i + 1, 5) Then 

　　　　　　　'S（最大小計）の値を更新する（セルの値を入れる）
            S = Cells(i + 1, 5)

        End If
    Next i
    
    For i = 1 To endRow

　　　　'S（最大小計）のセルの位置において
        If Cells(i + 1, 5) = S Then

　　　　　　'特定の範囲のセルを青くする
           Range(Cells(i + 1, 1), Cells(i + 1, 7)).Interior.Color = RGB(0, 0, 250)
        End If
    Next i
End Sub
```

```:会社名で並び変える
Sub test5()
 　　'最終行を取得する
    endRow = Range("A2").End(xlDown).Row 

　　'特定の範囲でソート関数（整列させる）を使用する
    Call Range(Cells(2, 1), Cells(endRow, 7)).Sort(Key1:=Cells(2, 3), Order1:=xlAscending)
End Sub
```
`Range(Cells(2, 1), Cells(endRow, 7))`の部分で今回ソートしたいデータ群の範囲を全て呼び出すところに注意して下さい。

```:平均額以下の注文データを抽出シートにコピーする
Sub test6()
    '抽出用のワークシートを作成する
    Worksheets.Add After:=ActiveSheet
    Sheets(2).Select
    ActiveSheet.Name = "抽出"
    Sheets(1).Select

    '項目の表示
    Worksheets("抽出").Range("A1") = "発注番号"
    Worksheets("抽出").Range("B1") = "発注者"
    Worksheets("抽出").Range("C1") = "発注先"
    Worksheets("抽出").Range("D1") = "小計最大品名"
    Worksheets("抽出").Range("E1") = "小計最大価格"
    Worksheets("抽出").Range("F1") = "数量合計"
    Worksheets("抽出").Range("G1") = "金額合計"
    
    Dim i
    j = 1
    endRow = Range("A2").End(xlDown).Row  '最終行を取得する
    
        '平均額以下の注文データを抽出シートにコピーする
        For i = 1 To endRow
            If Worksheets(1).Cells(i + 1, 7) < Cells(2, 9) Then
                Worksheets(1).Cells(i + 1, 7).EntireRow.Copy
                Worksheets("抽出").Cells(j + 1, 1).PasteSpecial xlPasteFormulasAndNumberFormats
                j = j + 1
            End If
        Next i

        '余計なデータを削除する
        Worksheets("抽出").Cells(2, 8).ClearContents
        Worksheets("抽出").Cells(2, 9).ClearContents
End Sub
```

　以上でVBAの基本操作の解説を終了いたします。いかがでしたでしょうか？一度で理解することは難しいかもしれませんが何度も試したりコードの一部を変更して動作確認してみたりするとより理解が深まると思います。

　VBAに限らず全ての言語に言えることですが、中身を完璧に理解しようとすると習得までにとんでもなく時間がかかりますので、必要に応じて調べて作りたいものが作れることが一番大切です。そして、今回の記事をきっかけにプログラミングの楽しさを少しでもわかって貰えれば幸いです。