前提・実現したいこと
ExcelVBA(Excel2019)で部品マスタの更新用ユーザーフォームを作成しています。
部品の情報は各部品に固有の品番で管理しており、部品の品名、型式、メーカー名、仕入先などを更新・修正する場合の使用を想定しています。
添付画像左上にあるFrmUpdateが更新用のユーザーフォームです。
更新したい品番を入力して、検索ボタンをクリックするとその品番にひもづく品名や型式名、メーカー名、仕入先名などがそれぞれのテキストボックスに表示されるようにしました。
最初に更新フォームを作成したときは、下記28行目や42行目のwhatの対象をFrmUpdate.txtMakerCode(28行目),FrmUpdate.txtMaker(42行目)にしていました。
しかし、それをFrmUpdate.txtMakerのようにユーザーフォームを固定するのではなく、複数のユーザーフォームで行えるように標準モジュールの関数に引数を渡して実行できるようにコードを変更したら、コードは表示されるのに、それにひもづくメーカー名が表示されませんでした。
どのように書けば、複数のユーザーフォームで標準モジュールの関数を使用することができるのでしょうか
標準モジュールの関数を使用したいのはFrmUpdateとFrmSearchの2つです。
excelvbaの初心者なため、まだ知らないことが多いので丁寧に教えていただければ幸いです。
発生している問題・エラーメッセージ
ユーザーフォームのテキストボックスに正しい結果が反映されない
該当のソースコード
・ユーザーフォーム FrmUpdate Private Sub btnFindPart_Click() With FrmUpdate ~前略~ 'メーカー With .txtMaker .Enabled = True .BackColor = &H80000005 If FrmUpdate.txtMakerCode <> "" Then Call ProcMaker("NAME", "FrmUpdate") End If End With ~後略~ End With End Sub ・ユーザーフォーム FrmSearch Private Sub btnFind_Click() Call ProcMaker("FIND","") End Sub ・標準モジュール 定数定義 ~前略~ Public Const メーカーマスタ採番台帳 = "メーカーマスタ採番台帳.xlsm" Public Const メーカーコード割当 = "メーカーコード割当" ~後略~ ・標準モジュール UserForm ~前略~ Public SlctForm As String Public ProcMakerMode As String ~後略~ 1Function ProcMaker(ByVal ProcMakerMode As String, ByVal SlctForm As 2String) 'メーカー関連の処理:メーカー名⇔コード変換、メーカー名検索 3 4 Dim MaxRow As Integer 5 Dim MaxCol As Integer 6 7 Dim FindMaker As Range 8 Dim MakerOutput As Range 9 10 Workbooks.Open Filename:=ActiveWorkbook.Path + "\" & メーカーマスタ採番台帳, ReadOnly:=True 11 Windows(メーカーマスタ採番台帳).Visible = False 12 13 Set MakerMaster = Workbooks(メーカーマスタ採番台帳) 14 Set wsMM = MakerMaster.Worksheets(メーカーコード割当) 15 16 '検索範囲の設定 17 With wsMM 18 MaxRow = .Cells(Rows.Count, 1).End(xlUp).Row 19 MaxCol = .Cells(1, Columns.Count).End(xlToLeft).Column 20 21 Set FindMaker = .Range(.Cells(2, 1), .Cells(MaxRow, MaxCol)) 22 End With 23 24 MsgBox UserForms.Add(SlctForm).Name 25 'メーカーコードからメーカー名を探す 26 If ProcMakerMode = "NAME" Then 27 28 Set MakerOutput = FindMaker.Find(what:=UserForms.Add(SlctForm).txtMakerCode, _ 29 After:=wsMM.Cells(2, 1), _ 30 LookIn:=xlValues, _ 31 LookAt:=xlWhole, _ 32 Searchorder:=xlByRows, _ 33 searchdirection:=xlNext, _ 34 MatchCase:=False, _ 35 matchbyte:=False) 36 37 UserForms.Add(SlctForm).txtMaker = MakerOutput.Offset(0, 1).Value 38 39 'メーカー名からメーカーコードを探す 40 ElseIf ProcMakerMode = "CODE" Then 41 42 Set MakerOutput = FindMaker.Find(what:=UserForms.Add(SlctForm).txtMaker, _ 43 After:=wsMM.Cells(2, 1), _ 44 LookIn:=xlValues, _ 45 LookAt:=xlWhole, _ 46 Searchorder:=xlByRows, _ 47 searchdirection:=xlNext, _ 48 MatchCase:=False, _ 49 matchbyte:=False) 50 51 UserForms.Add(SlctForm).txtMakerCode = MakerOutput.Offset(0, -1).Value 52 53 'メーカー名検索、プルダウン選択 タイミング:メーカー検索ボタンクリック 54 ElseIf ProcMakerMode = "FIND" Then 55 56 'cf. https://tonari-it.com/excel-vba-change-event-validation-list-find/ 57 Dim objCustom As Object 58 Dim strAdr As String '検索範囲内で最初にヒットしたセル 59 Dim Target As Variant '検索対象 60 61 'テキストボックス「検索対象」に入力した文字をtargetに格納 62 Target = FrmSearch.txtSearchObj 63 64 '部分一致した全会社名をプルダウンリストに表示 65 Set objCustom = FindMaker.Find(what:=Target, LookAt:=xlPart) 66 67 If objCustom Is Nothing Then 68 Target.Value = Target.Value 69 Else 70 '1件目を文字列にセット 71 strAdr = objCustom.Address 72 73 With FrmSearch.cmbResult 74 75 .Clear 76 .AddItem objCustom 77 78 End With 79 80 Do 81 Set objCustom = FindMaker.FindNext(objCustom) 82 83 If objCustom Is Nothing Then 84 Exit Do 85 Else 86 If strAdr <> objCustom.Address Then 87 88 FrmSearch.cmbResult.AddItem objCustom 89 90 End If 91 92 End If 93 94 Loop While Not objCustom Is Nothing And objCustom.Address <> strAdr 95 96 End If 97 Else 98 99 MsgBox "コードエラー" & vbCrLf & "[NAME],[CODE],[FIND]のうちいずれかを選択" 100 101 End If 102 103 Application.DisplayAlerts = False 104 Workbooks(メーカーマスタ採番台帳).Close 105 106End Function
試したこと
24行目では正しくFrmUpdateとメッセージボックスに表示されていたので、引数の引渡は問題ないと考えているのですが、そこから先をどう対処すればよいのかわかりません。
補足情報(FW/ツールのバージョンなど)

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/22 23:36
2019/07/23 01:21
2019/07/23 01:36
2019/07/23 01:40
2019/07/23 02:35