簡単なExcelVBAで「家計簿&資産管理ができる家計をまるっと管理」開発編②

マクロ開発

どうも!Komugiです

この記事では

「家計簿&資産管理ができる家計をまるっと管理」の

開発編①に引き続き開発編(実際に作ってみよう)②です。

ご自分のスキルにしていただいて、転職が成功出来ますように!

開発編②を始める前に

簡単なExcelVBAで「家計簿&資産管理ができる家計をまるっと管理」開発編①がまだの方はこちら

この段階ではExcelにVBAのコードが書ける状態になっていることが必須です。
もしまだの場合は「Excelで「VBA」プログラミングができる状態を用意する!」を参考にExcelの設定をお願いします。

開発を行う前にシステム開発工程をご確認いただく場合はこちら
システム開発を行う工程はここから確認できます!

要件定義(何を作るか考えよう)がまだの方はこちら

詳細設計(どんなものがいるか考えよう)がまだの方はこちら

実際にプログラムコードを書く前に

プログラムの動きを再確認します

  1. 「メイン」シートの、C11セルからF11セルにデータを手入力
  2. 「追加」ボタンをクリック
  3. 「メイン」シートのC11セルからF11セルのデータを「家計簿」シートの最終行に転記

どのようにコードを書くかをイメージします

どのようにコードを書くかイメージしていきましょう。
プログラムの動きを理解し、イメージをコードに落とし込むことで、よりスムーズに開発を進めていけます。

プロシージャとは
  Sub ○○()~End SubまたはFunction ○○()~End Functionなどの、
  マクロの実行単位です。
モジュールとは
  プロシージャを書く場所です。

ステップ① モジュールの名称を変更
ステップ② プロシージャを記述
ステップ③ 変数を決定

上記のステップ①からステップ③を「開発編①」としてお伝えしました。
ここまでで、プログラムを構成する基本的な準備が整います。

ステップ④以降では、プログラムの動きをイメージし、それぞれのステップをコードとして具体化していきます。

ステップ④ Excelシートを変数に代入
ステップ⑤ 「家計簿」シートの最終行の1行下を取得

ステップ⑥ 「メイン」シートの入力データを「家計簿」シートの最終行に転記
ステップ⑦ 完了メッセージを表示

合計でステップ⑦に分けて、コードを書いていきます。
それぞれのステップをしっかりと理解し、進めていくことで、プログラムは思い描いた通りに動くようになります。
開発編②ではステップ④とステップ⑤をお伝えしていきます。

開発編②の始まり始まり!

次もがんばるぞ〜!

開発編②

ステップ④「Excelシートを変数に代入」しましょう

値とオブジェクトを入れる変数の違いについて

変数に値を格納するときは「変数名 = 値」とします。
これは、右側の値を左側の変数名に代入するという意味で「変数名 ← 値」のようなイメージです。
長整数型(Long)や文字列型(String)とは違い、「Set」を使って何かを代入している場合は、オブジェクトを格納するオブジェクト変数です。

オブジェクト変数は「As オブジェクト名」のように、オブジェクト名を使ってデータ型を指定をします。
ワークシート(Worksheetオブジェクト)を格納する変数なら「As Worksheet」、ブック(Workbookオブジェクト)を格納する変数なら「As Workbook」、セル(Rangeオブジェクト)を格納する変数では「As Range」のようにデータ型を指定をします。
また、すべてのタイプのオブジェクトを表すObjectを使って、どんなオブジェクトでも格納できるオブジェクトの変数は「As Object」と指定します。

変数に関しての詳細説明はこちら

今回は「メイン」シートと「家計簿」シートを代入したいので、以下のようにモジュールに記述します。

Set wsMain = ThisWorkbook.Sheets(“メイン”)
Set wsHousehold = ThisWorkbook.Sheets(“家計簿”)

では、記述内容を詳しく解説します。

・Set wsMain = ThisWorkbook.Sheets(“メイン”)
  Excelの「メイン」シートを変数のwsMainに代入
