家計簿アプリ

Excel家計簿提供! ~基本機能搭載のマクロ付きExcel家計簿~

家計簿アプリ
スポンサーリンク

Excelでマクロを使った家計簿を作りたい!

けど、どんな感じでマクロを作っていったら良いか分からない!!

そんな方向けに、家計簿の基本機能だけを搭載したExcelマクロ家計簿を作ってみました。

  • このマクロを使ってみて、作りたい機能のイメージを膨らませるも良し
  • このマクロの中身を解読して、自分で作るマクロの参考にするも良し
  • そもそもこれを家計簿として使っていくも良し

色々の活用をしていただけたらと思っています。

ただ、これを配るだけだともったいないので、
どんなことをしているのか分かるように、簡単に中身の解説もしていきたいと思います

【本記事の目標】

基本機能搭載のExcelマクロ家計簿の中身を理解しよう

今回のマクロは、マクロ無し家計簿をベースとして作っているので、所々同じシートを活用している部分があります。
同じシートを活用している部分については、下記投稿で説明していますので、今回は割愛します。
詳しくは下記をご確認ください。



まずは各シートの全体像

まずは各シートの全体像をお見せします。

このExcelマクロは5つのシートでできています。
ただし、基本的に入力していくのは2つのシートだけで、
それ以外は情報を確認するためのシートです。

”入力”シート

”科目情報”シート

”月別グラフ”シート

”月別比較”シート

”年別グラフ”シート

 



各シートごとの使い方・中身を確認

それでは、各シートごとにどういった目的・動き・使い方をするのか説明していきます。

”入力”シートについて詳細

”入力”シートは、その名の通り日々の収支を入力するためのシートです。

このシートは大きく右と左で分かれており、左側で入力したデータが右側に反映されます。
また右側に反映されたデータを修正する場合は、右側を直接修正します。

 



① 青色エリア:データ入力エリア

青色のデータ入力エリアから日々の収支を入力していきます。
入力は、

  1. グレーの領域に情報を入力
     (【日付】【金額】は必須入力、【内容】【メモ】は任意入力)
  2. 勘定科目ボタンの中から該当する勘定科目のセルをダブルクリック

という手順で入力していきます。

上記の手順で情報を入力して勘定科目セルをダブルクリックすると、
記載した情報が右側の『データ保存エリア』に自動的に追記されます。

その後グレーのエリアは白紙に戻り、日付のセルが選択された状態になりますので、
そのまま次の情報を入力していくことが出来ます

ちなみにこの『勘定科目ボタン』は自由に編集することが可能です。
『勘定科目ボタン』を編集する場合は右上の『勘定科目編集』のボタンをクリックします。
クリックすると”科目情報”のシートに移動するので、そこで編集が可能です。
詳細は”科目情報”シートのところで改めて説明していきます。

 



② 緑色エリア:データ保存エリア

緑色のエリアにあるテーブルに、入力したデータがどんどん蓄積されていきます。
このエリアは基本的に何も操作はしませんが、もし入力したデータを修正・編集したい場合は、
このテーブルを直接編集していきます。

ただし修正が可能なのは【日付】【金額】【勘定科目】【内容】【メモ】の5つだけです。
【日付】【金額】【勘定科目】は必須のため空欄は不可です)

それ以外の部分には計算式が入っているため、修正すると正しく動作しなくなるのでご注意下さい。
だだし行を削除することは可能です。
不要なデータは行ごと削除してもらって大丈夫です。

データ保存エリアの修正・編集が不可のエリアには複雑な計算式が入っています。
ただその内容は マクロ無し家計簿 の際に説明したものとほぼ同じものになっています。

気になる方は下記記事をご参照ください。

 



”科目情報”シートについて詳細

”科目情報”シートは、各シートで選択する勘定科目の内容を編集・追加するためのシートです。

このシートの『勘定科目』に記載されている項目が、

  • ”入力”シートの『勘定科目ボタン』
  • ”月別グラフ”シートの勘定科目リスト
  • ”月比較グラフ”シートの勘定科目リスト
  • ”年別グラフ”シートの勘定科目リスト

