質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

3420閲覧

Excel,VBA 連続検索のコードを作成したい

abc-.-cba

総合スコア6

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2020/03/09 08:23

編集2020/03/10 01:13

いつもお世話になっております。
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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mattuwan

2020/03/10 03:42

うお、シート上の話でしたか^^;;
abc-.-cba

2020/03/10 07:10

mattuwan様 ご回答ありがとうございます。 同じ作業はプロシージャを分ければ再利用できるのですね。勉強になります。 Userformで使用する際はぜひ参考にさせて頂きます。
mattuwan

2020/03/10 07:38

Userformでなくても、使える場面では使ってください。
abc-.-cba

2020/03/10 09:10

mattuwan様 これから色々な機能を付けていこうと思っておりますので使える場面では参考にさせて頂きます。 質問させて頂いた内容は完成しました。ご回答ありがとうございました。
guest

0

最終的にD列には同じ商品名が複数存在するのでコマンドボタンをクリックする度に検索を続けて行えるようにしたいです。

まずはFindNextメソッドについて理解してから、コードを見直してください。

【エクセルVBA】FindNextメソッドで指定範囲内の検索条件にヒットする値をすべて取得する方法

あと、どのような動作にしたいのか、具体的な仕様を明確にしましょう。

このコードはユーザーフォーム上のコードでしょうか。
ユーザーフォームは、モードレスなのか、モーダルなのか、どちらでしょうか。

最初に検索ボタンをクリックしたら最初に一致したセルへ移動して、
続けてクリックしたら次に一致するセルへ移動するということでしょうか。
最後まで検索したら、どうするのでしょうか。

Textbox1 と Textbox2 に同じ値を表示する意味があるのでしょうか。

投稿2020/03/09 10:56

編集2020/03/09 12:14
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abc-.-cba

2020/03/10 01:25

hatena19様 ご意見ありがとうございます。 あと、どのような動作にしたいのか、具体的な仕様を明確にしましょう。 >失礼しました。動作としては  TextBox1の値をシートD列から検索→最初にヒットしたセルを選択→  検索する度にヒットするセルを上から選択→最後まで検索し終わったら「"検索終了"」  のメッセージ表示→TextBox1の値をクリアする。  TextBox2には現在選択されているセルの値を表示させる。  の流れを想定しています。 このコードはユーザーフォーム上のコードでしょうか。 ユーザーフォームは、モードレスなのか、モーダルなのか、どちらでしょうか。 >ユーザーフォームは使用しておりません。  シート状にActiveXコントロールを使用して作成しております。 最初に検索ボタンをクリックしたら最初に一致したセルへ移動して、 続けてクリックしたら次に一致するセルへ移動するということでしょうか。 最後まで検索したら、どうするのでしょうか。 >はい。その通りです。最後まで検索したらの処理を考えておりませんでした。  「"検索終了"」等のメッセージを表示させたいです。 Textbox1 と Textbox2 に同じ値を表示する意味があるのでしょうか。 >Textbox2に表示された商品名の担当者にOutlookにてメールを作成する仕組みを  別で作成していますのでそちらに使用する予定です。
hatena19

2020/03/10 01:57

検索した後、検索結果をどのように利用するかによって、最適なUIも変わってきます。 それを吟味する必要があるように感じます。 例えば、 > 検索する度にヒットするセルを上から選択 > TextBox2には現在選択されているセルの値を表示させる。 とのことですが、これは、TextBox1 の値と同じになりますよね。 ということは検索終了までまったく変化することはないです。 これは必要ですか? 検索結果をどのように利用するかにもよりますが、 1回ボタンをクリックしたら、TextBox1の値をすべて選択した状態にする。 というUIも考えられます。 これなら、何度もボタンをクリックする必要はなく、かつ、どのセルが一致しているかも一目瞭然です。
hatena19

2020/03/10 02:37

LookAt:=xlPart を見落としてました。部分一致での検索なのでTextBox2の存在意義はありますね。
abc-.-cba

2020/03/10 07:23

hatena19様 ご回答ありがとうございます。 最終的に以下の2つの検索結果を考えております。 1.TextBox1の値をシートから検索後にTextBox2に表示されている商品の担当者にメール作成 2.TextBox1の値をシートから検索するだけ。検索終了後は「"検索終了"」等のメッセージを表示 1については完成しました。 現在は2について作成しているところです。
guest

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

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abc-.-cba

2020/03/09 09:35

早急なご回答ありがとうございます。 早速訂正頂いたコードを試しました。 結果、下記処理で躓きました。 'Textbox1の内容をクリアする TextBox1 = Clear Textbox2 = Clear 検索ボタンをクリックするとテキストボックスの値がクリアされるので連続検索が不可能でした。 試しに上記のコードを抜くと連続検索出来ました。 この場合、テキストボックスの値をクリアする方法はありませんでしょうか?
ttyp03

2020/03/09 09:49

If word <> TextBox1 Then これを If Trim(TextBox1.Text) <> "" Then これでいけるかな? word変数の定義、処理は消してください。 余談ですが「Clear」って空文字か何かでしょうか?
abc-.-cba

2020/03/10 01:09

ttyp03様 ご回答ありがとうございます。 教えて頂きましたコードに変更しましたが、 文字検索→テキストボックスの値がクリア→"商品名を入力してください" の処理順番になり連続検索できませんでした。 現在のコードを質問に記載させて頂きました。 clearは元々TextBox1 = Clearでテキストボックスの値そのものをクリアしていました。 次回検索時に便利なのでテキストボックスの値を空にしたいと思っております。
abc-.-cba

2020/03/10 01:14

よくよく考えると連続検索中にクリアは不可能ですかね? であれば別でクリアを実行するコマンドボタンを作成しようと思います。
ttyp03

2020/03/10 01:45

> よくよく考えると連続検索中にクリアは不可能ですかね? あまり良いUIではないですよね。 消さない方向で調整した方が変な実装をしなくて済むと思います。 > clearは元々TextBox1 = Clearでテキストボックスの値そのものをクリアしていました。 いや、Clearって変数ですよね?空文字が入っているんですか?って質問です。
abc-.-cba

2020/03/10 07:30

ttyp03様 ご回答ありがとうございます。 clearについては別で作成することにしました。 認識が違っていました。すみません。はい。空文字が入っています。
ttyp03

2020/03/10 08:14

では最初に回答した方法でできそうですね。 というかできてましたね。
abc-.-cba

2020/03/10 09:09

ttyp03 はい、コードのご提示を頂き完成しました。 本当にありがとうございました。 これから色々な機能を付けていこうと思っています。 VBAの学習に励みます。 この度は、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問