【ExcelVBA】栄養計算ソフト+ユーザーフォームの完成!DLも可【ユーザーフォーム】

Excel

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

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

【ExcelVBA】食品成分表から検索→食品入力をしてみよう!【ユーザーフォーム】
「栄養計算ソフトにユーザーフォームを導入しよう」の連載第6回。ExcelVBAのユーザーフォームを栄養計算ソフトに導入します。今回は食品成分表から食品を検索し、それをシートに入力する処理を実装したいと思います。

前回は、検索から食品を入力するための処理を実装しました。今回は、エラー処理の実装やコードの細かい改善などを行い、一応の完成としたいと思います。

ではいきましょう。

同じ処理をまとめよう

まずは、コード内で同じ処理を行っているところを、1つのコードにまとめてしまいましょう。こうすることで、もしコードを変更する際でも、1つの場所にコードを変更するだけで良くなります。

もし同じコードが2つの場所に存在していて、それらのコードの一部を変更したいとなった場合、2つの場所を変更しなくてはならず、メンテナンスが面倒になります。またそれだけでなく、同じコードが存在していることを忘れてしまっている場合などは、バグが発生する原因にもなってしまうのです。

今回の実装した処理の中では、それぞれのフォームにおける、食品をシートに入力するための、追加ボタンを押した際の処理は同じものですね。これを1つにまとめてしまいましょう。以下の手順で行ってください。

①フォームから利用するコードを標準モジュールに追加しよう

複数のフォームから利用するためのコードは、標準モジュール内に記述するのが一般的です。そのため、今回も、標準モジュールに記述することにします。以下のコードを、標準モジュールに追加してください。食品を追加するためのコードをaddFoodというプロシージャで記述しています。

Sub addFood(foodNum)
    If ActiveCell.Row > NCS_START_ROW Then
        MsgBox "項目行より下を選択してください", vbCritical, "注意"
        Exit Sub
    End If
    Cells(ActiveCell.Row, NCS_FOODNUM_CLM).Value = foodNum
    ActiveCell.Offset(1, 0).Activate
End Sub

②フォーム側からコードを呼び出す処理を記述しよう

フォームのボタンを押した際に、手順1でまとめた処理を呼び出すようにします。プロシージャは、Call プロシージャ名() で呼び出すことが可能です。すでに以下のコードが書かれているかと思います。

Private Sub btnAdd_Click()
    If ActiveCell.Row < NCS_START_ROW Then
        MsgBox "項目行より下を選択してください", vbCritical, "注意"
        Exit Sub
    End If
    Dim foodNum As String
    foodNum = Left(lstFood.Value, 5) '左から5文字が食品番号
    Cells(ActiveCell.Row, NCS_FOODNUM_CLM).Value = foodNum
    ActiveCell.Offset(1, 0).Activate
End Sub

これを、以下のコードに変更してください。

Private Sub btnAdd_Click()
    Dim foodNum As String
    foodNum = Left(lstFood.Value, 5) '左から5文字が食品番号
    Call addFood(foodNum)
End Sub

作成したフォームの両方に該当箇所がありますので、そちらも変更しましょう。

エラー処理を実装しよう

次にエラー処理を実装します。

食品リストが未選択→エラー発生!

具体的には、食品リストが選択されていない状態で追加ボタンを押してしまった際には、エラーが発生していまいますので、その際の処理を記述します。

これは、変数foodNumに格納すべき値が存在しないため、それを処理しようとしてエラーが発生してしまっているのです。

そのため、そのような状況に対処するための処理を実装しましょう。

btnAdd_Clickを書き直そう

btnAdd_Clickを以下のように変更してください。

Private Sub btnAdd_Click()
    If IsNull(lstFood.Value) = True Then
        MsgBox "食品を選択してください。", vbCritical, "注意"
        Exit Sub
    End If
    Dim foodNum As String
    foodNum = Left(lstFood.Value, 5) '左から5文字が食品番号
    Call addFood(foodNum)
End Sub

ハイライトした部分が、今回追加した部分です。lstFoodの値がNullであれば、注意を促すメッセージを出し、処理を中断しています。こうすることで、食品リストが選択されていない状態で追加ボタンが押されても、正しくエラーを処理することができます。

 

フォームの形式を整えよう

最後に、フォームを少し整えます。

フォントをいい感じに

まずはフォントを変更しましょう。ユーザーフォームの標準のフォントはMS Gothic です。悪くはないのですが、私の好みではありません。フォーム上でコントロールを選択し、フォントを変更してください。コントロールを選択するためには、Ctrl+Aですべてのコントロールを一斉に選択すると便利です。

私はMeiryo UI が好みですので、そちらに変更しました。どうでしょう?

使いやすいように微調整しよう

あとは、コントロール間の間隔などを調整して完成です。自分の使いやすいように、間隔を調整したり、ボタンを押しやすいように大きくしたりするなどの変更を加えましょう。

ダウンロードはこちらから

今回までに作成した、ユーザーフォームを導入した栄養計算ソフトは、以下からダウンロードできます。ぜひご利用ください。

栄養計算ソフト 自作+ユーザーフォーム.xlsm

まとめ

今回はユーザーフォームの連載最終回として、コードの改善やエラー処理の実装などを行いました。これで栄養計算ソフトは大分使いやすくなったかと思います。

これ以降は、別の連載として、ところどころ使いやすさを向上させるための処理などを実装していく予定です。難易度は向上しますが、またぜひお付き合いください。

連載目次

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