プロが教えるわが家の防犯対策術!

http://oshiete.homes.jp/qa3451770.html
こちらで質問した者なのですが
(benelli様ありがとうございました)

VBAでユーザーフォームでの検索を作成し
このユーザーフォーム内にテキストボックスを作成して
そのテキストボックスに入力した数字を検索できるようにしたいです。
よろしくお願い致します。

A 回答 (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でも検索の
コードは難しいところと、私は思ってます。ですから上記に誤りがあり、適切に動かなければ、全体を無視してください。
本件質問の既出回答でも、自力で修正ができないようなのだが、それでは回答をもらっても無駄になります。
本件質問が質問者にとって、レベルの高過ぎる課題を選んんだと思います。
    • good
    • 0
この回答へのお礼

大変参考になりました。ご回答ありがとうございます。

お礼日時:2007/11/07 11:34

こんにちは。


#2の回答者です。

>試して見たけど、出来ませんでした。
>大変参考になりました。

ちょっと脱線しますが、なぜ、検索にUserFormで、そういう方法が必要なのか、ということが大事であって、それは、私のコードは、初歩的な内容ですが、コードの仕組みを読めなければ、参考にしなくてもよいと思います。

要点としては、
TextBox と、CommandButton の名称と
コードとしては、モジュール・レベルの変数によってセル位置の記憶をさせているか、TextBoxの変更があった場合に、TextBox イベントで、モジュールレベルの変数をクリアさせているか、というところです。

最初から別に作ったほうがわかりやすいと思います。
既存のものを変えるというのは、そのまま貼り付けるという方法ではできないと思います。理解がないと、既存のものは変更できないです。

私のコードの趣旨は、検索値が複数ある場合に、CommandButton を押すことによって、次のものを探すということです。
    • good
    • 0
この回答へのお礼

大変参考になりました。ご回答ありがとうございます。

お礼日時:2007/11/07 11:34

こんばんは。



数字以外は、検索しないように、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
    • good
    • 0
この回答へのお礼

ちょっとむずかしいですね。
試して見たけど、出来ませんでした。
大変参考になりました。ご回答ありがとうございます。

お礼日時:2007/10/26 10:13

以前の質問をそのまま利用するとして、



以前の例では探したい文字列が "2" で固定されていましたよね。
これを、ユーザーフォームに配置したテキストボックスから取得するようにするだけですが...。

詳しい状況がわからないので自分ならこうします、というそれっぽい答えを書いてしまいますが、

  FindStr = "2"

の部分を

  FindStr = UserForm1.TextBox1.Text

のように、ユーザーフォーム内に配置したテキストボックスの Text プロパティを参照するように変更します。
    • good
    • 0
この回答へのお礼

できました!大変参考になりました。ご回答ありがとうございます。

お礼日時:2007/10/26 09:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!