Excel VBA質問箱 IV

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

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


5568 / 13645 ツリー ←次へ | 前へ→

【50093】検索の方法 ぽっぷ 07/7/8(日) 20:21 質問[未読]
【50094】Re:検索の方法 かみちゃん 07/7/8(日) 20:48 発言[未読]
【50110】Re:検索の方法 ぽっぷ 07/7/9(月) 21:36 お礼[未読]
【50115】Re:検索の方法 かみちゃん 07/7/10(火) 0:02 発言[未読]

【50093】検索の方法
質問  ぽっぷ  - 07/7/8(日) 20:21 -

引用なし
パスワード
   商品の検索をするのに作ってみたんですが思うようにいかないのでアドバイスお願いします。

A列に入力してある商品を順番に検索、表示して、目的のものが出てきた時にその行のF列をアクティブにして終了したいのです。
下のものでは目的の商品が出てきた後に更に1つ検索して終了してしまいます。

Dim mystr As String
Dim myrange As Range
Dim myadrs As String
Dim myans As Integer

mystr = Application.InputBox("品名入力")
If mystr = "false"Then
  Exit Sub
End If

Set myrange = Range("A1:A10000").Find(mystr)

If myrange Is Nothing Then
  MsgBox "該当なし"
Else
  myadrs = myrange.Address
  Do
   myans = MsgBox("検索します", vbOKCancel + vbInformation)
   MsgBox myrange.Offset(0, 0).Value, vbOKCancel
   If myans =vbCancel Then
    myrange.Offset(0, 5).Select
    Exit Sub
   Else
    myrange.Offset(0, 5).Select
   End If
   Set myrange = Range("A1:A10000").FindNext(myrange)
  Loop Until myrange.Address = myadrs
   MsgBox "最後まで検索しました"
  End If
End Sub

【50094】Re:検索の方法
発言  かみちゃん  - 07/7/8(日) 20:48 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>A列に入力してある商品を順番に検索、表示して、目的のものが出てきた時にその行のF列をアクティブにして終了したいのです。
>下のものでは目的の商品が出てきた後に更に1つ検索して終了してしまいます。

Do、Loop、FindNextなどが余計なような感じがします。

以下のような感じでできるとのではないでしょうか?

Set myrange = Range("A1:A10000").Find(mystr)

If myrange Is Nothing Then
 MsgBox "該当なし"
Else
 myrange.Offset(, 5).Activate
 MsgBox ActiveCell.Address
End If

【50110】Re:検索の方法
お礼  ぽっぷ  - 07/7/9(月) 21:36 -

引用なし
パスワード
   かみちゃんさん、ありがとうございます。

>Do、Loop、FindNextなどが余計なような感じがします。
>
>以下のような感じでできるとのではないでしょうか?
>
>Set myrange = Range("A1:A10000").Find(mystr)
>
>If myrange Is Nothing Then
> MsgBox "該当なし"
>Else
> myrange.Offset(, 5).Activate
> MsgBox ActiveCell.Address
>End If

上のコードでやってみたのですが、列中の上の一件のみが検索されて終了しますよね?
説明が下手で申し訳ありません。

部分的なキーワードで検索したいので、商品がいくつかHitした時に順番に見ていって、目的の商品が出た時にボタンで処理を分岐させたいのです。(次を検索するか/検索を終了するか)。
目的の商品がメッセージで出た時にボタンを押すと検索を終了してF列をアクティブにしたいと考えているのですが、その後も余計に検索してしまいますのでどうしたらよいのか、と。

よろしくお願いします。

【50115】Re:検索の方法
発言  かみちゃん  - 07/7/10(火) 0:02 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>部分的なキーワードで検索したいので、商品がいくつかHitした時に順番に見ていって、目的の商品が出た時にボタンで処理を分岐させたいのです。(次を検索するか/検索を終了するか)。
>目的の商品がメッセージで出た時にボタンを押すと検索を終了してF列をアクティブにしたいと考えているのですが、その後も余計に検索してしまいますのでどうしたらよいのか、と。

もしかして、以下のようなコードにしたらいかがでしょうか?

Sub Sample2()
 Dim mystr As String
 Dim myrange As Range
 Dim myadrs As String
 Dim myans As Integer

 mystr = Application.InputBox("品名入力")
 If mystr = "false" Then
  Exit Sub
 End If

 With Range("A1:A10000")
  Set myrange = .Find(mystr, .Cells(.Rows.Count))
 End With
 
 If myrange Is Nothing Then
  MsgBox "該当なし"
 Else
  myadrs = myrange.Address
  Do
'   myans = MsgBox("検索します", vbOKCancel + vbInformation)
'   MsgBox myrange.Offset(0, 0).Value, vbOKCancel
    myans = MsgBox("次のものが検索されました。検索を続けます。" & vbCrLf & " " & myrange.Offset(0, 0).Value, vbOKCancel + vbInformation)
   If myans = vbCancel Then
    myrange.Offset(0, 5).Select
    Exit Sub
'   Else
'    myrange.Offset(0, 5).Select
   End If
   Set myrange = Range("A1:A10000").FindNext(myrange)
  Loop Until myrange.Address = myadrs
  MsgBox "最後まで検索しました"
 End If
End Sub

要するに、
   myans = MsgBox("検索します", vbOKCancel + vbInformation)
   MsgBox myrange.Offset(0, 0).Value, vbOKCancel
と2回MsgBoxが表示され、1回目の「検索します」で毎回「OK」をクリックして
いるのではないでしょうか?
そうすると、
   If myans = vbCancel Then
ではなくなり、「その後も検索」します。

また、
   MsgBox myrange.Offset(0, 0).Value, vbOKCancel
で、目的の商品だった場合、「キャンセル」をクリックするのだと思いますが、
変数myansに代入していないから、
   If myans = vbCancel Then
が効いていないということです。

上記コードは、その部分を修正した内容にしていますので、ご確認ください。

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