Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8314 / 13646 ツリー ←次へ | 前へ→

【33858】ユーザーフォームで検索結果をラベルに表示するには BOX 06/1/22(日) 20:57 質問[未読]
【33883】Re:ユーザーフォームで検索結果をラベルに... Jaka 06/1/23(月) 11:03 回答[未読]
【34077】Re:ユーザーフォームで検索結果をラベル... BOX 06/1/25(水) 23:52 お礼[未読]

【33858】ユーザーフォームで検索結果をラベルに表...
質問  BOX  - 06/1/22(日) 20:57 -

引用なし
パスワード
   こんばんは、BOXです。
以前33399で質問し、ご回答いただいてその後丸投げの状態で
大変反省しております。FINDメソッドについて自分なりに
勉強してみました。そしてPonPonさんのコードを参考にして
下のようなコードを書いたのですがテキストボックスに入力した
文字列を部分一致検索で1個目2個目までは検索するのですが
3個目以上ある場合のコマンドボタン2を押したときのコード
が書けません。すべて検索して最初の検索した文字列と同じ
文字列をヒットした時に検索終了のメッセージボックスを
表示し終わりとしたいのです。どなたか教えて下さい。
よろしくお願いいたします。
VBAでしたいこと
テキストボックスに施設名の文字列を入力し
コマンドボタン1を押すとテキストボックスの
文字列をC6:P1000までの範囲で施設名を部分一致で検索し
そのヒットしたセルのA列コードをラベル5にB列地名をラベル6に
C列からP列のヒットした文字列をラベル7に表示し
コマンドボタン2を押と下のシート構成でいくとC1を再度ボタン2を
押とF2をと検索しC1になった時検索終了とする。

シートの構成
A    B  C    D     E     F・・・   P
 コード  地名  基点  施設名1   施設名2  施設名3・・・施設名13
1.1234 東京 東京駅 東京タワー 国会議事堂 東京都庁 
2.1235
3.1236


100

ユーザーフォームの構成

テキストボックス コマンドボタン1
         コマンドボタン2

ラベル5 ラベル6 ラベル7
考えてみたコード
Private Sub CommandButton1_Click()
  Dim 最初に見つかったセル As Range
  Dim 次に見つかったセル As Range
 Sheets("旅費").Select
 With Range("C6:P1000")
  Set 最初に見つかったセル = .Find(What:=Me.TextBox1.Value, LookAt:=xlPart, SearchOrder:=xlByColumns)
  If Not 最初に見つかったセル Is Nothing Then
       Label5.Caption = Cells(最初に見つかったセル.Row, 1)
       Label6.Caption = Cells(最初に見つかったセル.Row, 2)
       Label7.Caption = Range(最初に見つかったセル.Address)
       Range(最初に見つかったセル.Address).Activate
      Else
      MsgBox "そのような施設はありません。"
      Exit Sub
      End If
  End With
End Sub
Private Sub CommandButton2_Click()
       Sheets("旅費").Select
       With Range("C6:P1000")
       Set 最初に見つかったセル = .Find(What:=Me.TextBox1.Value, LookAt:=xlPart, SearchOrder:=xlByColumns)
       Set 次に見つかったセル = .FindNext(最初に見つかったセル)
       If Not 最初に見つかったセル Is Nothing Then
       Label5.Caption = Cells(次に見つかったセル.Row, 1)
       Label6.Caption = Cells(次に見つかったセル.Row, 2)
       Label7.Caption = Range(次に見つかったセル.Address)
       Range(次に見つかったセル.Address).Activate
      
      ElseIf 次に見つかったセル <> 次に見つかったセル Then
        Set 次に見つかったセル = .FindNext(次に見つかったセル)
        
        Label5.Caption = Cells(次に見つかったセル.Row, 1)
        Label6.Caption = Cells(次に見つかったセル.Row, 2)
        Label7.Caption = Range(次に見つかったセル.Address)
        Range(次に見つかったセル.Address).Activate
        Else
       MsgBox "そのような施設はありません。"
      Exit Sub
      End If
    MsgBox "検索終了。この文字を含む施設はすべて検索しました。"
  End With