上記4か所に反映されます。
ただし反映させるためには『勘定科目情報更新』をクリックする必要があります。
内容を編集・追加したら、『勘定科目情報更新』のクリックを忘れずに。

この表も【テーブル】になっていますので、
新しく入力していく場合は表の一番下で、表の外側に文字を入力すれば自動的に表が拡張され、
入力内容を削除する場合は行ごと削除する必要があります。

このシートで、各勘定科目が
 収入/支出(固定費)/支出(変動費) 
どれに相当するのかを分類してあれば、その分類に沿って他のシートで分類してくれます。

 



”月別グラフ”シートの詳細

”月別グラフ”シートは マクロ無し家計簿 の時と全く同じです。

集計できる期間が各月ごとに限定している代わりに、
より詳しく、また視覚的に分かりやすいグラフを複数表示しています。

① 集計結果を表示したい月を入力
  ここで入力した月の集計結果が表示されます。
  このシートで入力する部分はここだけです。

② 収支と固定費/変動費の集計結果
  収支の集計結果と、固定費/変動費の集計結果を表示します。

③ 収支の比較をする棒グラフ

④ 固定費と変動費の比較をする棒グラフ

⑤ 支出の中での固定費/変動費の比率を確認する円グラフ

⑥ 各勘定科目の集計結果一覧
  各勘定科目の集計結果一覧を表示します。
  ”科目情報”シートで勘定科目の修正・追加をした場合は、
  この一覧の左側の『勘定科目』を同じように修正する必要があります。

⑦ 各勘定科目を比較する棒グラフ
  各勘定科目の集計結果を棒グラフで表示します。
  収入はプラス側、支出はマイナス側の棒グラフで表示されます。

⑧ 各勘定科目の金額の大きさを比較する円グラフ
  各勘定科目の金額で円グラフを作ります。
  収入・支出の区別なく、単純に金額の大きさだけを比較するための円グラフです。

⑨ 各勘定科目の支出によって収入がどのように減っているのかを
  視覚的に分かりやすくしたウォーターフォールチャート

”月比較グラフ”、”年別グラフ”シートの詳細

”月比較グラフ”シートは各月の集計結果を表示し、各月ごとの比較ができるようにしてあります。
”年別グラフ”シートは1年間の集計結果を表示し、各年ごとの比較ができるようにしてあります。
どちらのシートも、 マクロ無し家計簿 の”年別グラフ”シートと全く同じ構成です。

”科目情報”シートで勘定科目の修正・追加をした場合
勘定科目の項目自体は、マクロを起動することで自動的に全てのシートに反映されます。
ただしグラフの元データの範囲については手動で変更する必要があるのでご注意ください。

 



マクロの中身を確認

今回紹介したファイルの使い方は以上ですが、せっかくなのでこのファイルに組み込んでいるマクロについてもざっくり説明しておきます。

モジュール・プロシージャの構成

今回のマクロでは4つのモジュールと5つのプロシージャを組んでいます。

  1. モジュール:A0_PublicObject、プロシージャ:F_PublicObjectInOut
  2. モジュール:A1_SingleDataInput、プロシージャ:SingleDataInputStart
  3. モジュール:A2_ListEdit、プロシージャ:ListUpdateOfList5SheetChangeToList5
  4. モジュール:F0_DataOperate、プロシージャ:配列行列変換

またさらに入力シート自体にもプロシージャを組んでおり、セルをダブルクリックしたときだけマクロが起動するようにしています。

  • オブジェクト:Sheet1(入力)、プロシージャ:Worksheet_BeforeDoubleClick

 



1.モジュール:A0_PublicObject

Option Explicit

'========================
'Public変数の定義
'========================

'このブック
Public Book_macro As Workbook

'このブックのシート
Public sh1 As Worksheet
Public sh2 As Worksheet
Public sh3 As Worksheet
Public sh4 As Worksheet
Public sh5 As Worksheet

