いつもお世話になっております。
Excel、VBAの検索コードの作成で躓いております。
【やりたいこと】
「Textbox1に入力した商品名をシート1のD列と照合し同じ値があれば該当セルまで移動&Textbox2に表示。」
ここまでは作成できました。
最終的にD列には同じ商品名が複数存在するのでコマンドボタンをクリックする度に検索を続けて行えるようにしたいです。(Textbox2も連動する)
コードについてご教授頂けたらと思います。
宜しくお願い致します。
【オブジェクト】
Textbox1=商品名を入力する
Textbox2=Textbox1に入力された商品名を表示する
CommandButton1=クリックする度にTextbox1に入力された商品名をシートのB列と照合する
【コード】
Private Sub 検索_Click()
Static rngSearch As Range Static word As String Dim F As Variant Dim myRange As Range If TextBox1 = "" Then MsgBox "「商品名」を入力してください。" Else
Set myRange = ActiveSheet.Range("D:D") 'D列から値を検索
If word <> TextBox1 Then Set rngSearch = myRange.Find(What:=TextBox1, LookAt:=xlPart) word = TextBox1 Else Set rngSearch = myRange.FindNext(rngSearch) End If If Not rngSearch Is Nothing Then rngSearch.Select 'ヒットした箇所を選択する TextBox2 = rngSearch.Offset '選択しているセルをTextBox2に表示する Else MsgBox "見つかりませんでした。" End If End If
End Sub
TextBox1
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ExcelVBA
1Option Explicit 2 3Dim mrngFind As Range 4Dim mrngAfter As Range 5Dim mFlg As Boolean 6 7Private Sub CommandButton1_Click() 8 Dim sKey As String 9 Dim c As Range 10 Dim sProm As String 11 12 s = Me.TextBox1.Text 13 If Len(s) = 0 Then WayOut 14 15 Set c = mrngFind.Find(s, mrngAfter, , xlPart) 16 17 If c Is Nothing Then WayOut 18 19 Me.Label1.Caption = c.Value 20 Me.CommandButton1.Caption = "次へ" 21 Set mrngAfter = c 22 Exit Sub 23 24WayOut: 25 If Len(s) > 0 Then 26 sProm = s & "が見つかりませんでした" 27 Else 28 sProm = "検索文字入力欄が空欄です。" 29 End If 30 31 msgbox sProm 32 Setオブジェクト初期化 33End Sub 34 35Private Sub TextBox1_AfterUpdate() 36 mFlg = True 37 Setオブジェクト初期化 38End Sub 39 40Private Sub UserForm_Initialize() 41 With Me.Label1 42 .BackColor = vbWhite 43 .SpecialEffect = fmSpecialEffectSunken 44 End With 45 46 Setオブジェクト初期化 47End Sub 48 49Private Sub Setオブジェクト初期化() 50 Set mrngFind = ThisWorkbook.Worksheets(1).Range("D:D") 51 Set mrngAfter = mrngFind(mrngFind.Count) 52 If mFlg = False Then Me.TextBox1.Text = "" 53 Me.Label1.Caption = "" 54 Me.CommandButton1.Caption = "検索" 55 mFlg = False 56End Sub
やりたいことはこんな感じですかね?
結果の表示は選択や編集はさせたくないのでラベルにしてます。
見た目はテキストボックスと同じに出来ます。
Userform上に
Textbox1
Label1
CommandButton1
があるものとして書いてます。
時間が無くて動作確認はしてないので、バグが多数あるかも知れませんが、
どんな時に何をするというのを考えて、
同じ作業は、別途プロシージャを分けて再利用できるようにします。
各プロシージャでまたがって内容を保持しておいたり、変更したい場合は
(同じプロシージャを再度実行する時も)、
モジュールレベルで変数を宣言します。
参考になれば。。。
シート上用に改変しました。
ExcelVBA
1Option Explicit 2 3Dim mrngFind As Range 4Dim mrngAfter As Range 5 6Private Sub CommandButton1_Click() 7 Dim c As Range 8 Dim sKeyWord As String 9 10 sKeyWord = Me.TextBox1.Text 11 If mrngFind Is Nothing Then Setオブジェクト初期化 12 Set c = mrngFind.Find(sKeyWord, mrngAfter, , xlPart) 13 If c Is Nothing Then GoTo WayOut 14 With c 15 Application.Goto .Cells 16 Me.Label1.Caption = .Value 17 End With 18 Me.CommandButton1.Caption = "次へ" 19 20 Set mrngAfter = c 21 Exit Sub 22 23WayOut: 24 MsgBox sKeyWord & "は見つかりませんでした。", vbExclamation 25 Setオブジェクト初期化 26End Sub 27 28Private Sub TextBox1_Change() 29 Me.CommandButton1.Enabled = Len(Me.TextBox1.Text) 30 Me.Label1.Caption = "" 31End Sub 32 33Private Sub TextBox1_LostFocus() 34 mFlg = False 35End Sub 36 37Private Sub Setオブジェクト初期化(Optional ByVal flg As Boolean = True) 38 If flg Then Me.TextBox1.Text = "" 39 40 Set mrngFind = Me.Range("D:D") 41 Set mrngAfter = mrngFind(mrngFind.Count) 42 Me.CommandButton1.Caption = "検索" 43 mFlg = False 44End Sub
動作確認してたら、わけわかんなくなったので、
期待通りの動きになってないかも^^;
参考になれば。。。(ならないかも^^;)
※注
検索ボタンは何も入力されてない時はメッセージを出すのではなく、
そもそもボタンを押せないようにするといいです。
やたらとメッセージを出されると、使う側はうるさいし、
クリックをいちいち余分にしないといけなくなるので。
プロパティウィンドウで、
Enabledプロパティの初期値をFalseにしておきます。
Labelコントロールは、
コントロールの選択から探してください。
投稿2020/03/10 03:41
編集2020/03/10 09:17総合スコア2163
0
最終的にD列には同じ商品名が複数存在するのでコマンドボタンをクリックする度に検索を続けて行えるようにしたいです。
まずはFindNextメソッドについて理解してから、コードを見直してください。
【エクセルVBA】FindNextメソッドで指定範囲内の検索条件にヒットする値をすべて取得する方法
あと、どのような動作にしたいのか、具体的な仕様を明確にしましょう。
このコードはユーザーフォーム上のコードでしょうか。
ユーザーフォームは、モードレスなのか、モーダルなのか、どちらでしょうか。
最初に検索ボタンをクリックしたら最初に一致したセルへ移動して、
続けてクリックしたら次に一致するセルへ移動するということでしょうか。
最後まで検索したら、どうするのでしょうか。
Textbox1 と Textbox2 に同じ値を表示する意味があるのでしょうか。
投稿2020/03/09 10:56
編集2020/03/09 12:14総合スコア34075
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/10 01:57
2020/03/10 02:37
2020/03/10 07:23
0
ベストアンサー
まったく動作確認していませんが、こんな感じでどうでしょうか。
TextBox1とFindの結果を静的変数に保持しています(グローバル変数でも可)
VBA
1Private Sub 検索_Click() 2 3 Static rngSearch As Range 4 Static word As String 5 6 '変数の宣言 7 Dim F As Variant 8 Dim myRange As Range 9 10 'Textbox1に値が入ってなければ 11 If Text_Server_Input = "" Then 12 '"「商品名」を入力してください。"と表示 13 MsgBox "「商品名」を入力してください。" 14 Else 15 16 Set myRange = ActiveSheet.Range("D:D") 17 18 If word <> TextBox1 Then 19 Set rngSearch = myRange.Find(What:=TextBox1, LookAt:=xlPart) 20 word = TextBox1 21 Else 22 Set rngSearch = myRange.FindNext(rngSearch) 23 End If 24 25 'Textbox1の値がシート上にあれば 26 If Not rngSearch Is Nothing Then 27 'ヒットした箇所を選択する 28 rngSearch.Select 29 'Textbox2にTextbox1の値を表示する 30 Textbox2 = TextBox1 31 32 Else 33 34 'ヒットしなければ"見つかりませんでした。"と表示 35 MsgBox "見つかりませんでした。" 36 37 'IFステートメント終了 38 End If 39 'IFステートメント終了 40 End If 41 'Textbox1の内容をクリアする 42 TextBox1 = Clear 43 Textbox2 = Clear 44 45End Sub
投稿2020/03/09 09:10
総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/09 09:35
2020/03/09 09:49
2020/03/10 01:09
2020/03/10 01:14
2020/03/10 01:45
2020/03/10 07:30
2020/03/10 08:14
2020/03/10 09:09
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/10 03:42
2020/03/10 07:10
2020/03/10 07:38
2020/03/10 09:10