- シートの1行を「1件のお買い物(支出)」や「1件の収入」に対応づける。
- まずは、VBAのコントロールを利用し、ユーザフォームを作る。
- そして、そのフォームからデータ入力をするところをVBAで書く。それだけだ。
ユーザフォームを作るには、EXCELメニューの「開発」タブから、「Visual Basic」タブをクリックし、「挿入」タブから「ユーザーフォーム」を選択する。すると、Userform1という名前でユーザーフォームが追加されるので、ここにテキストボックスだの、ボタンだのを追加していくわけだ。
初めてやる場合、ここら辺は非常にわかりにく大変な作業になる。ネットを駆使して、頑張って作ろう!
これがメインとなるコードだ。最終行の求め方はEXCELのバージョンによる影響があり、その度に見直している。今はこれがいいようだ。ネットの師匠に聞いたのだ。つまり、マネしてみだ。というか、コピペだ。
これは年月日の増減を行うスピンボタンのコードだ。
初めてやる場合、ここら辺は非常にわかりにく大変な作業になる。ネットを駆使して、頑張って作ろう!
- UserForm1のタイトルバー(Caption)は「家計簿への入力」としておこう。
- 「内容」というフィールドはテキストボックスで作る。変数名はTEXTBOX1とする。
- 「金額」というフィールドはテキストボックスで作る。変数名はTEXTBOX2とする。
- 「年月日」というフィールドはテキストボックスで作る。変数名はTEXTBOX3とする。日付の増減のためにスピンボタンを追加しよう。
- 「種別」というフィールドはラジオボタンで、支出と収入を選択できるようにしよう。
- 「クレジットカード支払」というチェックボックスを作ろう。変数名はCheckBox1とする。
- 「登録」というコマンドボタンを作り、変数名はCommandButton1とする。「登録」ボタンがクリックされたら、UserForm1で指定された「年月日」、「内容」、「費目」、「費目コード」、「金額」、「クレジット支払(フラグ)」がEXCELの「家計簿」というシートの最終行の次行のそれぞれのフィールドとして追加されるようなコードを書いておく。
UserForm1 |
これがメインとなるコードだ。最終行の求め方はEXCELのバージョンによる影響があり、その度に見直している。今はこれがいいようだ。ネットの師匠に聞いたのだ。つまり、マネしてみだ。というか、コピペだ。
Dim 最終行 As Long Sub CommandButton1_Click() Sheets("家計簿").Select ' 最終行 = Range("A3").End(xlDown).Row + 1 ' With ActiveSheet.UsedRange 最終行 = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row + 1 End With If ComboBox1 = "" Then MsgBox "費目名が入っちょらんどー。" Exit Sub End If If TextBox2 = "" Then MsgBox "金額が入っちょらんどー。" Exit Sub End If Sheets("家計簿").Range("B" & 最終行).Value = TextBox1.Value Sheets("家計簿").Range("A" & 最終行).Value = TextBox3.Value Sheets("家計簿").Range("A" & 最終行).NumberFormatLocal = "yyyy/mm/dd ddd" If OptionButton1 Then '支出の場合' Sheets("家計簿").Range("F" & 最終行).Value = TextBox2.Value Sheets("家計簿").Range("E" & 最終行).Value = "" Else '収入の場合' Sheets("家計簿").Range("E" & 最終行).Value = TextBox2.Value Sheets("家計簿").Range("F" & 最終行).Value = "" End If If CheckBox1.Value Then Sheets("家計簿").Range("G" & 最終行).Value = 1 Else Sheets("家計簿").Range("G" & 最終行).Value = 0 End If Sheets("家計簿").Range("D" & 最終行).Value = ComboBox1.Value If OptionButton1 Then '支出の場合' Select Case ComboBox1 Case "食費" Sheets("家計簿").Range("C" & 最終行).Value = 1201 Case "住居" Sheets("家計簿").Range("C" & 最終行).Value = 1202 Case "光熱・水道" Sheets("家計簿").Range("C" & 最終行).Value = 1203 Case "被服" Sheets("家計簿").Range("C" & 最終行).Value = 1204 Case "保健・医療" Sheets("家計簿").Range("C" & 最終行).Value = 1205 Case "教育" Sheets("家計簿").Range("C" & 最終行).Value = 1206 Case "教養・娯楽" Sheets("家計簿").Range("C" & 最終行).Value = 1207 Case "交際" Sheets("家計簿").Range("C" & 最終行).Value = 1208 Case "交通・通信" Sheets("家計簿").Range("C" & 最終行).Value = 1209 Case "貯蓄" Sheets("家計簿").Range("C" & 最終行).Value = 1210 Case "保険" Sheets("家計簿").Range("C" & 最終行).Value = 1211 Case "税金" Sheets("家計簿").Range("C" & 最終行).Value = 1212 Case "その他" Sheets("家計簿").Range("C" & 最終行).Value = 1213 Case "定期代" Sheets("家計簿").Range("C" & 最終行).Value = 1214 Case "薬代" Sheets("家計簿").Range("C" & 最終行).Value = 1215 End Select Else '支出の場合' Select Case ComboBox1 Case "給与" Sheets("家計簿").Range("C" & 最終行).Value = 1101 Case "賞与" Sheets("家計簿").Range("C" & 最終行).Value = 1102 Case "年金" Sheets("家計簿").Range("C" & 最終行).Value = 1103 Case "雑収入" Sheets("家計簿").Range("C" & 最終行).Value = 1104 Case "その他" Sheets("家計簿").Range("C" & 最終行).Value = 1105 Case "前月繰越" Sheets("家計簿").Range("C" & 最終行).Value = 1106 Case "パート代" Sheets("家計簿").Range("C" & 最終行).Value = 1107 Case "アルバイト代" Sheets("家計簿").Range("C" & 最終行).Value = 1108 End Select End If ' ピボットを自動更新' Worksheets("ピボット").PivotTables("ピボットテーブル1").SourceData = "家計簿!R2C1:R" & 最終行 & "C7" Worksheets("ピボット2").PivotTables("ピボットテーブル1").SourceData = "家計簿!R2C1:R" & 最終行 & "C7" Worksheets("ピボット").PivotTables("ピボットテーブル1").RefreshTable Worksheets("ピボット2").PivotTables("ピボットテーブル1").RefreshTable ' 月日で並べ替え' Call sort_by_date End Sub家計簿というシートに支出や収入を1件ずつ、追加していくのだが、追加される度に日付で昇順になるようにコードを書いておく。
Sub sort_by_date() Dim 最終行 As Long Sheets("家計簿").Select ' 最終行 = Range("A3").End(xlDown).Row With ActiveSheet.UsedRange 最終行 = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row End With Range("A2:G" & 最終行).Sort Key1:=Range("A3"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal End Sub支出と収入のラジオボタンがクリックされたら、それぞれに応じた費目がコンボボックスのリストに出るようにしておく。こんな感じだ。
Sub OptionButton1_Click() OptionButton2.Value = False OptionButton1.Value = True ComboBox1.List = Array("食費", "住居", "光熱・水道", "被服", "保健・医療", "教育", "教養・娯楽", "交際", "交通・通信", "貯蓄", "保険", "税金", "その他", "定期代", "薬代") End Sub Sub OptionButton2_Click() OptionButton1.Value = False OptionButton2.Value = True ComboBox1.List = Array("給与", "賞与", "年金", "雑収入", "その他", "前月繰越", "パート代", "アルバイト代") End Sub
これは年月日の増減を行うスピンボタンのコードだ。
Sub SpinButton1_SpinDown() TextBox3.Value = CDate(TextBox3.Value) + 1 End Sub Sub SpinButton1_SpinUp() TextBox3.Value = CDate(TextBox3.Value) - 1 End SubUserForm1が呼び出されたら、今日の日付と費目のリストをセットしておく。
Sub UserForm_Initialize() TextBox3.Value = FormatDateTime(Date, vbShortDate) If OptionButton1 Then '支出の場合' ComboBox1.List = Array("食費", "住居", "光熱・水道", "被服", "保健・医療", "教育", "教養・娯楽", "交際", "交通・通信", "貯蓄", "保険", "税金", "その他", "定期代", "薬代") Else '収入の場合 ComboBox1.List = Array("給与", "賞与", "雑収入", "その他", "前月繰越", "パート代", "アルバイト代") End If End Subこれがおれの家計簿だ。
oreno-kakeibo-menu |
EXCELシートの「家計簿」でユーザフォームUserForm1を呼出すには「データ入力」というボタンを作り、以下のコードを標準モジュールに記述し、myform1をマクロ登録で記述すれば良い。これで「オレの家計簿」の完成た。
Sub myform1() Dim 最終行 As Long UserForm1.Show (vbModeless) Sheets("家計簿").Select End Sub毎月支払というボタンには、毎月支払というシートにあらかじめ作成した項目を一括追加するVBAコードをマクロ登録する。
Private Sub 毎月支払() Dim 最終行 As Long Sheets("毎月支払").Select '最終行 = Range("B1").End(xlDown).Row With ActiveSheet.UsedRange 最終行 = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row End With Rows("2:" & 最終行).Select Selection.Copy Sheets("家計簿").Select '最終行 = Range("A3").End(xlDown).Row + 1 With ActiveSheet.UsedRange 最終行 = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row + 1 End With ret = MsgBox("まこち、追加すっとか?(ctrl+zでん、元に戻らんどー)", vbYesNo) Select Case ret Case vbYes '処理を継続します Case vbNo '処理を終了します Exit Sub End Select Rows(最終行 & ":" & 最終行).Select ' Selection.Insert Shift:=xlDown Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False ' ピボットを自動更新 Worksheets("ピボット").PivotTables("ピボットテーブル1").SourceData = "家計簿!R2C1:R" & 最終行 & "C7" Worksheets("ピボット2").PivotTables("ピボットテーブル1").SourceData = "家計簿!R2C1:R" & 最終行 & "C7" Worksheets("ピボット").PivotTables("ピボットテーブル1").RefreshTable Worksheets("ピボット2").PivotTables("ピボットテーブル1").RefreshTable ' 月日で並べ替え Call sort_by_date End Sub毎月のデータを手作りで2つのピボットテーブルにしてみた。これで、収支管理はバッチリだ。そして、ピボットテーブルを最新化するコードは以下のとおり。これも使いやすくするため、ボタンでマクロ登録しておく。
Sub Update_Pivot_area() Sheets("家計簿").Select '最終行 = Range("A3").End(xlDown).Row With ActiveSheet.UsedRange 最終行 = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row End With Worksheets("ピボット").PivotTables("ピボットテーブル1").SourceData = "家計簿!R2C1:R" & 最終行 & "C7" Worksheets("ピボット2").PivotTables("ピボットテーブル1").SourceData = "家計簿!R2C1:R" & 最終行 & "C7" Worksheets("ピボット").PivotTables("ピボットテーブル1").RefreshTable Worksheets("ピボット2").PivotTables("ピボットテーブル1").RefreshTable End Sub
るんるんモノマネEXCEL VBA 本〜仕事で覚えたEXCEL&VBA小技 BOOK〜 キモの関数、そしてIEを自在に操るVBA。初めはモノマネが一番いい!に戻る