エクセルバージョン
マイクロソフト365
前回関数でsumの可変自動合計をデモしてみましたが、今回はVBAでも可能なので実施してみたいと思います。
【完成後】
それでは行ってみましょう\(^^)/
Menu
今回の作成ポイント
作成にあたり下記のような流れで作成します。
・シートモジュールで、どの行が変わったら処理を実行するかを判別。
(changeイベント)
・標準モジュールで、結果を表示させる。
VBAコード
①シートモジュール
シートモジュールの場所が分からない場合は下記
https://dailyrecords.blog/archives/6207#i-5
シートモジュールを開いたら下記のようにWorksheetを選択します。
表示されたら全て消去して下記をコピペします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | Option Explicit '定数 Const 列 As String = "A" '列を指定 Const 開始行番号 As String = 1 '開始行番号指定 Const 最終行マイナス As String = 0 '-1で最終行の1つ上 'メンバー変数 Public c As String Public r As Integer Public e As Integer 'チェンジイベント Private Sub Worksheet_Change(ByVal Target As Range) Dim name As String '指定した列以外だったら処理終了 If Intersect(Target, Columns(列)) Is Nothing Then Exit Sub Else '指定した列だったら処理実行 name = ActiveSheet.name 'シート名取得 '定数をメンバー変数 With Sheets(name) .c = 列 .r = 開始行番号 .e = 最終行マイナス End With '処理開始 Call 可変合計 End If End Sub |
行の開始位置を指定(初期はA1)と最終行の何個上かを指定
下記の黄色の部分を変更すれば列と開始行と最終行の3つの変更ができます。
①3行目 列の変更 ➔ Const 列 As String = “A”
②4行目 開始行番号の変更 ➔ Const 開始行番号 As String = 1
③5行目 最終行番号の変更 ➔ Const 最終行マイナス As String = 0
③は変更する場合だけ-1や-2,-3で最終行の何個上にするかを指定します。
次に標準モジュールに記述していきます(*^^)v
とはいっても全てコピペしてあげれば出来上がりです。
②標準モジュール
標準モジュールの場所が分からない場合は下記
https://dailyrecords.blog/archives/6207#i-3
Debug.Printでイミディエイトウィンドウが表示されない場合は下記
https://dailyrecords.blog/archives/5003#i-5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Option Explicit Sub 可変合計() '変数 Dim startLow, lastRow, endRow As Long Dim col As String With Sheets(ActiveSheet.name) col = .c '列 startLow = .r '開始行番号 endRow = .e '最終行の上 End With 'データの最終行番号取得 lastRow = Cells(Rows.Count, col).End(xlUp).ROW 'イミディエイトウィンドウに表示 On Error Resume Next Debug.Print WorksheetFunction. _ Sum(Range(Cells(startLow, col), Cells(lastRow + endRow, col))) End Sub |
セルに表示したい場合ははDebug.PrintをRangeやCellsに変更すればセルに表示できます。
コピペして上記の黄色の部分だけ変更すればOKです\(^^)/
初期値はA列なのでA列に数字を入れていけば合計がイミディエイトウィンドウに表示されます。
まとめ
エクセルの形式がそれぞれわからないのでパラメーターを作成しました。
なんとか自動取得できればいいのですがVBAが分からない場合に、もしエラーなどが出た場合は対処はできません。
前回も関数で可変自動合計をしましたが、VBAでもChangeイベントを使用すれば作成が可能ということが少しでも理解してもらえたら幸いです。
以上です。