「栄養計算ソフトにユーザーフォームを導入しよう」の連載第3回です。
以下の記事の続きになります。
今回は,ユーザーフォームにリストボックスを追加し,それを用いて食品を入力できるようにしてみたいと思います。
では行きましょう!
今回目指す形
はじめに,今回最終的に目指す形をお伝えしたいと思います。
まず,以下のようなリストボックスとコマンドボタンが配置されたフォームを作成します。
そして,リストボックスで食品が選択された状態で「追加する」ボタンをクリックすると,アクティブセルの行の食品番号を入力する列に,食品番号が追加される,という処理を実装していきます。
では早速行きましょう。
フォームにコントロールを追加しよう
まずは,フォームに各コントロールを追加していきましょう。以下の手順で行ってください。
①リストボックスとコマンドボタンを追加しよう
今回追加するコントロールは,リストボックスとコマンドボタンです。ツールボックスからそれぞれ選択し,フォーム「食品群から入力する」に配置してください。先に示した,最終的な完成形と似たような配置であれば,個人の好みで配置してもらっても構いません。
②オブジェクト名を変更しよう
追加したコントロールのオブジェクト名を変更します。以下のように変更してください:
- リストボックス:
lstFood
- コマンドボタン:
btnAdd
オブジェクト名には,コントロールの種類を示した接頭語をそれぞれ付けています。リストボックスは食品の一覧を表示するために使用します。またオプションボタンはリストボックスに表示された食品をシートに追加するために使用します。
リストボックスに食品を追加しよう
では,リストボックスに食品を追加していきましょう。以下の手順で行ってください。
フォーム起動時の処理を実装しよう
リストボックスに食品を追加するための作業は,ユーザーフォームが開かれた際に,自動で実行されるようにしていきます。
まず,ユーザーフォーム上で,ユーザーフォームをダブルクリックしてください。コードエディタが開き,自動で以下のようなコードが作成されますが,それは削除してください。
エディタの上の方に,UserFormなど書かれたウインドウがあるかと思います。
同じ様なウインドウが右側にもありますよね。これを,
- 左側:UserForm
- 右側:Initialize
に変更してください。すると,以下のようなコードが表示されます。これは削除せずに置いておいてください。
作成されたプロシージャ UserForm_Initialize
に,処理を記述していきます。UserForm_Initialize
は,ユーザーフォームが開かれた際に自動で実行されるプロシージャです。したがって,このプロシージャ内に,リストボックスに食品を追加するためのコードを記述すればよいということになります。
とりあえず,以下のように入力してみましょう。
Private Sub UserForm_Initialize()
Dim i As Long
For i = 9 To 2199
lstFood.AddItem(Format(Worksheets("本表").Cells(i, 2).Value, "00000") _
& " " & Worksheets("本表").Cells(i, 4).Value)
Next i
End Sub
以下でコードを解説していきます。
コードの解説
- 2行目:カウンタ変数を指定しています。
- 3,6行目:For~Nextステートメントでのループ処理を行っています。本表シートの9行目から2199行目までに食品が入力されているので,その分だけループします。
- 4~5行目:リストボックスに食品を追加しています。リストボックスに表示させる文字列は「食品コード5桁+半角スペース+食品名」としたいので,このようになっています。食品コードは本表シートの2列目に,食品名は4列目にあります。
これでコードは完成しました。
実際にフォームを開いてみて,以下のようになればOKです!
ボタンを押して食品を入力できるようにしょう
では,実際に「追加する」ボタンを押すと,食品を入力できるようにしていきましょう。以下の手順で行ってください。
ボタンを押した際の処理を書くためには?
フォーム開始時の処理を書いた時と同じ様に,ボタンを押した時の処理も書いていきます。ボタンをダブルクリックし,ボタンを押した際に実行されるコードを表示してください。以下のように,btnAdd_Click()が表示されればOKです。
このプロシージャ内に,コードを書いていきます。以下を記述してください。
Private Sub btnAdd_Click() Dim foodNum As String foodNum = Left(lstFood.Value, 5) Cells(ActiveCell.Row, 2).Value = foodNum End Sub
コードの解説
では,コードの解説をしていきます。
- 2行目:foodNumは,食品番号を格納するための変数です。文字列型で宣言しています。
- 3行目:実際にfoodNumに食品番号を格納しています。Left関数は置いておいて,まずはその中身をみてみましょう。lstFood.valueとなっていますね。ここでは,リストボックスで,選択されている値を取得しています。先ほど,リストボックスに追加した文字列を,ここで取得しているのですね。この文字列は,左5文字が食品番号なのでした。そこで,Left関数を用いて,左から5文字を取得しています。Left関数は,1つ目の引数が対象の文字列,2つ目の引数が取得する文字の数で,取得した文字列を返します。つまり,変数foodNumには,リストボックスで選択された食品の,食品番号が格納されているという状態になっています。
- 4行目:3行目で取得した値を,Cells(ActiveCell.Row, 2) の value として設定します。ActiveCell.Row で現在選択した状態になっているセルの行を取得できますので,それを行インデックスとして設定しています。2列目というのは,栄養計算シートにおける食品番号を入力するための列番号のことです。
これで,リストボックスで選択されている食品を,ボタンをクリックすることでシート上に入力することができました。実際にフォームを起動してみて,狙ったとおりの動作をするか,確かめてみましょう。
まとめ
今回は,リストボックスに食品を追加し,それをシート上に入力する処理を実装しました。次回は,食品群毎にリストボックスに追加するような処理を行っていきたいと思います。