'このブックのテーブル
Public LO1 As ListObject
Public LO2 As ListObject
Public LO3 As ListObject
Public LO4 As ListObject
Public LO5 As ListObject
Public LO6 As ListObject
Public LO7 As ListObject
Public LO8 As ListObject


'#######################################################
'マクロ起動時に必ず起動させる基本設定

Function F_PublicObjectInOut(ByVal InOut As Boolean)
    '引数がTrueの場合は開始時の設定、Falseの場合は終了時の設定

Select Case InOut

'----------------------------------------------
Case True   '開始時の設定

'マクロ起動を高速化する設定
Application.ScreenUpdating = False              '画面更新を無効化
Application.Calculation = xlCalculationManual   'セルの自動計算を停止(手動計算)

'各種変数の内容を定義
Set Book_macro = ThisWorkbook

With Book_macro
    Set sh1 = .Sheets("入力")
    Set sh2 = .Sheets("科目情報")
    Set sh3 = .Sheets("月別グラフ")
    Set sh4 = .Sheets("月比較グラフ")
    Set sh5 = .Sheets("年別グラフ")
End With

With sh1
    Set LO1 = .ListObjects("家計簿")
    Set LO2 = .ListObjects("収入Table")
    Set LO3 = .ListObjects("固定費Table")
    Set LO4 = .ListObjects("変動費Table")
End With

With sh2
    Set LO5 = .ListObjects("科目情報")
End With

With sh3
    Set LO6 = .ListObjects("月別情報")
End With

With sh4
    Set LO7 = .ListObjects("月比較")
End With

With sh5
    Set LO8 = .ListObjects("年別詳細")
End With

'----------------------------------------------
Case False  '終了時の設定

'マクロ起動の高速化設定を戻す
Application.ScreenUpdating = True                 '画面更新無効化解除
Application.Calculation = xlCalculationAutomatic  '自動計算に戻す

'変数の中身を空に
Set LO1 = Nothing
Set LO2 = Nothing
Set LO3 = Nothing
Set LO4 = Nothing
Set LO5 = Nothing
Set LO6 = Nothing
Set LO7 = Nothing
Set LO8 = Nothing

Set sh1 = Nothing
Set sh2 = Nothing
Set sh3 = Nothing
Set sh4 = Nothing
Set sh5 = Nothing

Set Book_macro = Nothing

'----------------------------------------------
End Select

End Function

このモジュールでは、このマクロ全体で使用するPublic変数の定義や、全てのマクロを起動する際に必ず設定すべき初期設定をするプログラムを記載しています。

上記はマクロ全体で使用するPublic変数の定義です。
基本的にこのExcelファイル自体や、シート・テーブルといったオブジェクトをあらかじめ共通のPublic変数で定義しておけば、複数のプロシージャで都度定義する手間が減りますし、複数のモジュールでマクロを記載するときに定義した変数名が変わらないので混乱しにくくなります

何より、シート名を変更した場合等でマクロを修正する必要が出た場合、マクロ全体を探さなくてもこのモジュールに記載している内容を修正するだけで完了するので、手間も大幅に削減されます。

複雑なマクロを組めば組むほど、共通で使う変数などは専用のモジュール内で定義しておいた方が、後々の修正もしやすくなり効率的になるのでオススメです

 



プロシージャ:F_PublicObjectInOut

上記が、全てのマクロを起動したときに必ず実行させるプログラムです。

マクロを高速に動かすための基本設定(スクリーンアップデートの停止と自動計算の停止)と、Public変数の中身の設定をしています。

上記は、マクロが終了する際に必ず実行させるプログラムです。

マクロを高速に動かすために設定していた部分を元に戻すのと、Public変数として定義していた中身を全て空に戻しています。

基本的にExcelマクロはマクロが終了した際に定義した変数は全て空に戻りますが、念のため空になるように設定しておき、余計なメモリが残らないようにしています。

 



2.モジュール:A1_SingleDataInput