・Set wsHousehold = ThisWorkbook.Sheets(“家計簿”)
  Excelの「家計簿」シートを変数のwsHouseholdに代入

ThisWorkbookとは
 現在のブックを参照という意味です。
  ThisWorkbookは、VBAコードが実行されているブックを常に指します。
 これにより、他のブックが開いている場合でも、
 正確にコードを実行しているブックにアクセスできます。

追記後のモジュールは以下のようになります。

コードにコメントを残しておくと、何を書いたかが後から確認しやすくなります。
書き方は冒頭に「’」をつけて「’シートの設定」のように内容を記載して下さい。

ステップ⑤「「家計簿」シートの最終行の1行下を取得」しましょう

「家計簿」シートに日々の家計簿データを累積して保存します。
その為、転記する際に過去のデータを上書きしてはいけないため、データが転記されている最終行の1行下を取得します。
取得した行数は変数のnextRowに格納したいため、以下のようにモジュールに記述します。

‘ 家計簿シートの次の空行を取得
nextRow = wsHousehold.Cells(wsHousehold.Rows.Count, 1).End(xlUp).Row + 1

では、コードを分解して内容を詳しく解説します。

wsHousehold
  「家計簿」シートを指しています。
  wsHouseholdはワークシートオブジェクトで、「Set」で
  「家計簿シートが代入されています。
wsHousehold.Cells(wsHousehold.Rows.Count, 1)
  ・wsHousehold.Rows.Count
    これはシートの総行数を表しています。
    通常、Excelでは行数が1048576行あります
    (Excel 2007以降のバージョン)。 
    **Cells(wsHousehold.Rows.Count, 1)**は、
    シートの一番下の行の最初の列、つまりA列の最後のセルを指します。
  ・.End(xlUp)
    この部分は、A列の一番下のセルから上方向に向かって
    最初にデータが入力されているセルを探します。
    この操作は、Excel上のキーボード操作で[Ctrl] + [↑]を
    押す動作と同じです。
.Row
  .End(xlUp).Rowは、下から上に向かって見つけた最初のデータがある
  セルの行番号を取得します。
+ 1
  最後に、見つけたデータのある行の1つ下の行番号を得るために
  1を足します。
  この行番号が新しいデータを書き込むための「次の空いている行」になります。

このコードを図で表すとこのようになります

このコードによって、「家計簿」シートのA列で最初に見つかる空白行を見つけ出し、そこに新たなデータを書き込むセルを特定しています。
家計簿のように、過去のデータがすでに存在する場合に、新しいデータを追加する最適な空き場所を見つけるのに役立ちます。

最終行+1の手法はよく使う方法です!
覚えておくのもいいかもしれませんね。

なるほどー!

Withステートメントでワークシートの変数を重複して記述しない方法

 nextRow = wsHousehold.Cells(wsHousehold.Rows.Count, 1).End(xlUp).Row + 1
 ではワークシートの変数「wsHousehold」が2回記述されています。
 以下のようにWithステートメントを利用すれば、
 「wsHousehold」を何度も記述する必要はありません。

 書き方は以下のように記述します。
 With wsHousehold
  nextRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
 End With


 このように記述することで、省略できて何度も同じ変数を書かなくてよくなります!
 Withステートメントを使ったときは、終わりにEnd Withをお忘れなく!

開発編②のまとめ

ここまでの内容について、ご理解できましたでしょうか。
オブジェクトを代入、最終行+1行下を取得について詳しく解説しました。
これらの基本を何度も見直すことで、理解が深まるだけでなく、プログラミングに対する自信も増えてきていることと思います。
プログラミングは、一つ一つのステップを丁寧に理解していくことがとても大切です。
それにより、今後のスムーズな開発につながっていきます。
次のステップとして「開発編③」もぜひご覧ください。
さらに学習することで、あなたのスキルが一層強化され、転職成功出来ること間違いなしです。

最後まで見ていただき有難うございます。引き続きプログラミングの素晴らしさをお伝えさせていただきます!

コメント

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