今回はリストボックス内に表示された検索結果(医薬品名)を選択(クリック)した時に、選択した医薬品情報の詳細が黒線の下のコントロールに表示されるコードを書いていきます。

 

文章で書くと少しわかりづらいですが、一つずつ進めていけばそれほど難しくないので安心してくださいね。

 

それでは早速いきます。

リストボックスの検索結果詳細~ListIndexプロパティとは?

vba3-5-1まずはlstKouhoをダブルクリックします。またはlstKouhoを「右クリック→コードの表示」でもOKです。

 

vba3-5-2上のコードが表示されました。意味は「lstKouhoをクリックした時に以下の動作を行う」ですね。

 

ここには「リストボックスに表示された医薬品名をクリックすると、クリックした薬品の詳細が下のテキストボックス、コンボボックスに表示される」というコードを書いてきます。

 

早速下の画像を見て下さい。

 

vba3-5-3

Dim TargetRow As Integer
TargetRow = lstKouho.ListIndex + 2
With Worksheets(“医薬品検索結果”)txtDname.Text = .Range(“A” & TargetRow).Value
txtGname.Text = .Range(“B” & TargetRow).Value
txtKigou.Text = .Range(“C” & TargetRow).Value
txtEffect.Text = .Range(“D” & TargetRow).Value
cboKubun.Value = .Range(“E” & TargetRow).Value
cboTani.Value = .Range(“F” & TargetRow).Value
txtSei1.Text = .Range(“G” & TargetRow).Value
txtSei2.Text = .Range(“H” & TargetRow).Value
txtSei3.Text = .Range(“I” & TargetRow).Value
txtSei4.Text = .Range(“J” & TargetRow).Value
txtKou1.Text = .Range(“K” & TargetRow).Value
txtKou2.Text = .Range(“L” & TargetRow).Value
txtKou3.Text = .Range(“M” & TargetRow).Value
txtKou4.Text = .Range(“N” & TargetRow).ValueEnd With

これが完成形です。それでは1行ずつ順番に解説していきますね。

 

Dim TargetRow As Integer

変数TargetRowを数字と宣言する。変数の宣言は何度もやっていますのでOKですね。

 

TargetRow = lstKouho.ListIndex + 2

変数TargetRowはリストボックスlstKouhoのリストインデックス+2の値である。

 

う~ん、何を意味するのかよくわかりませんね。

 

それではまずListIndexについて説明していきましょう。

 

ListIndexは「リストボックスに表示された候補の何行目を選択(クリック)しているか」を教えてくれます。

 

コンボボックスでも説明しましたが、ExcelVBAの1行目は「0」とカウントするのでしたね。

 

つまり…

1行目をクリックしたら「ListIndex=0」
2行目をクリックしたら「ListIndex=1」
3行目をクリックしたら「ListIndex=2」

となります。

 

今回は使用しませんが、クリックされていない状態(検索直後)は「ListIndex=-1」となることも覚えておいて下さい。

 

TargetRow = lstKouho.ListIndex + 2

もう一度このコードに戻ります。

 

このコードでは、リストボックスlstKouhoの1行目をクリックしたらTargetRowは2となりますね。

 

ではなぜここで2を足す必要があるのでしょうか?それは次のコードを見ればわかります。

ListIndexに2を足す理由はこれだ!

With Worksheets(“医薬品検索結果”)

txtDname.Text = .Range(“A” & TargetRow).Value
txtGname.Text = .Range(“B” & TargetRow).Value
txtKigou.Text = .Range(“C” & TargetRow).Value
txtEffect.Text = .Range(“D” & TargetRow).Value
cboKubun.Value = .Range(“E” & TargetRow).Value
cboTani.Value = .Range(“F” & TargetRow).Value
txtSei1.Text = .Range(“G” & TargetRow).Value
txtSei2.Text = .Range(“H” & TargetRow).Value
txtSei3.Text = .Range(“I” & TargetRow).Value
txtSei4.Text = .Range(“J” & TargetRow).Value
txtKou1.Text = .Range(“K” & TargetRow).Value
txtKou2.Text = .Range(“L” & TargetRow).Value
txtKou3.Text = .Range(“M” & TargetRow).Value
txtKou4.Text = .Range(“N” & TargetRow).Value

End With

2行目を見てください。

 

txtDname.Text = .Range(“A” & TargetRow).Value

=の左側は「テキストボックスtxtDnameのテキストは」ですね。

 

=の右側は「ワークシート医薬品検索結果のA列変数TargetRow行の値」

 

先ほど説明したように、リストボックスの1行目を選択したらListIndexは0、そしてTargetRowは2となります。

 

つまり、「リストボックスの1行目を選択した場合、txtDnameにA2セルの値を入れる」という意味になります。

 

vba3-5-4ワークシート医薬品検索結果の1行目は見出しになっています。そしてリストボックスの1行目の医薬品情報はワークシート医薬品検索結果の2行目に表示されていますね。

 

ListIndex(=0)に2を足してあげればいいことがわかります。

 

同じように、リストボックスの2行目(ListIndex=1)の医薬品情報はワークシート医薬品検索結果の3行目(ListIndex=1+2)に表示されていますね。

 

リストボックスとワークシート医薬品検索結果をリンクさせるため2を足したというわけです。おわかりいただけましたか?

 

続いて

txtGname.Text = .Range(“B” & TargetRow).Value

txtGname(一般名)はB列に載っていますね。だからAをBに変えるだけです。簡単ですね。

 

同様にtxtKou4までコードを書きましょう。やり方は同じなのでここでは割愛します。

 

vba3-5-5最後に後1行だけコードを書いて終わりにしましょう。「ボタンbtnCloseをダブルクリック」します。

 

vba3-5-6閉じるボタンを押すと、ユーザーフォームが閉じるように「Unload Me」と入力してください。

 

それでは今回はここで終了です。お疲れ様でした。

 

次回は一般名で検索するコードについて解説していきます。