このモジュールでは、”入力”シートで個々のデータを入力した際に起動するプログラムを記載しています。

このモジュール内のプロシージャは、セルをダブルクリックしたときに呼び出されますが、
実際には最初に【Sheet1(入力)】のオブジェクトに記載している、【Worksheet_BeforeDoubleClick】のプロシージャが呼び出されます。

【Worksheet_BeforeDoubleClick】のプロシージャで、ダブルクリックした場所が『勘定科目ボタン』の部分だった時のみ、A1_SingleDataInputのモジュール内のSingleDataInputStartのプロシージャが呼び出されます。

プロシージャ:Worksheet_BeforeDoubleClick

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Call F_PublicObjectInOut(True)

'勘定科目ボタンをダブルクリックしたときだけ起動

'勘定科目ボタンをダブルクリックしたかどうか確認
If Not Intersect(Target, LO2.DataBodyRange) Is Nothing Then
    Call SingleDataInputStart(Target.Value)
ElseIf Not Intersect(Target, LO3.DataBodyRange) Is Nothing Then
    Call SingleDataInputStart(Target.Value)
ElseIf Not Intersect(Target, LO4.DataBodyRange) Is Nothing Then
    Call SingleDataInputStart(Target.Value)
End If

Call F_PublicObjectInOut(False)

End Sub

まずは”入力”シート内をダブルクリックしたときに最初に起動する【Worksheet_BeforeDoubleClick】のプロシージャについてです。

マクロを起動した最初ですので、必ず【F_PublicObjectInOut】のプロシージャを呼び出して初期設定をさせています。

その後、ダブルクリックした場所が『勘定科目ボタン』の部分かどうかの確認をしています。
『勘定科目ボタン』は全てテーブルになっているので、「テーブル内のセルなのかどうか?」で判定をしています。

『勘定科目ボタン』だった場合、ダブルクリックしたセルの値を引数として、SingleDataInputStartを呼び出しています。

 



プロシージャ:SingleDataInputStart

Option Explicit

'#######################################################
'個別データ入力関係

Function SingleDataInputStart(MType As String)

'各種変数定義
Dim InDate As Range     '日付入力セル
Dim InMoney As Range    '金額入力セル
Dim InData As Range     '内容入力セル
Dim InMemo As Range     'メモ入力セル

Dim LastNo As Integer   'データ保存エリアの最終データNo

Dim tempAry1    '配列の仮置き用


Set InDate = sh1.Range("C7")
Set InMoney = sh1.Range("D7")
Set InData = sh1.Range("E7")
Set InMemo = sh1.Range("F7")

'必須項目有無を確認
If InDate.Value = "" Then
    MsgBox "日付が入力されていません"
    Exit Function
ElseIf InMoney.Value = "" Then
    MsgBox "金額が入力されていません"
    Exit Function
    
Else    '必須項目入力済み
    'データ保存エリアの最終データNoを探索する
    tempAry1 = LO1.ListColumns(1).DataBodyRange
    LastNo = UBound(tempAry1, 1)
    
    'データ保存エリアの最終データの次の行にデータを入力していく
    With LO1.DataBodyRange(1, 1)
        .Offset(LastNo, 0).Value = InDate.Value
        .Offset(LastNo, 1).Value = InMoney.Value
        .Offset(LastNo, 2).Value = MType
        .Offset(LastNo, 3).Value = InData.Value
        .Offset(LastNo, 4).Value = InMemo.Value
    End With
    
    'テーブル範囲を再計算
    Dim A0
    With LO1
        A0 = .Range.Find("*", , , , 1, 2).Row - .Range.Row + 1
        .Resize .Range.Resize(A0)
    End With
            
    '入力データを削除
    InDate.Value = ""
    InMoney.Value = ""
    InData.Value = ""
    InMemo.Value = ""
    
    'アクティブセルを移動
    sh1.Select
    InDate.Select

End If

End Function

このプロシージャは必ず【Worksheet_BeforeDoubleClick】から呼び出されるため、すでにマクロ起動時の初期設定をしているはずなので、初期設定をせずに動かします。

