- ベストアンサー
VBAユーザーフォーム内のテキストボックスで検索
http://oshiete.homes.jp/qa3451770.html こちらで質問した者なのですが (benelli様ありがとうございました) VBAでユーザーフォームでの検索を作成し このユーザーフォーム内にテキストボックスを作成して そのテキストボックスに入力した数字を検索できるようにしたいです。 よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
質問の表現が判りにくい。 前の質問とまた繰り返しているのは、前問が判りにくくて、パスした回答者が多かったのではないかな。 「エクセルのシートの検索で、「検索語」をユーザーフォームのテキストボックスで指定したい」というのが判りやすい表現と思う。 エクセルのセルの検索のVBAコードの質問らしい。 ーー それであれば、マクロの記録状態にして、編集ー検索の操作を行い、記録されたマクロを見る。その中で、クロ検索語を指定するWhat:=○○ の○○をユーザーフォームのテキストボックスの値で指定するように すればよい。 ただそれだけのこと。 ーー ただし (1)数字に限定しないといけないのか。その場合、テキストボックスの値は文字列だから注意。 (2)2つ以上の該当が無いのか、あればどうするのか (3)検索して該当があればどうする(このセルと見るだけでよい)のか。 質問振りからして、回答者に、そこまで回答してもらわないと、判らないレベルではないですか。 (4)検索を実行というキッカケを与えるコマンドボタンなどのことも書いてないが、きちっと書くべきです。 ーーー ユーザーフォームにテキストボックス1つ、ボタン2つ、1つは最初の検索、2つめは第二以後の検索用。 H列に、見つかったセルのアドレスを出してます。本番では何か処理したい作業のコードを入れてください。 検索範囲はRange("A1:D9")にしてます。広げるなり、Cellsにするなりしてください。 ーー 標準モジュールの初めに(モジュール外の最初に入れる。パブリック変数) Public adr Public k Public fadr を入れる。 ーー 第1検索用 標準モジュールに Sub Macro4() MsgBox "テキストボックスで" & UserForm1.TextBox1.Text & "と入力しました" k = 1 If IsNumeric(UserForm1.TextBox1.Text) Then n = Val(UserForm1.TextBox1.Text) Else MsgBox "数字を指定してください" End If Range("A1:D9").Select Selection.Find(What:=n, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, SearchFormat:=False).Activate Cells(k, "H") = ActiveCell.Address k = k + 1 adr = ActiveCell.Address fadr = adr End Sub ーー ユーザーフォームの第1ボタン用 Private Sub CommandButton1_Click() Macro4 End Sub ーー 第2ボタン用 Private Sub CommandButton2_Click() Range("A1:D9").Select Selection.FindNext(After:=Range(adr)).Activate Cells(k, "H") = ActiveCell.Address k = k + 1 adr = ActiveCell.Address If adr = fadr Then MsgBox "検索はこれ以上なし" End If End Sub ーーー 一応2,3のデータでテストしてますが、エクセルVBAでも検索の コードは難しいところと、私は思ってます。ですから上記に誤りがあり、適切に動かなければ、全体を無視してください。 本件質問の既出回答でも、自力で修正ができないようなのだが、それでは回答をもらっても無駄になります。 本件質問が質問者にとって、レベルの高過ぎる課題を選んんだと思います。
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #2の回答者です。 >試して見たけど、出来ませんでした。 >大変参考になりました。 ちょっと脱線しますが、なぜ、検索にUserFormで、そういう方法が必要なのか、ということが大事であって、それは、私のコードは、初歩的な内容ですが、コードの仕組みを読めなければ、参考にしなくてもよいと思います。 要点としては、 TextBox と、CommandButton の名称と コードとしては、モジュール・レベルの変数によってセル位置の記憶をさせているか、TextBoxの変更があった場合に、TextBox イベントで、モジュールレベルの変数をクリアさせているか、というところです。 最初から別に作ったほうがわかりやすいと思います。 既存のものを変えるというのは、そのまま貼り付けるという方法ではできないと思います。理解がないと、既存のものは変更できないです。 私のコードの趣旨は、検索値が複数ある場合に、CommandButton を押すことによって、次のものを探すということです。
お礼
大変参考になりました。ご回答ありがとうございます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 数字以外は、検索しないように、IsNumeric(strTxt) をつけました。 CommandButtonで、検索するようにしました。 ------------------------------------------------------ 'Option Explicit Dim NewAdr As String '←モジュールの一番上に Private Sub CommandButton1_Click() Dim c As Range Dim strTxt As Variant If NewAdr = "" Then NewAdr = "A1" strTxt = TextBox1.Text If strTxt <> "" And IsNumeric(strTxt) Then Set c = Cells.Find(TextBox1.Text, Range(NewAdr), xlValues, 2, , , False, False) If Not c Is Nothing Then NewAdr = c.Address c.Select End If End If End Sub Private Sub TextBox1_Change() NewAdr = "" End Sub
お礼
ちょっとむずかしいですね。 試して見たけど、出来ませんでした。 大変参考になりました。ご回答ありがとうございます。
- liquid_crystal
- ベストアンサー率71% (124/174)
以前の質問をそのまま利用するとして、 以前の例では探したい文字列が "2" で固定されていましたよね。 これを、ユーザーフォームに配置したテキストボックスから取得するようにするだけですが...。 詳しい状況がわからないので自分ならこうします、というそれっぽい答えを書いてしまいますが、 FindStr = "2" の部分を FindStr = UserForm1.TextBox1.Text のように、ユーザーフォーム内に配置したテキストボックスの Text プロパティを参照するように変更します。
お礼
できました!大変参考になりました。ご回答ありがとうございます。
お礼
大変参考になりました。ご回答ありがとうございます。