【ExcelVBA】コードを読みやすいリーダブルコードに改善しよう!【ユーザーフォーム】

Excel

「栄養計算ソフトにユーザーフォームを導入しよう」の連載第6回です。

以下の記事の続きになります。

【ExcelVBA】ユーザーフォームにエラー処理を実装しよう!【ユーザーフォーム】
「栄養計算ソフトにユーザーフォームを導入しよう」の連載第5回。ExcelVBAのユーザーフォームを栄養計算ソフトに導入します。今回はユーザーフォームを使用する際にありがちなエラーについて、その対策を行います。

前回は、食品入力時の問題点を列挙し、それに対する改善策をご紹介しました。今回は、コードの可読性を高め、またメンテナンスもしやすいようにコードを改善していきたいと思います。

リーダブルコードのメリットは?

読みやすく、保守性の高いコードのことを「リーダブルコード」といいます。今回は、今までに書いてきたコードを整理し、リーダブルコードになるように改善していきます。そこでまずは、リーダブルコードのメリットを紹介します。

変更にも柔軟に対応できる

リーダブルコードを書くことで、急な変更などにも柔軟に対応することができます。

たとえば消費税率です。消費税率をコードの中に使用していると、消費税率が変更になるたびにその部分を見つけ出し、修正する必要があります。その際に、リーダブルコードで書いていれば修正もすぐに済むでしょう。消費税率を定数化しておけば、それを変更するだけで済む話です。

また、元号なども、消費税率と同様に、変更のたびにメンテナンスが必要となる項目です。しかしこちらも、リーダブルコードで書いていると、修正の手間が少なくて済むようになります。

コードを使いまわせる

また、リーダブルコードで書くことで、コードを使い回せるようになります。

コードを書いた自分自身や他人が、そのコードを簡単に読めると、初めからそれを書く必要はなくなりますよね。同じ処理をしているのであれば、始めから書くよりも、すでに書いたコードを使いまわしたほうが手間は少なくなります。

つまり、開発に伴う速度が早くなります。すでに書いたコードはデバッグの必要性が少ない場合もあるので、その点でもメリットが多くなります。

バグの原因を特定しやすい

リーダブルコードで書くことで、バグの原因を特定しやすくなります。

これは、読みやすいコードを書くことで、バグの原因となる部分が明白になるためです。読みにくく、整理されていないコードがずらずらと書かれていたら、当然、バグの原因となる部分は見つけにくくなります。

開発を効率的にバグを発見しやすくするためにもリーダブルコードは必要なのです。

 

実際に改善していこう

では、実際にコードをリーダブルとすべく、改善していきましょう。

数値や文字列を定数化しよう

手始めに、数値や文字列を定数化していきましょう。

今回書いたコードでは、数値が、それが何を示すのかがパット見でわからないものがあります。たとえば以下の部分。

ここでは、For~Nextステートメントを1から18までループさせています。しかし、その1と18が何を示しているのかが分かりづらいです。そのため、こういった部分を定数化していきます。

今回使用する定数は、他のフォームなどでも使用します。そのため、Public定数として、他のモジュールなどからでも使用できるようにします。「挿入」→「標準モジュール」の順にクリックし、「Module1」の先頭に以下のコードを記述してください。

意味が分かりづらくなっている数値や文字列を定数として宣言しました。そのほか、シート名も定数としました。こうすることで、もしシート名を変更したくなったという場合でも、定数の部分を変更することでそれを達成できるようになります。

では、これらの定数を使用して、現在のコードを書き換えて行きましょう。

まずはフォーム開始時の処理から

 

次は反映ボタンを押した際の処理について。

 

次は追加ボタンを押した際の処理について

今回変更した部分はハイライトされています。

特段、説明の必要はないかもしれませんが、反映ボタンを押した際の処理の10-11行目にmainLastRowという変数を宣言し、値を格納しています。これは、本表シートの最終行を示す行番号を示しています。

mainLastRow = Worksheets(WSNAME_MAIN).Cells(Rows.Count, 1).End(xlUp).Row

では、本表シートのセル:一番下の行の1列目から上に移動し、値があった場所の行番号をmainLastRowに格納しています。

Rows.Countというのは、エクセルのアプリケーション上の行の数、つまりエクセルシートを一番下まで移動した際の行番号を示しています。1048576がそれですね。

そこから、End(xlUp)で上方向に移動しています。Ctrl+↑を押した際と同じ動きです。

そして、その場所の行番号を取得しています。

こうすることで、本表シートに食品を追加したりした際に、最終行が変更になったとしても、対応することができます。これが、メンテナンスしやすい、変更に強いコードですね。

 

コメントを追加しよう

読みやすいコードとすべく、コメントを追加していきましょう。

特に、今回定数化しなかったけど、任意の数字が使われている部分なんかは、時間を置いて後から読み直した際に、すぐに意味がわからないかもしれません。なので、そういった部分にコメントを付けておきます。

 

 

Withステートメントで処理をまとめよう

最後は、Withステートメントを用いて、コードを美しくまとめます。

以下のように変更すればOKです。

 

まとめ

今回はコードを読みやすく、かつメンテナンスもしやすいようにコードに改善を加えました。まだまだ改善できる点はありますが、今のところはこれでよいでしょう。次回は、検索して食品を入力するフォームの処理を記述していきます

 

連載目次

  1. ユーザーフォームを始める最初の1歩
  2. フォームを設置→開くをやってみよう!
  3. リストボックスからシートに食品を追加してみよう!
  4. オプションボタンから動的にリストボックスの内容を変更しよう!
  5. ユーザーフォームにエラー処理を実装しよう!
  6. コードを読みやすいリーダブルコードに改善しよう!
  7. 食品成分表から検索→食品入力をしてみよう!
  8. 栄養計算ソフト+ユーザーフォームの完成!DLも可