- 締切済み
VBAで検索フォームを作成したい
ユーザーフォームを使って検索ツールを作成したい。 たとえば、ワークシート内にこのようなデータがあります。 A列 B列 1業務分類 問合せ内容 2 単価訂正できない 3 販売契約が登録できない 4 出荷登録でエラー 5財務 仕訳登録でエラー 6 源泉税額はどこに入力するか 7 仮払金を申請するには 8購買 検収でエラー 9 購買依頼が登録できない これを、ユーザーフォームで、 カテゴリ選択・・・コンボボックスで「営業」「財務」「購買」のいずれかを選択する キーワード検索・・・テキストボックスでキーワードを入力する。テキストボックスは2つ用意し、 ラジオボタンでAND条件かOR条件かを選択させる これで、カテゴリ選択で「営業」を選択した場合は、B2:B4の範囲でキーワード検索し、ヒットするセルをアクティブにする。 ヒットするセルが複数ある場合、Enterキーで次にヒットするセルをアクティブにする。 次にヒットするセルがない場合は「検索文字列がありません」などのメッセージを表示する ヒットするセルがひとつも存在しない場合も「検索文字列が存在しません」を表示する 以上のようなツールを作成したいのですが、どのように組んだらよいでしょうか? ご教示ください。おねがいします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- queuerev2
- ベストアンサー率78% (96/122)
とりあえず検索のやり方だけですが考えてみましたので回答いたします。 まず、これはExcelですよね。 それと、質問者様提示のワークシートのデータですが、文章にある「営業」が見当たりません。これはA2に入力されているということでいいですよね。 さて、ExcelVBAでの検索の方法ですが、VBAだけで行うか、Findを使うか、オートフィルタを使うかなどいろいろありますが、今回の条件はオートフィルタに合っていると思いますので、オートフィルタを使ってはいかがでしょう。 ただし1つ問題があります。 A列の業務分類は各業務分類が1つしか入力されていないのですが、オートフィルタに使用するならすべての行に業務分類が入力されている必要があります。 業務分類がすべての行に入っている状態で検索を行うためのコードを書いてみました。 このコードを動作させるには、最低限ユーザーフォームからPublic変数(IGyou, IToi1, IToi2, IOp, I_Ok)を受けるところを補ってください。(動作確認だけならば単にPublic変数の値が決まればいいので、ユーザーフォームでなくとも代入文を並べるだけでOKです。) あとは、得られた範囲(変数ToiRS)をEnterキーで1つずつ選択するよう工夫してください。 Option Explicit Public IGyou, IToi1, IToi2, IOp, I_Ok Sub SearchTable1() Dim S, T1, T1RB, T1RE, CToi, CGyouK, ToiRS, oWshShell Set oWshShell = CreateObject("Wscript.Shell") Set S = ThisWorkbook.Sheets("Sheet1") 'シートはSheet1とした If Not S.AutoFilter Is Nothing Then S.Cells.AutoFilter 'オートフィルタが設定されていたら解除 End If Set T1 = S.Cells(1, 1).CurrentRegion '表のセル範囲を得る If T1.Rows.Count <= 1 Then oWshShell.popup "データがありません", 2 Exit Sub End If 'データがなければメッセージ表示(2秒間)後終了 CToi = 2 '「問い合わせ内容」の列 CGyouK = 1 '「業務分類」の列」 T1RB = T1.Cells(1).Row 'タイトル行位置(=1) T1RE = T1.Cells(T1.Cells.Count).Row '最終行位置 ' Userform1.Show ''ここでユーザーフォームから、業務分類(IGyou)、検索文字列(IToi1, IToi2)、 ''AND/OR(IOp)、入力の有無(I_Ok)を受け取るようにする。 ''(IGyou, IToi1, IToi2は文字列。IOpはANDで1、ORで2。I_OkはTrueまたはFalse) ''動作テストであれば、単にこれらの変数に値を代入するだけでよい。 ''なお、この例ではこのプロシージャをメインルーチンとして動作させ、 ''ここでユーザーフォームを呼び出し、ユーザーフォームで ''上記Public変数に値を代入することを想定しているが、 ''ユーザーフォームからこのコードを呼び出す場合は ''ここでプロシージャを分割すればよい。 ''その際、これ以前とこの後の両方で使用している変数に注意。 If Not I_Ok Then Exit Sub '入力がないなら終了 T1.AutoFilter field:=CGyouK, Criteria1:="=" & IGyou '業務内容でフィルタ If IToi1 = "" Or IToi2 = "" Then T1.AutoFilter field:=CToi, Criteria1:="=*" & IToi1 & IToi2 & "*" Else T1.AutoFilter field:=CToi, Criteria1:="=*" & IToi1 & "*", _ Operator:=IOp, Criteria2:="=*" & IToi2 & "*" End If '続いて問合せ内容でフィルタ(キーワードが1個か2個かで場合分け) Set ToiRS = S.Range(Cells(T1RB, CToi), Cells(T1RE, CToi)) _ .SpecialCells(xlCellTypeVisible) 'まずは問合せ内容の可視セルをタイトルごと選択。セル1個ならデータなし。 '(選択データがないとSpecialCells(xlCellTypeVisible)がエラーになる) If ToiRS.Count <= 1 Then oWshShell.popup "該当するデータがありません", 2 S.Cells.AutoFilter Exit Sub End If 'データなしならメッセージ表示(2秒間)後オートフィルタ解除して終了 Set ToiRS = S.Range(Cells(T1RB + 1, CToi), Cells(T1RE, CToi)) _ .SpecialCells(xlCellTypeVisible) 'ヒットしたセル範囲(問合せ内容の可視セル・タイトル以外)を変数ToiRSにセット S.Cells.AutoFilter 'オートフィルタ解除 oWshShell.popup ToiRS.Address, 2 '得られた範囲のアドレスを2秒間表示 ''この後、EnterキーでToiRSの範囲を1セルずつ選択するようにする End Sub うまくいかないところやわからないところ、ご要望に合わないところなどありましたら補足ください。