今回はVBAの基本操作(応用1)の続きになります。それでは行ってみましょう!
まずは前回作成したマクロをボタンで動作できるようにしてみます。
写真のように[開発]→[挿入]→[フォームコントロール]と開き一番左上にある四角のボタンをクリックします。
先ほど作成したプロシージャ名を選択して[OK]をクリックします。
そしてカーソルをドラックアンドドロップでボタンの大きさをきめます。
写真のようにボタンが出来たら完了です。試しに抽出したデータを削除してみてボタンによる動作確認をしてみましょう!
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に限らず全ての言語に言えることですが、中身を完璧に理解しようとすると習得までにとんでもなく時間がかかりますので、必要に応じて調べて作りたいものが作れることが一番大切です。そして、今回の記事をきっかけにプログラミングの楽しさを少しでもわかって貰えれば幸いです。