家計簿アプリを、より使いやすく自分仕様に改造していきましょう!
以前の投稿で、家計簿アプリとして最低限の機能を持たせることができました。
(その6までをご確認いただいていない方は、まずは下記まとめをご確認ください。)
ただ、これは本当に最低限の機能しかなく、勘定科目も『固定費』と『変動費』しかないので、
各家庭に合った勘定科目を自由に追加できるように、
このマクロのデコレーションをしていく必要があります。
前回、勘定科目ごとのボタンを作って、『金額入力⇒ボタンクリック』という作業だけでリストに追加できるようになりました。
今回は前回作ったマクロに少しだけ修正を加えていこうと思います。
修正していくのは【引数】の部分。現状のままだと新しい勘定項目を追加するたびにマクロをそれなりに修正する必要があります。
今回の修正で、その作業を少しでも簡単にできるようにしていきたいと思います。
【本記事の目標】
引数の使い方のアイディアを知ろう
簡単なイメージは下記記事に記載していますので、イメージづくりや今回以降の流れの参考に。
また、前回の記事については下記をご確認ください。
前回のおさらい
前回作ったマクロでは、
同じ動作をする部分のプロシージャには引数として『収支』『固定費・変動費』『各勘定科目』の3つを文字で入力する形にしていました。
そのため、各ボタンに割り当てているコードではこのプロシージャを呼び出す際に、これら3つの内容を文字で入力する必要があります。
これでも問題はないのですが、今後勘定科目を追加していく際に毎回このように入力していくのは手間ですので、今回はここを少し修正していきたいと思います。
マクロ修正のイメージ
各勘定科目はすでにシート上に書いてある
じゃあ実際にどういった修正をしていくのか。
そもそも、今引数として入力している文字ですが、実は入力シート上にすでに記入されていますよね。
そう、各勘定科目の合計を計算しているテーブルです。
せっかくここに記入されているのであれば、ここの『上から何番目の項目を読み取るのか』を指定してあげれば、今後勘定科目を追加していったとしても『何番目』というのを指定するだけでいいので非常に楽になりますよね。
ですので、
- 【KamokuInput_1】の引数には場所の番号だけを指定する
- 【KamokuInput_1】のプロシージャの中で指定された場所の科目を読み取る
- 『収入・支出』に関しては、『固定費・変動費』の欄が空欄かどうかで判別する
こういった修正を加えれば、さらに追加や修正が容易なマクロになっていきます。
それでは早速修正していきましょう。
修正したマクロ
【KamokuInput_1】の引数については PositionNum1 という変数にしておきます。
で、この変数を使って「Syushi1」「Kamoku1」「Kamoku2」の3つの変数に入力する場所を指定していきます。
入力したい勘定科目が書いてある場所ですが、
「Kamoku1」に入力する『固定費・変動費』については”I9”セルから下に○番目に記載されています。
また「Kamoku2」に入力する『各勘定科目』については”J9”セルから下に○番目に記載されています。
このように、あるセル・ある範囲(Range)から○番目の場所 というのを指定する場合 Offset というコードが非常に便利です。
このコードは、場所を指定する Range や Cell のコードの後ろに付けて、
Offset([縦に移動する数], [横に移動する数])
といった形で記入し、指定した場所から記載した数だけ移動した場所のデータを操作できます。
例えば今回の場合ですと下記のような使い方になります。
Activesheet.Range(“I9”).Offset(PositionNum1, 0).Value
こう記載すれば、”I9”セルから[PositionNum1]の数だけ下に移動したセルのデータを読み取ることができます。
これを踏まえて【KamokuInput_1】のコードを書き換えると、下記のようになります。
Option Explicit
Sub KamokuInput_1(PositionNum1 As Integer)
'リストに追加をクリック
Dim Kingaku1 As Double
Kingaku1 = ThisWorkbook.ActiveSheet.Range("C3").Value
'シート上から勘定科目を読み取る
Dim Syushi1 As String
Dim Kamoku1 As String
Dim Kamoku2 As String
Syushi1 = ""
Kamoku1 = ""
Kamoku2 = ""
With ThisWorkbook.ActiveSheet
Kamoku1 = .Range("I9").Offset(PositionNum1, 0).Value
Kamoku2 = .Range("J9").Offset(PositionNum1, 0).Value
If Kamoku1 = "" Then
Syushi1 = "収入"
Else
Syushi1 = "支出"
End If
End With
Dim EndRow1 As Integer
With ThisWorkbook.ActiveSheet
EndRow1 = .Cells(.Rows.Count, 2).End(xlUp).Row
EndRow1 = EndRow1 + 1
.Cells(EndRow1, 2).Value = Syushi1
.Cells(EndRow1, 3).Value = Kamoku1
.Cells(EndRow1, 4).Value = Kamoku2
If Syushi1 = "収入" Then
.Cells(EndRow1, 5).Value = Kingaku1
Else
.Cells(EndRow1, 6).Value = Kingaku1
End If
End With
Call Jisaku_SUM
End Sub
あとは、各ボタンに割り当てたマクロで、もともと引数に文字を入力していた部分を『何番目』の数字だけ記入するように修正します。
Option Explicit
'給料
Sub Kyuryo_1()
Call KamokuInput_1(1)
End Sub
'光熱費
Sub Konetsuhi_1()
Call KamokuInput_1(2)
End Sub
'通信費
Sub Tushinhi_1()
Call KamokuInput_1(3)
End Sub
'家賃
Sub Yatin_1()
Call KamokuInput_1(4)
End Sub
'食費
Sub Syokuhi_1()
Call KamokuInput_1(5)
End Sub
'生活費
Sub Seikatsuhi_1()
Call KamokuInput_1(6)
End Sub
'衣服代
Sub Ihukudai_1()
Call KamokuInput_1(7)
End Sub
'教育費
Sub Kyoikuhi_1()
Call KamokuInput_1(8)
End Sub
'娯楽費
Sub Gorakuhi_1()
Call KamokuInput_1(9)
End Sub
これで修正は完了です。
各ボタンに割り当てたマクロの部分を見ると、引数に数字だけを記載するようになったので、すっきりした気がしませんか?
(そんな気がするのは私だけかもしれませんが。。。)
引数にはこういった使い方もできますよ、という一例の紹介でした。
最終的な動きは同じでも、色々な方法でそれを実現できてしまうのがプログラミングの楽しいところかと思いますので、是非とも色々な方法を知って、自信がやりやすい方法を探していってみてください。
せっかくなので、、、集計部の修正も合わせて
今回は簡単なマクロの修正だけだったので、せっかくなので集計部の修正もしてしまいたいと思います。
恐らく、現状では集計部には『収支合計』『支出合計』『固定費合計』『変動費合計』の部分は、マクロを起動させたときに集計を計算して記入するようになっているかと思います。
ただ、同じように集計している『各勘定科目』の部分は計算式(SUMIF)を入力していますね。
せっかくなのでここも統一して、『収支合計』『支出合計』『固定費合計』『変動費合計』の部分も全て計算式を入力してしまいましょう。
計算式自体は『各勘定科目』に記入しているものとほぼ同じで大丈夫です。
ただ、項目がある範囲や実際に合計を計算する範囲は各々変わってきますので、そこはご注意ください。
また【KamokuInput_1】のプロシージャの中で、集計した結果をこのセルに記入しているコードがありますので、そこも削除しておきましょう。
これを削除し忘れると、せっかく記入した計算式が消されて、再度記入しなおす必要が出てしまうので、ご注意ください。
Option Explicit
Sub KamokuInput_1(PositionNum1 As Integer)
'リストに追加をクリック
Dim Kingaku1 As Double
Kingaku1 = ThisWorkbook.ActiveSheet.Range("C3").Value
'シート上から勘定科目を読み取る
Dim Syushi1 As String
Dim Kamoku1 As String
Dim Kamoku2 As String
Syushi1 = ""
Kamoku1 = ""
Kamoku2 = ""
With ThisWorkbook.ActiveSheet
Kamoku1 = .Range("I9").Offset(PositionNum1, 0).Value
Kamoku2 = .Range("J9").Offset(PositionNum1, 0).Value
If Kamoku1 = "" Then
Syushi1 = "収入"
Else
Syushi1 = "支出"
End If
End With
Dim EndRow1 As Integer
With ThisWorkbook.ActiveSheet
EndRow1 = .Cells(.Rows.Count, 2).End(xlUp).Row
EndRow1 = EndRow1 + 1
.Cells(EndRow1, 2).Value = Syushi1
.Cells(EndRow1, 3).Value = Kamoku1
.Cells(EndRow1, 4).Value = Kamoku2
If Syushi1 = "収入" Then
.Cells(EndRow1, 5).Value = Kingaku1
Else
.Cells(EndRow1, 6).Value = Kingaku1
End If
End With
End Sub
これで集計部の修正も完了です。
次の記事へ
コメント