|
▼もんこち さん:
こんばんは。
>4つのフォームでコードが変わる部分ですが、
>
>「オートフィルタを使ってリストへ候補表示」の部分では、オートフィルタをかける対象のシート
ということは、
> Set wsDrugMaster = wbOwn.Worksheets("商品マスター")
このシート名の箇所ですね?
>「'選択された医薬品の単価をTB2へ(小数点第2位を四捨五入)」では横方向にoffsetする数
これは、
> wsSlip.Cells(7, "BH") = rgKana.Offset(0, 4) / rgKana.Offset(0, 2)
> strUnit = rgKana.Offset(0, 3)
この2行の
rgKana.Offset(0, 4) の4
rgKana.Offset(0, 2) の2
及び、
rgKana.Offset(0, 3) の3
がフォームによって値が変わると言うことですね?
ということは、
フォームを表示するときに
shtnm String型 --- 作業を行うシート名
値ををセットする列識別番号として
IndexA Long型 ----例の4の値を格納する変数
IndexB Long型 ----例の2の値を格納する変数
IndexC Long型 ----例の3の値を格納する変数
この情報を送ることが出来ればフォームは一つにまとめられますね?
>フォームが4つ(frmBaika,frmNounyuuka,frmRevBaika,frmRevNounyuu)ありまして、すべてのフォームで以下のようなコードを書いています。
ユーザーフォームは、frmとします(実際には、わかりやすい名前にして下さい)。
frmのモジュールには、
'=================================================================
public shtnm as string '--- 作業を行うシート名
public IndexA as long '--- 例の4の値を格納する変数
public IndexB as long '--- 例の2の値を格納する変数
public IndexC as long '--- 例の3の値を格納する変数
'=======================================
>Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
>
>
>Application.ScreenUpdating = False
>
>
> '=オブジェクト変数のセット=
> Set wbOwn = ThisWorkbook
Set wsDrugMaster = wbOwn.Worksheets(shtnm)
> Set wsSlip = wbOwn.Worksheets("伝票")
>
>
> '=検索キーが空白の時は何もしない=
> If TextBox1 = "" Then
>
> Exit Sub
>
> End If
>
>
> '=検索キーでオートフィルターを実行し結果をリストボックスに表示する=
> wsDrugMaster.Activate
>
> strDrugName = TextBox1.Value
>
> wsDrugMaster.Cells(1, "A").AutoFilter
>
> wsDrugMaster.Columns("HD:HD").Clear
>
> wsDrugMaster.Cells(1, "A").AutoFilter Field:=1, Criteria1:="=" & strDrugName & "*"
>
> wsDrugMaster.Range(wsDrugMaster.Cells(2, "B"), wsDrugMaster.Cells(2, "B").End(xlDown)).Copy
>
> wsDrugMaster.Cells(2, "HD").PasteSpecial
>
> ListBox1.List = wsDrugMaster.Range(wsDrugMaster.Cells(2, "HD"), _
> wsDrugMaster.Cells(2, "HD").End(xlDown)).Value
>
> Application.CutCopyMode = False
>
>
> '="伝票"シートに戻る=
> wsSlip.Select
>
> Range("A1").Select
>
>
> '=リストボックスの最初の項目を選択=
> ListBox1.ListIndex = 0
>
>
>Application.ScreenUpdating = True
>
>
>End Sub
>
>'==============================================================================
>'選択された医薬品の単価をTB2へ(小数点第2位を四捨五入)==========================
>'==============================================================================
>Private Sub ListBox1_Click()
>
>
> '=変数の宣言=
> Dim rgDrugPhonetic As Range '"商品マスター"シート半角カナ列(検索範囲)
> Dim rgKana As Range
>
>
> '=オブジェクト変数のセット=
> Set rgDrugPhonetic = wsDrugMaster.Range(wsDrugMaster.Cells(2, "B"), _
> wsDrugMaster.Cells(2, "B").End(xlDown))
> Set wsSlip = wbOwn.Worksheets("伝票")
>
>
> '=項目が選択されていない場合はなにもしない=
> strDrugName = ListBox1.Value
>
> If strDrugName = "" Then
>
> Exit Sub
>
> End If
>
>
> '=選択された項目名をキーに単価・単位(購入価/薬価倍率)を取得する=
> For Each rgKana In rgDrugPhonetic
>
> If rgKana.Value = strDrugName Then
>
wsSlip.Cells(7, "BH") = _
rgKana.Offset(0, IndexA) / rgKana.Offset(0, IndexB)
>
> dblCost = wsSlip.Cells(7, "BI").Value
>
strUnit = rgKana.Offset(0, IndexC)
>
> '=選択された項目の名前・単価・単位を表示する=
> Label12.Caption = strDrugName
>
> Label9.Caption = strUnit
>
> TextBox2.Value = Format(dblCost, "#,##0.00")
>
> End If
>
> Next rgKana
>
>
>End Sub
とします。
このフォームを呼び出すプロシジャーでは、
例えば、
sub main()
load frm
with frm
.shtnm="商品マスター"
.IndexA=4
.IndexB=2
.IndexC=3
.show
end with
end sub
と記述すれば、
作業シート名として"商品マスター"
Offset値として、4,2,3という値で処理がなされます。
処理する内容によって、shtnmやIndexA〜IndexCの値を変更して、
表示すればよいですよね?
尚、IndexA〜IndexCに関しては規則性があるばならば、
一つで足りるかもしれません。
また、記述された箇所以外にも値が変わる箇所があった場合は
同じようにフォームのPublic変数として宣言して
表示(Showメソッド)前にデータを設定することで
処理できると思います。
試してみてください。
|
|