上記部分はこのプロシージャ内だけで使用する変数の定義です。
またこの変数に、シートに記載している内容を代入しています。

上記部分で必須項目が入力済みかどうかをチェックしています。
この家計簿は日付が無いと月ごとのデータや年ごとのデータに集計できないので、
日付が必須になります。
また家計簿ですので、金額は必須です。
これらを入力した状態でマクロを起動しないと、メインの部分が動かないようにしています

必須項目が入力されていた場合、データ保存エリアに情報を転記します。
その際、データ保存エリアの最後の行が分からないと転記する場所が分からなくなるので、
データ保存エリアの最終行を確認した後その次の行にデータを転記していきます。

データ保存エリアはテーブルになっているので、テーブルの外にデータを入力すると自動的にテーブルの範囲が拡張されますが、念のため上記のプログラムでテーブル範囲の再確認をしています。

最後に、次のデータを入力しやすいように、入力セルに記入されていたデータを削除し、
カーソルを日付の入力セルに移動させておきます。

ここまでが、日々のデータを入力し蓄積していく、家計簿アプリの一番メインの機能部分になります。

以降のモジュールは、勘定科目を自分用にカスタマイズするために使うマクロ部分です。

 



3.モジュール:A2_ListEdit

このモジュールは、勘定科目の変更をする際のプロシージャを記載しています。
ただし、【SheetChangeToList5】のプロシージャは”入力”シートから”勘定科目”シートの移動だけで、メインとなる部分は【ListUpdateOfList5】です。

プロシージャ:ListUpdateOfList5

'#######################################################
'科目情報を変更したときに、入力シートの勘定科目ボタンを変更
'月別グラフ・年別グラフの勘定科目も修正する

Sub ListUpdateOfList5()
'勘定科目リストの内容を入力シートに反映

'変数の定義
Dim ListAry1    '科目情報の配列
Dim NewListAry1 '並び替え後の科目情報配列(月別グラフ用)
Dim NewListAry2 '並び替え後の科目情報配列(年別グラフ用)
Dim i As Integer    '繰り返し用
Dim j As Integer    '繰り返し用
Dim Num1 As Integer '数値仮置き変数1
Dim Num2 As Integer '数値仮置き変数2
Dim Num3 As Integer '数値仮置き変数3
Dim Num4 As Integer '数値仮置き変数4

'仮置き変数を初期化
Num1 = 0
Num2 = 0
Num3 = 0
Num4 = 0

Call F_PublicObjectInOut(True)

'科目情報テーブルの情報を配列に
ListAry1 = LO5.DataBodyRange

'==================================
'入力シートの勘定科目ボタンを修正
'==================================

'入力シートの勘定科目ボタンを全て削除
LO2.DataBodyRange.ClearContents
LO3.DataBodyRange.ClearContents
LO4.DataBodyRange.ClearContents

'科目情報の配列を1つずつ確認して勘定科目ボタンに割り振っていく
For i = LBound(ListAry1, 1) To UBound(ListAry1, 1)
    If ListAry1(i, 1) = "収入" Then
        LO2.DataBodyRange(1, 1).Offset(Num1, 0).Value = ListAry1(i, 2)
        Num1 = Num1 + 1
    ElseIf ListAry1(i, 1) = "固定費" Then
        LO3.DataBodyRange(1, 1).Offset(Num2, 0).Value = ListAry1(i, 2)
        Num2 = Num2 + 1
    ElseIf ListAry1(i, 1) = "変動費" Then
        LO4.DataBodyRange(1, 1).Offset(Num3, 0).Value = ListAry1(i, 2)
        Num3 = Num3 + 1
    End If
Next i

'テーブル範囲を再計算
Dim A0
With LO2
    A0 = .Range.Find("*", , , , 1, 2).Row - .Range.Row + 1
    .Resize .Range.Resize(A0)
End With

