• 締切済み

VBAで検索フォームを作成したい

ユーザーフォームを使って検索ツールを作成したい。 たとえば、ワークシート内にこのようなデータがあります。  A列                B列 1業務分類        問合せ内容 2                単価訂正できない 3                販売契約が登録できない 4                出荷登録でエラー 5財務         仕訳登録でエラー 6                源泉税額はどこに入力するか 7                仮払金を申請するには 8購買         検収でエラー 9                購買依頼が登録できない これを、ユーザーフォームで、 カテゴリ選択・・・コンボボックスで「営業」「財務」「購買」のいずれかを選択する キーワード検索・・・テキストボックスでキーワードを入力する。テキストボックスは2つ用意し、 ラジオボタンでAND条件かOR条件かを選択させる これで、カテゴリ選択で「営業」を選択した場合は、B2:B4の範囲でキーワード検索し、ヒットするセルをアクティブにする。 ヒットするセルが複数ある場合、Enterキーで次にヒットするセルをアクティブにする。 次にヒットするセルがない場合は「検索文字列がありません」などのメッセージを表示する ヒットするセルがひとつも存在しない場合も「検索文字列が存在しません」を表示する 以上のようなツールを作成したいのですが、どのように組んだらよいでしょうか? ご教示ください。おねがいします。

みんなの回答

  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.1

とりあえず検索のやり方だけですが考えてみましたので回答いたします。 まず、これは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 うまくいかないところやわからないところ、ご要望に合わないところなどありましたら補足ください。