End Sub

【33883】Re:ユーザーフォームで検索結果をラベル...
回答  Jaka  - 06/1/23(月) 11:03 -

引用なし
パスワード
   1、最初に見つけたセル
2、次に見つけるセルは、最初に見つかったセルの後から検索。
3、3番目に見つけるセルは、2番目に見つけたセルの後から検索。
4、4番目に見つけるセルは、2番目に見つけたセルの後から検索。
5、 ・
6、 ・
7、 ・

尚、2番目3番目が無い場合は、1番最初見見つかったセルに戻る。
1度、見つけたセルを選択するコードを書いて、ステップ実行してみると、ぐるぐる回っているのが解ると思います。
見つけたセルの後から検索、だから見つけたセルのアドレスをどこかにひかえておく事
FindNext(after:=Range(前に見つけたセルアドレス))
詳しくはヘルプに載っていると思います。

【34077】Re:ユーザーフォームで検索結果をラベル...
お礼  BOX  - 06/1/25(水) 23:52 -

引用なし
パスワード
   Jakaさんへ:BOXです。
アドバイスありがとうございました。喜んで下さい。完成しました。
ヘルプのDo〜Loopは試したことがあったのですが一気に最後の値を表示し
これは使えないなと捨てていました。ところが、ループの間にメッセージ
ボックスを入れるとループを止められる事が解り、(これは収穫でした)
早速試してみました。実にOKでした。したがって、コマンドボタン2は
必要がなくなり削除しました。かみちゃんさん、PonPonさん、Jakaさん
本当にありがとうございました。VBAは奥が深いです。面白さが増しました。
ちょっとはずかしいのですが、VBAの仲間のためにコードをUPしておきます。
どなたかの、参考になればうれしいです。
今回初めての投稿でしたので、不慣れで不躾なことが多々あったかと思いますがお許し下さい。また、解らないことがあったら投稿します。よろしくご指導願います。
以下コードです。
Private Sub CommandButton1_Click()
    
  Dim 最初に見つかったセル As Range
  Dim 次に見つかったセル As Range
  Dim R As String
  
 Sheets(Sheet1).Select
 With Range("C6:Z1000")
  
  Set 最初に見つかったセル = .Find(What:=Me.TextBox1.Value, LookAt:=xlPart, SearchOrder:=xlByColumns)
  
    If Not 最初に見つかったセル Is Nothing Then
     
       Set 次に見つかったセル = 最初に見つかったセル
            
        Label5.Caption = Cells(最初に見つかったセル.Row, 1)
        Label6.Caption = Cells(最初に見つかったセル.Row, 2)
        Label7.Caption = Range(最初に見つかったセル.Address)
        Range(最初に見つかったセル.Address).Activate
        R = MsgBox("【" & Me.TextBox1.Value & "】" & " を含むセルが見つかりました。次を表示しますか?", 36)
            
      Do
      
       Set 次に見つかったセル = .FindNext(after:=次に見つかったセル)
       If 次に見つかったセル Is Nothing Or 次に見つかったセル = 最初に見つかったセル Then Exit Do
       
        Label5.Caption = Cells(次に見つかったセル.Row, 1)
        Label6.Caption = Cells(次に見つかったセル.Row, 2)
        Label7.Caption = Range(次に見つかったセル.Address)
        Range(次に見つかったセル.Address).Activate
        R = MsgBox("【" & Me.TextBox1.Value & "】" & " を含むセルが見つかりました。次を表示しますか?", 36)
       
        If R = 7 Then
        Exit Do
        End If
      
      Loop
      
      R = MsgBox("検索終了 " & "【" & Me.TextBox1.Value & "】" & " を含むセルはすべて表示しました。", 48)
      Label5.Caption = ""
      Label6.Caption = ""
      Label7.Caption = ""
      TextBox1.Value = ""
      検索フォーム.Hide
      
      Exit Sub
     
    End If
      R = MsgBox("この文字を含む施設は登録されていません。", 16)
      TextBox1.Value = ""

  End With

End Sub

8314 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free