●今までプログラミングなんかに触れたことが無くて
「今更そんなの使いこなせるわけない」と思っている方
●小学校でプログラミングが必修科目になり、
子どもに「ここ分からないから教えて~」と言われても
「無理!!」と言うしかなくて困ったお父さん・お母さん
そんなプログラミング全くの初心者に向けて、
「こうやったら自動で動くソフト(Excelマクロ)が作れるんだ!」
というのを理解していただくように、
ゼロからソフトを作っていく過程を紹介していきたいと思います。
Windowsのパソコンがあれば大抵標準装備されているExcelを使って紹介しますので、
この投稿のシリーズを最後まで読んでいただければ、
また、投稿を読みながら実際に一緒にソフトを作っていっていただければ、
「自分で実際にソフトを作ることができて、プログラミングに少し自信がついた!」
と思ってもらえるかと思いますので、是非とも一緒に手を動かしてみてください。
【本記事の目標】
シートの複製・操作について知ろう
それでは、4つ目の動きのコードを書いていきます。
1.金額を入力して勘定科目を選択したら、リストに自動で記入する。
2.記入したリストを自動的に集計する。
3.集計した結果から、今月使った割合が多い項目が何かわかるようにグラフ化する。
4.翌月の内容を記入する際は、自動で新しい白紙のリストを作成して記入していく。
5.毎月の集計結果を集めて、毎月の家計の変化がわかるグラフを作る。
6.毎月の集計結果をさらに集計し、その年使った割合が多い項目がわかるようにグラフ化。
1つ目~3つ目の動きを確認されていない方は、過去の投稿もご確認ください。
シートの操作について
シート操作のイメージを考える
その3までに作ってきたシートは、各月ごとのデータを入力することをイメージして作ってきました。
ただ、家計簿は1カ月分を入力して終わりではなく、それを毎月続けてこそ意味があります。
なので、このシートに毎月毎月入力していくことになります。
毎月毎月入力していくためには、このシートを毎月複製して、今入っているデータを白紙に戻す、という操作が必要です。
この部分をより具体的に書いてみましょう。
- このシートが何年何月のものかを入力する
- シートを複製する
- 複製したシートの名前を、入力した「何年何月」に変える
- 複製元のシートにデータが残っているので、データを消す
それではこの内容を順番に作っていきましょう。
シート操作の動きを作っていこう
シートの「年」「月」を入力する場所を用意する
まずは「1.このシートが何年何月のものかを入力する。」部分を作りましょう。
これについては入力するだけなので、わかりやすい部分に記入欄を作っておくだけでOKです。
今回はグラフの上あたりに入力する欄を作っておきます。
この時、1つのセルに『2022年』や『2022年11月』と記入しない方が良いです。
このような書き方をしてしまうと、この部分が【文字列】として認識されてしまい、
【数字】としての計算ができなくなってしまいます。
【数字】として計算することが全く無い場合は問題ないですが、
例えば今回の場合、「シートの複製をするたびにその月+1の数字を記入する」といったコードを入力しておけば、最初に手動で入力すれば、以降はここを入力する必要が無くなり、
より効率が良いアプリが作れるようになります。
【数字】として計算する可能性があるものについては、
数字だけをセルに記載するのをオススメします。
数字だけを入力して「年」「月」がわかるようにする表現の方法は、
上で書いているように4つのセルを使って表現するだけでなく、
他にもいくつか方法があります。
1.セルの書式設定を変える
セルの書式設定を変更することで、数値しか入力していないのに、「年」「月」を表示させることができます。
例えば、「年」の値を入力するセルを選択して、右クリック⇒セルの書式設定
書式設定画面で、表示形式 ⇒ ユーザー定義 ⇒ 種類欄に『0 年』と入力し、OKをクリック。
すると、セルには「2022」としか入力されていないのに、「2022年」と表示される。
2.「年/月/日」を1か所に入力し、そこから「年」「月」を取り出す。
年/月/日という形でセルに入力すると、日付のシリアルナンバーという形でセルの中にデータが入ります。セルの表示は年/月/日となっていますが、裏はシリアルナンバーとして認識されています。
このシリアルナンバーは【数値】ですので、計算が可能です。また、Excel関数を使うことでここから「年」だけ、「月」だけを取り出すことも可能です。
「年」を取り出す関数は
=Year([年/月/日で入力したセル])
「月」を取り出す関数は
=Month([年/月/日で入力したセル])
です。
この関数を使えば、入力セルを1か所だけに指定することができます。
あとはセルの書式設定から、表示形式を「0年」、「0月」に変更すれば、
1つのセルの内容を変えるだけで「年」「月」を表示することができます。
シートを複製する
「年」「月」を入力する欄ができれば、次は「2.シートの複製」の部分を作っていきます。
シートの複製は非常に簡単で、
ThisWorkbook.Sheets(“入力”).Copy
と入力すれば「入力」のシートが複製できます。
このときに、[Copy]の後ろにAfter、Beforeと入力してシートを指定してあげると、そのシートのすぐ後ろもしくはすぐ前にシートが複製されます。
(例)
ThisWorkbook.Sheets(“入力”).Copy After:=ThisWorkbook.Sheets(“入力”)
⇒ 「入力」シートの後ろにシートを複製
ThisWorkbook.Sheets(“入力”).Copy Before:=ThisWorkbook.Sheets(“入力”)
⇒ 「入力」シートの前にシートを複製
シートの複製はこれだけです。
では実際に新しいモジュールと新しいプロシージャを用意して、このコードを入力してみましょう。
■モジュール名:CheetCopyCode
■プロシージャ名:Sub SheetCopy1
入力ができたら、一度実際に動かしてみましょう。
この画面からマクロを実行するには、Sub~End Subの間にカーソルがある状態で『F5』を押す、もしくはツールバーにある再生ボタンをクリックします。
するとこのプロシージャのマクロが実行されます。
このマクロを起動すると下記のように、元のシートの後ろにシートが複製されているはずです。
複製したシートの名前を、入力した「何年何月」に変える
シートを複製したとき、何も指定しなければ元のシート名に連番が付いた状態になっています。
ただ、これだと分かりにくいので「3.複製したシートの名前を、入力した「何年何月」に変える」というコードを加えていきます。
シートの名前を変えるときは、.Nameというプロパティにシート名を入力することで変更できます。
シートを複製した直後は複製したシートが【アクティブ】状態になっているので、
シート複製のコードのすぐ後に下記コードを入力すると、複製されたシート名が「テスト」という名前になります。
(例) ActiveSheet.Name = “テスト”
この時の「テスト」の部分を変えることで、複製されたシートに好きな名前を入れることができます。
今回は『○年○月』と入力していきたいです。
年数は【I1】、月数は【K1】のセルに記入されています。
なので【I1】セル、【K1】セルの値を抜き出して、『○年○月』という文字を作って、
上記の例にならったコードを入力すれば、複製したシートの名前を『○年○月』にできます。
実際に書いてみると、下記のようになります。
Option Explicit
Sub SheetCopy1()
'シートの複製
Dim YearInput As Integer
Dim MonthInput As Integer
With ThisWorkbook.Sheets("入力")
YearInput = .Range("I1").Value
MonthInput = .Range("K1").Value
End With
ThisWorkbook.Sheets("入力").Copy After:=ThisWorkbook.Sheets("入力")
ActiveSheet.Name = YearInput & "年" & MonthInput & "月"
End Sub
これで複製したシート名が『○年○月』という名前に変わりました。
『○年○月』の文字を作るため、上記コードでは
YearInput & “年” & MonthInput & “月”
と書いています。
ここで【&】がありますが、これは文字列をつなげるための演算子です。
数字の演算子だと「+、ー、×、÷」が思い浮かぶかと思いますが、
これらは数字にしか使うことができません。
しかし、文字列に使う演算子は文字列にしか使えない、なんてことはなく、
数字でも文字列でもどちらでも使えます。
複製元のシートにデータが残っているので、データを消す
『○年○月』のシートは記録として残していきますが、『入力』のシートは翌月以降も入力していくことになります。
しかし今『入力』のシートにはもともと入力していたデータが残ってしまっています。
ですので、「4.複製元のシートにデータが残っているので、データを消す」とうコードを書いていきます。
データとして入力されているのは、『入力』シートだと「収支」~「支出金額」の部分ですので、【A4:D10000】の領域に記載されているデータを消すコードを書いていきます。
データを消すコードは、領域のコマンドの【Clear】を実行するだけで可能です。
ただ、Clearにもいくつか種類があるので、用途によって使い分ける必要があります。
(例)
ThisWorkbook.Sheets(“入力”).Range(“A4:D10000”).Clear
Clearの種類と削除の仕方の一覧表は下記の通りです。
コマンド | 削除の方法 |
Clear | セル自体を削除する。削除後は、基本的に左に詰める。 |
ClearComments | セルにつけてある「コメント」を削除する。 |
ClearContents | セルに入っているデータを削除する。 |
ClearFormats | セルの書式設定を初期化する。 |
ClearHyperlinks | セルのハイパーリンクを削除する。 |
ClearNotes | セルの「コメント」を削除する。 |
ClearOutline | アウトラインを削除する。 |
今回はデータさえ削除ができれば、セル自体を削除して上下左右に詰める、ということをしなくてもいいので、今回は【ClearContents】を使います。
ThisWorkbook.Sheets(“入力”).Range(“A4:D10000”).ClearContents
このコードを、シートの複製後に追記すればOKです。
出来上がったコード
最終的に出来上がった、シートの複製に関するコードは下記です。
Option Explicit
Sub SheetCopy1()
'シートの複製
Dim YearInput As Integer
Dim MonthInput As Integer
With ThisWorkbook.Sheets("入力")
YearInput = .Range("I1").Value
MonthInput = .Range("K1").Value
End With
ThisWorkbook.Sheets("入力").Copy After:=ThisWorkbook.Sheets("入力")
ActiveSheet.Name = YearInput & "年" & MonthInput & "月"
ThisWorkbook.Sheets("入力").Range("A4:D10000").ClearContents
End Sub
あとはシート上にボタンを作って、マクロの登録をすれば、シート複製に関するマクロは完成です。
しかしこの状態だと1つ重大な欠点があります。
その欠点と対策については、次の記事で書いていきます。
コメント