関連するQ&A

  • VBA 検索ボックスの作成について

    VBA初心者です。 エクセルで、ある列(仮にA列)のみに限定し、ショートカットキーを押した時に、 別シートにあるデータベースから検索、 検索結果をショートカットキーを押したセルに反映させるマクロを組みたいと思っています。 具体的には、 シート1→(請求明細用シート) A列→コード B列→企業名 C列→部署名 D列→請求内容 E列→金額 etc シート2→データベース(全コード一覧) A列→コード B列→企業名 C列→部署名、のみが記載。 検索ボックスは、 ユーザーフォームにテキストボックスひとつ、ボタン1つ、リストボックス1つ。 テキストボックスに文字を入力し、ボタン(検索用)を押すと、 リストボックスにシート2上のAーC列の結果が表示され(検索条件:部分一致)、 検索結果をリストボックス上でダブルクリックすると、 ショートカットキーを押したA列のセル(及びB-C列)に検索結果を出力することができる、 といったプログラムを考えています。 (B-C列への出力はVLOOKUPだけで大丈夫なので、マクロ上で組む必要はないです。 また、テキストボックスで検索する時は、基本的にB列(会社名)の内容で検索する予定です。 そして同じ会社でも部署が違えば、別のコードを採用している為、 検索結果が複数ある場合があります。 注文が多くて申し訳ありませんが、よろしくお願いします。

  • excel vba ユーザーフォーム

    現在、セルa101からa110までに「商品名」、セルb101からb110までに「金額」が 入力済みです。 このデータを、ユーザーフォーム上にコンボボックスを2つ作成し、セルa1へ 商品名を選択後、入力。また、b2へ金額を選択後、入力させたいのです。 また、ユーザーフォーム上にテキストボックスを作成し、ここに入力した 「備考」の全角10文字をc1へ移動したいです。 今のところ、ユーザーフォーム、コンボボックス、テキストボックスを作成した だけで 立ち往生しています。 どなたか、ご教授お願いいたします。

  • エクセルVBAであいまい検索フォームを作りたいです。

    エクセルVBAであいまい検索フォームを作りたいです。 (Ctrl+Fではなく) 商品群A・商品群B・商品群C・・・・と分けられたシートの すべてのA列に、商品名が入っています。 テキストボックスと【検索】ボタンと【次を検索】ボタンのみの 単純な検索用ユーザーフォームから 商品名をシートをまたいで検索し、 Ctrl+Fと同じように該当セルに移動、 次を検索で次の商品へ移動、 すべてのシートに該当商品が無ければ メッセージボックス「該当する商品はありません」 なんとなく出来そうな気がしてチャレンジしましたが、 基本がなっていないため行き詰りました。 (自動マクロを少しいじる程度なので・・・) とんでもなく支離滅裂ですが、チャレンジしたゴミコードを晒します。 順番がおかしいのは判るのですが、どうすればいいのか。。。 どなたか、このコードを正し添削して頂けませんか。 (あ、このコードにこだわっているわけではないので、 もっと他に適した方法があるのなら、それを教えてください) よろしくお願い致します。 ちなみに、作成はexcel2007ですが、2000・2003に配布します。 Dim s As Variant Dim c As Range Dim f As Range For Each s In Worksheets 'ブック内各シートに繰り返し With s s.Select 'シートを選択 Set f = Columns("B").Cells 'B列を変数にセット Set c = f.Find(What:=Trim(strData), LookIn:=xlValues, MatchByte:=False, LookAt:=xlPart) 'FINDでstrData(userformからの入力した文字列)をあいまい検索としてセット If Not c Is Nothing Then Application.Goto c, True '見つかった時は該当セルに飛ぶ Else End If End With Next End Sub

  • エクセル2007VBAで検索するコードを知りたい。

    エクセル2007(Excel2007)のVBAで【検索と置換】と同等の機能をもった検索アプリケーションを作りたいのですが、 そのコード(コマンドボタンを実行したときのコード)を教えていただけないでしょうか。 (おそらくですが、リストボックスのコードも必要だと思います。) 正しくは、【検索と置換】から【置換】機能を無くしたものとイメージしていただきたいです。 ●設置するもの ユーザーフォーム(UserForm1) テキストボックス(TextBox1) コマンドボタン(CommandButton1) リストボックス(ListBox1) ●仕様 ユーザーフォームのテキストボックスに入力してコマンドボタンを押すと、検索対象を見つけ、 リストボックスにその対象一覧を行ごとに表示するものになります。 ●検索するときの条件 (1)大文字と小文字を区別しない (2)半角と全角を区別しない (3)部分一致すれば(一部でも一致すれば)検索対象にする (4)今、開いているワークシート上の「全てのセルが検索対象(列や行を指定しない)」 ※検索されたセルの存在する行ごとに、ユーザーフォームのリストボックスに(1行ずつ)表示したいです。 そして、リストボックスに表示されたデータのうち、どれか1つを選ぶと、その選択対象の行の【D列】にアクティブセルを移動するようにしたいです(画面もアクティブセルが見える位置にスクロールします)。 ●リストボックスに(1行ごとに)表示するもの● ↓↓↓ (左から)I列の値、D列の値、O列の値、Q列の値(→4列の値になります) ※リストボックスにQ列の値が表示された場合のみ(Q列に何かしらのデータがある場合のみ)、 リストボックス上の【その行の(I列の値、D列の値、O列の値、Q列の値の)文字すべてを赤色】にして表示していただきたいです。 分かる方がいましたらよろしくお願いいたします。

  • エクセルVBAについて質問です。

    初心者なので説明が足りなかったらごめんなさい。 顧客リストを作成するためのユーザーフォームを作成しました。そして、 リスト内の顧客情報を編集する場合には、まず顧客検索するためのユーザーフォーム(テキストボックスに顧客ID(数字のみ)を入力して検索する)で検索を行い、発見したら編集用のユーザーフォームが開きます。 これまでにエクセルで管理されている顧客リストをいちいち登録用のユーザーフォームで登録するのが面倒なので、既存の顧客情報はコピペでエクセルに直接移しました。 ここで困った現象がおきているのですが、登録用のユーザーフォームを使って登録した顧客は検索用のユーザーフォームで検索すると見つかるのですが、 コピペで移してきた顧客は発見されません。(検索条件である顧客IDはちゃんとリストに存在します。) ユーザーフォームを使って登録した顧客ID(数字のみ)はテキストボックスを介しているのでリスト内では文字列として登録されています。 それに対してコピペした顧客IDはセルの書式設定が標準であったため、これが原因かと思い文字列に変えたのですが、相変わらず検索にヒットしません。 何が原因で検索されないのでしょうか。 ちなみに検索に使っているのはFor...Nextステートメントです。 何とぞよろしくお願いします。

  • エクセルでフォームを作成しています。(VBA)

    エクセルでフォームを作成しています。(VBA) フォームAで作成してあるリストボックスから選択して 取得した番号を フォームBにもってきて、その番号をもとにVLOOKUPで ほかのテキストボックスに値を持ってこようとしている のですがうまくいきません。 フォームAのリストボックスにはsheet1の名簿が 表示されています。 クリックで選択した名簿番号を取得して、フォームBにある 個人のページでその他の詳細を出そうとしています。 名簿番号はフォームBの名簿番号.Textに持ってこれたのですが その名簿番号をVLOOKUPで研究名を出そうとしてもうまくいきません。 コードのどこがだめなのか分かりません。 VBA入門者です。 よろしくお願いいたします。 --------------------- Private Sub 決定_Click() Dim ADR As Variant On Error GoTo ExitER Set ADR = Worksheets("sheet1").Range("A:F") 研究名.Text = Application.WorksheetFunction.VLookup(名簿番号.Text, ADR, 4, False) On Error GoTo 0 Exit Sub ExitER: MsgBox "一致するコードがありません" On Error GoTo 0 End Sub ---------------------

  • VBAのユーザーフォーム・・

    教えてください。 ユーザーフォームのテキストボックス・コンボボックスに入力した文字列をコマンドボタンを押したら、セルC1・B1に反映させたいのですが、できません。 このコマンドボタンには他のプログラムも入っており、同時にプログラムを実行したいのですが。

  • 複数のテーブルの検索について

    お世話になっております。 題名にありますように、複数のテーブルに登録のあるデータを、テキストフォームやチェックボックス、プルダウンなどのフォームで入力(選択)されたものを(PHPにて)検索したいと考えておりますが、googleなどで調べていても、キーワードが適切でないためか、得たい情報を得られずにおります。 以下のようなテーブル構成で、上記質問のような検索をする場合、(googleなどで検索するには)どのようなキーワードが適切でしょうか?ソースを教えていただくのが簡単ですが、理解を深めたいと考えての質問です。お忙しい中恐縮ですが、アドバイスのほど宜しくお願いいたします。 table_a id name address category table_b no id title subject 上記テーブルA、Bに設定されたフィールドを、各フォームににて入力(選択)されたフォームで一括で検索するソースを学びたいのです。 ※table_a と table_b にある id で紐付けています。

  • Excelで検索を簡単に実行したい

    ExcelでCtrl+Fの検索ではなく、セルに検索したいキーワードを入力、 ヒットすると結果のセルに飛ぶ、というような検索方法がないかと探していました。 そしてこちら(http://okwave.jp/qa378182.html)の内容が 自分の希望と同じであったので、参考にさせていただいたのですが ちゃんとヒットしません。 具体的には、検索したい列はB列で、テストとしてここに 1~10の数字を入力します。セルのA2に検索したい数字を入れて Enterを押すと、何行かはちゃんと検索できるのですが、途中から その数字は確かにB列にあるのに見つかりませんという結果 になってしまいます。 A2にキーワードをいれ、B列の検索をしたいので、上記ページに ありましたVBAを下記のように一部修正をしました。 Set myRange = Range("B1:" & Cells(Rows.Count, 5).End(xlUp).Address).Find(Range("A2").Value, lookat:=xlWhole) どこか他に間違っている箇所がありますでしょうか。 よろしくご指導ください。

  • エクセルVBAの勉強初歩のものです。

    エクセルVBAの勉強初歩のものです。 今A列に社名、B列に住所、C列に業務内容と記載されています。データは今のところ十数行です。フォームのテキストボックスでキーワードを入れて、検索ボタンを押して、A列の社名で検索してヒットすれば、社名、そのセルの右隣(B列)、その又右隣(C列)のセルの内容をフォームのテキストボックスに表示しようというものです。以下はソースの一部です。 '検索範囲設定 With Worksheets("sheet1").Range("A2:A" & Rows.Count) If (flag = False) Or (firstRange Is Nothing) Then    '初めての検索処理 '初めての検索処理 Set c = .Find(What:=myKey, After:=.Cells(.Count), LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByColumns) '最初の検索で見つからなければ、 If c Is Nothing Then MsgBox "データは見つかりません", vbExclamation Exit Sub '最初の検索で見つかれば Else (1) d = c.Address (2) Set e = d (3) Debug.Print d.Value (1)でヒットしたセルのアドレスをD(stringで定義)してそのまま、offset(0,1).valueとしようとしたのですが、offsetはオブジェクトでないと使用できないとの事。 だったら、eをオブジェクトで定義(dim d as object)として実行したら、= dで型が一致しませんとエラーがでました。 やりたいことは、A列で検索したセルのアドレスの把握はできているので、その右隣、そのまた右隣のセルのアドレスを取得する方法です。 もう一つやりたいことはその把握したセルのアドレスに記載されている情報を取得する方法です。(3)でも型が一致しませんとエラーが出ました。てっきり、 textbox1 = d.valueなんて感じでできるのだと思っていましたが。 おそらく方向としては間違っていないのでしょうけど、どなたか間違いと改善方法をよろしくお願いたします。

専門家に質問してみよう