今回はExcelVBA講座2章で作成した医薬品新規登録画面の医薬品引用ボタンの設定をしていきます。
医薬品引用ボタンを押すと医薬品検索画面が開き、そこで引用したい医薬品を検索し選択すると、新規登録画面のテキストボックス、コンボボックスにその情報が入力される、という処理を行います。
これにより規格違いの場合などは一から入力しなくてもよくなります。システム利用者が気持よく作業できますよね。
それではいきましょう。
スポンサーリンク
Visible プロパティ
続いて医薬品引用ボタンをダブルクリック。又は右クリックからコードの表示。
と入力して下さい。医薬品引用ボタンのコードはこれで終わりです。
続いて医薬品検索画面を開きます。
frmDSearchを開いて下さい。そして決定ボタン(btnDecide)を押した時のコードを見て下さい。
今は上のコードが書かれていますね。このままですとfrmInputのテキストボックス、コンボボックスに値が転記されてしまいますのでダメですね。
今回はfrmDRegisterに転記されなければなりません。そこで以下のように書き直します。
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行ずつみていきましょう。
「Visible」初めて見るコードですね。Visibleとは日本語で「目に見える」という意味です。ここでは「表示されている」という意味になります。
つまり「もしfrmInputが表示されているならば」という意味になります。
どのユーザーフォームが開かれているかで場合分けをするわけです。
その下は最初に書いてあった部分をそのままコピペしましょう。最後にEnd Ifも忘れずに。
frmDRegisterが開いている時も同じように書く事ができます。
「もしfrmDRegisterが表示されているならば」となります。
その下は転記先の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 ステートメント。
処理1
ElseIf 条件2 then
処理2
End If
というものでした。
今回はIf~Then…Else ステートメント。最後がElseIfではなくElseになったタイプ。
処理1
Else
処理2
End If
「もし条件1ならば処理1を実行。条件1以外の場合は処理2を実行。」となります。
今回はこれを使ってあげればうまくいきますよ。
ちなみにこれら2つを組み合わせて使用する事もできます。
処理1
ElseIf 条件2 then
処理2
Else
処理3
End If
「もし条件1ならば処理1を実行、条件2なら処理2を実行、条件1、条件2以外ならば処理3を実行」となります。
結構使えますので合わせて覚えておいてくださいね。
それでは今回は以上で終了とさせて頂きます。お疲れ様でした。長かったVBA講座も次回で最後です。最終処理についてお話します。