今回はExcelVBA講座2章で作成した医薬品新規登録画面の医薬品引用ボタンの設定をしていきます。

 

医薬品引用ボタンを押すと医薬品検索画面が開き、そこで引用したい医薬品を検索し選択すると、新規登録画面のテキストボックス、コンボボックスにその情報が入力される、という処理を行います。

 

これにより規格違いの場合などは一から入力しなくてもよくなります。システム利用者が気持よく作業できますよね。

 

それではいきましょう。

スポンサーリンク

Visible プロパティ

vba5-15-1ではfrmDRegisterを開いて下さい。

 

vba5-15-2続いて医薬品引用ボタンをダブルクリック。又は右クリックからコードの表示。

 

vba5-15-3上の画像のようになりましたね。

 

vba5-15-4今回は医薬品検索画面を利用しますので、

frmDSearch.show

と入力して下さい。医薬品引用ボタンのコードはこれで終わりです。

 

続いて医薬品検索画面を開きます。

 

vba5-15-5frmDSearchを開いて下さい。そして決定ボタン(btnDecide)を押した時のコードを見て下さい。

 

vba5-15-6今は上のコードが書かれていますね。このままですとfrmInputのテキストボックス、コンボボックスに値が転記されてしまいますのでダメですね。

 

今回はfrmDRegisterに転記されなければなりません。そこで以下のように書き直します。

 

vba5-15-7赤く囲った部分が変更した部分です。

If frmInput.Visible Then

With frmInput
.txtDname = txtDname.Text
.txtGname = txtGname.Text
.txtKigou = txtKigou.Text
.txtEffect = txtEffect.Text
.txtSei1 = txtSei1.Text
.txtSei2 = txtSei2.Text
.txtSei3 = txtSei3.Text
.txtSei4 = txtSei4.Text
.txtKou1 = txtKou1.Text
.txtKou2 = txtKou2.Text
.txtKou3 = txtKou3.Text
.txtKou4 = txtKou4.Text
.txtKubun = cboKubun.Value
.txtTani = cboTani.Value
End With

End If

If frmDRegister.Visible Then

With frmDRegister
.txtDname = txtDname.Text
.txtGname = txtGname.Text
.txtKigou = txtKigou.Text
.txtEffect = txtEffect.Text
.txtSei1 = txtSei1.Text
.txtSei2 = txtSei2.Text
.txtSei3 = txtSei3.Text
.txtSei4 = txtSei4.Text
.txtKou1 = txtKou1.Text
.txtKou2 = txtKou2.Text
.txtKou3 = txtKou3.Text
.txtKou4 = txtKou4.Text
.cboKubun = cboKubun.Value
.cboTani = cboTani.Value
End With

End If

それでは1行ずつみていきましょう。

 

If frmInput.Visible Then

「Visible」初めて見るコードですね。Visibleとは日本語で「目に見える」という意味です。ここでは「表示されている」という意味になります。

 

つまり「もしfrmInputが表示されているならば」という意味になります。

 

どのユーザーフォームが開かれているかで場合分けをするわけです。

 

その下は最初に書いてあった部分をそのままコピペしましょう。最後にEnd Ifも忘れずに。

 

frmDRegisterが開いている時も同じように書く事ができます。

If frmDRegister.Visible Then

「もしfrmDRegisterが表示されているならば」となります。

 

その下は転記先のfrmDRegisterのコントロールに合わせるために修正します。具体的には…

frmInput → frmDRegister
txtKubun → cboKubun
txtTani  → cboTani

ですね。

 

これで完了といきたいところですが、ダメなんです。

 

どこがダメなのかわかりますか?

 

例えばfrmInputを開いている時に採用薬新規登録ボタンを押してfrmDRegisterを開き、更に医薬品引用ボタンを押してfrmDSearchを開いて決定ボタンを押した場合、どちらの条件も満たすことになります。

 

つまりfrmDseachの決定ボタンを押すと、frmInputにもfrmDRegisterにもどちらにも転記されてしまいます。これではマズイです。

 

frmDRegisterを開いている時はfrmDSearchにだけに転記したいのです。そこで以下のように修正します。

 

If frmDRegister.Visible Then

With frmDRegister
.txtDname = txtDname.Text
.txtGname = txtGname.Text
.txtKigou = txtKigou.Text
.txtEffect = txtEffect.Text
.txtSei1 = txtSei1.Text
.txtSei2 = txtSei2.Text
.txtSei3 = txtSei3.Text
.txtSei4 = txtSei4.Text
.txtKou1 = txtKou1.Text
.txtKou2 = txtKou2.Text
.txtKou3 = txtKou3.Text
.txtKou4 = txtKou4.Text
.cboKubun = cboKubun.Value
.cboTani = cboTani.Value
End With

Else

With frmInput
.txtDname = txtDname.Text
.txtGname = txtGname.Text
.txtKigou = txtKigou.Text
.txtEffect = txtEffect.Text
.txtSei1 = txtSei1.Text
.txtSei2 = txtSei2.Text
.txtSei3 = txtSei3.Text
.txtSei4 = txtSei4.Text
.txtKou1 = txtKou1.Text
.txtKou2 = txtKou2.Text
.txtKou3 = txtKou3.Text
.txtKou4 = txtKou4.Text
.txtKubun = cboKubun.Value
.txtTani = cboTani.Value
End With

End If

frmDSearchはfrmDRegisterとfrmInputからしか開くことができません。という事は…

 

frmDRegisterが開いている時はfrmDRegisterにデータが転記される。それ以外の場合はfrmInputにデータが転記される。

 

このように設定してあげればいい事がわかります。そこで使用するのがIf~Then…Else ステートメントです。

スポンサーリンク

If~Then…Else ステートメント

以前お話ししたのはIf~Then…ElseIf ステートメント

If 条件1 then
処理1
ElseIf 条件2 then
処理2
End If

というものでした。

 

今回はIf~Then…Else ステートメント。最後がElseIfではなくElseになったタイプ。

If 条件1 then
処理1
Else
処理2
End If

「もし条件1ならば処理1を実行。条件1以外の場合は処理2を実行。」となります。

 

今回はこれを使ってあげればうまくいきますよ。

 

ちなみにこれら2つを組み合わせて使用する事もできます。

If 条件1 then
処理1
ElseIf 条件2 then
処理2
Else
処理3
End If

「もし条件1ならば処理1を実行、条件2なら処理2を実行、条件1、条件2以外ならば処理3を実行」となります。

 

結構使えますので合わせて覚えておいてくださいね。

 

それでは今回は以上で終了とさせて頂きます。お疲れ様でした。長かったVBA講座も次回で最後です。最終処理についてお話します。

>>Excel VBA講座 目次はこちら