With LO3
    A0 = .Range.Find("*", , , , 1, 2).Row - .Range.Row + 1
    .Resize .Range.Resize(A0)
End With

With LO4
    A0 = .Range.Find("*", , , , 1, 2).Row - .Range.Row + 1
    .Resize .Range.Resize(A0)
End With


'==================================
'月別グラフ・月比較グラフ・年別グラフを修正
'==================================

'科目情報の並び替え。収入→固定費→変動費の順に並び変える
'並び替え後のリストを入れる動的配列を準備
ReDim NewListAry1(1 To 1, 1 To 1)
ReDim NewListAry2(1 To 3, 1 To 1)

'入力シートの勘定科目ボタンを活用して並び替え
Num4 = 1
For j = 1 To 3
    Select Case j
        Case 1  '収入
            ListAry1 = LO2.DataBodyRange
        Case 2  '固定費
            ListAry1 = LO3.DataBodyRange
        Case 3  '変動費
            ListAry1 = LO4.DataBodyRange
    End Select
    For i = LBound(ListAry1, 1) To UBound(ListAry1, 1)
        If Num4 > UBound(NewListAry1, 2) Then
            ReDim Preserve NewListAry1(1 To 1, 1 To Num4)
            ReDim Preserve NewListAry2(1 To 3, 1 To Num4)
        End If
        NewListAry1(1, Num4) = ListAry1(i, 1)
        NewListAry2(3, Num4) = ListAry1(i, 1)
        Select Case j
            Case 1  '収入
                NewListAry2(1, Num4) = "収入"
            Case 2  '固定費
                NewListAry2(1, Num4) = "支出"
                NewListAry2(2, Num4) = "固定費"
            Case 3  '変動費
                NewListAry2(1, Num4) = "収入"
                NewListAry2(2, Num4) = "変動費"
        End Select
        Num4 = Num4 + 1
    Next i
Next j

'並び変えた配列を行列変換
NewListAry1 = 配列行列変換(NewListAry1)

'月別グラフのテーブルの大部分を削除(関数を残すため1行だけ残す)
sh3.Rows("6:100").Delete Shift:=xlUp

'月別グラフのテーブルに貼り付け
LO6.DataBodyRange.Resize(UBound(NewListAry1, 1), 1).Value = NewListAry1

'月別グラフのテーブル範囲を再計算
With LO6
    A0 = .Range.Find("*", , , , 1, 2).Row - .Range.Row + 1
    .Resize .Range.Resize(A0)
End With

'月比較グラフシートに貼り付け
sh4.Range("J3").Resize(UBound(NewListAry2, 1), UBound(NewListAry2, 2)).Value = NewListAry2


'年別グラフシートに貼り付け
sh5.Range("H3").Resize(UBound(NewListAry2, 1), UBound(NewListAry2, 2)).Value = NewListAry2

'入力シートに移動
sh1.Select
sh1.Range("C7").Select

Call F_PublicObjectInOut(False)

End Sub

このプロシージャは、”勘定科目”シートの中の、『勘定科目情報更新』のボタンをクリックしたときに起動するプログラムです。
マクロを起動した時点で”勘定科目”シートのテーブルに記載されている内容が各種シートに反映されるので、勘定科目情報を変更する場合は『勘定科目情報更新』のボタンをクリックする前に変更をする必要があります。

それではプロシージャの中身を見ていきます。

最初はこのプロシージャ内でのみ使う変数の定義です。
このプロシージャ内で一時的に使う数値あるので、数値を仮置きする用の変数を4つ準備しています。
この4つの変数は使わない場合は0にしておく必要があるため、最初に全て0を代入します。

また、マクロ起動時の初期設定プロシージャの呼び出しCall F_PublicObjectInOut(True))についても行っています。

さらにこのプロシージャで使う情報は、科目情報テーブルの内容だけなので、ひとまず科目情報テーブルの内容を配列(ListAry1)に入れています

“入力”シートの勘定科目ボタンを修正するために、一旦勘定科目ボタンの内容を白紙にします。

その後、配列に入れた科目情報テーブルの内容に沿って、勘定科目ボタンを1つずつ追加していきます

勘定科目ボタンは【収入】【固定費】【変動費】がそれぞれテーブルになっているので、追加した情報に合わせてテーブル範囲を再計算させておきます。

 



ここから、月別グラフ・月比較グラフ・年別グラフの勘定科目を修正していきます。

それぞれのグラフの勘定科目は、収入→固定費→変動費の順に並んでいるので、
”入力”シートに新しく作り直した勘定科目ボタンの情報を、収入→固定費→変動費の順に取り出して配列(NewListAry1, NewListAry2)に入れていきます。
NewListAry1の配列には勘定科目だけの内容を入れますが、
NewListAry2の配列には 収入 or 支出 、 固定費 or 変動費 の内容も入れるため3行の配列になっています。

NewListAry1, NewListAry2の配列はどちらも動的配列になっており、勘定科目ボタンの数に合わせて配列サイズを変えられるように1行もしくは3行の横長の配列になっています。
二次元動的配列で配列内データを残してサイズを変更する場合は、列の追加しかできないため
”月比較グラフ”、”年別グラフ”については勘定科目を記載している部分が横長なのでそのままで問題ないですが、”月別グラフ”については勘定科目が縦長に並んでいるため、NewListAry1の配列を行列変換する必要があります。

行列変換する方法はいくつかありますが、ここでは行列変換するための自作の関数を作って変換しています。(※【配列行列変換】という関数
この関数は、F0_DataOperateのモジュールに記載しています。

配列の準備が出来たら、後はそれを貼り付けるだけです。
”月別グラフ”には行列変換したNewListAry1の配列を貼り付けます。

ただ、貼り付ける場合は元のデータを一旦削除する必要があるので、
一旦削除した後に配列を貼り付けています。

”月比較グラフ”、”年別グラフ”に関しては行列変換していないNewListAry2の配列を貼り付けます。
こちらはテーブルになっていないので、貼り付けるだけにしています。

最後に”入力”シートに戻って、マクロ終了時の動作(Call F_PublicObjectInOut(True))をして終了です。

 



プロシージャ:SheetChangeToList5

このプロシージャの動きは非常に単純で、”入力”シートから”科目情報”シートに移動するだけです。
このマクロは”入力”シートの『勘定科目編集』のボタンをクリックしたときに起動するようにしています。

 



モジュール:F0_DataOperate

このモジュールは、自作の関数を置いておくためのモジュールです。
今回は、上記で使用した配列の行列変換をする関数を置いています。

プロシージャ:配列行列変換

Option Explicit

'#######################################################
'使い勝手の良い自作関数

Function 配列行列変換(InputAry As Variant)
'配列を行列変換して返す

Dim i, j
Dim StartR, StartC, EndR, EndC
Dim tempAry1
StartR = LBound(InputAry, 1)
StartC = LBound(InputAry, 2)
EndR = UBound(InputAry, 1)
EndC = UBound(InputAry, 2)

ReDim tempAry1(StartC To EndC, StartR To EndR)

For i = StartR To EndR
    For j = StartC To EndC
        tempAry1(j, i) = InputAry(i, j)
    Next j
Next i

配列行列変換 = tempAry1

End Function

この自作関数は引数に二次元配列を指定すれば、行列変換した配列を出すようにしています。

行列変換の手順は非常に単純で、

  1. 引数に入れた配列のサイズ(行と列)を確認
  2. そのサイズの行と列を入れ替えた空の配列を準備
  3. 行と列それぞれ最初から最後まで繰り返し確認をしていき、
    空の配列に行列を入れ替えた状態で代入していく
  4. 最後に、代入後の配列を返して完了

という流れで動いています。

 



ダウンロード

今回紹介したExcelファイルは、下記リンクからダウンロードが可能です。
できる限り全てを紹介したつもりですが、細かい部分については
実際にダウンロードしてご確認いただけたらと思います。

 



コメント

タイトルとURLをコピーしました