Excel VBA質問箱 IV

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

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


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

【76285】複数回連続して検索したいが上手くゆきません ペンネーム船長 14/10/27(月) 22:49 質問[未読]
【76287】Re:複数回連続して検索したいが上手くゆき... 独覚 14/10/28(火) 9:20 発言[未読]
【76307】Re:複数回連続して検索したいが上手くゆき... ペンネーム船長 14/10/29(水) 22:38 回答[未読]
【76309】Re:複数回連続して検索したいが上手くゆき... γ 14/10/30(木) 7:33 発言[未読]
【76329】Re:複数回連続して検索したいが上手くゆき... ペンネーム船長 14/10/31(金) 0:10 回答[未読]
【76330】Re:複数回連続して検索したいが上手くゆき... γ 14/10/31(金) 3:04 発言[未読]
【76338】Re:複数回連続して検索したいが上手くゆき... ペンネーム船長 14/11/1(土) 13:57 お礼[未読]

【76285】複数回連続して検索したいが上手くゆきま...
質問  ペンネーム船長  - 14/10/27(月) 22:49 -

引用なし
パスワード
   【質問】
連続して検索を行おうとすると、2回目の検索が無視されてしまします。
どのような記述をすれば良いか教えて下さい。

【詳細説明】
複数のシートがあります。
1回目に商品1があるかどうか始めのシートからチェックしてゆきます。
商品1があった場合、その行のG列に1があるか否かを調べます。
もし、1があったとき次に商品2があるかどうか始めのシートから調査したいのですが、
2回目の検索は無視されてしまいます。
どのような記述をすれば良いか教えて下さい。

Private Sub CommandButton1_Click()
On Error Resume Next 'エラーを無視して進む
Dim sh As Worksheet
Dim obj As Range
Dim obj2 As Range
Dim w As String

For Each sh In Worksheets
     
  Set obj = sh.Cells.Find(what:="商品1") '1回目の検索

  w = obj.Offset(0, 7).Value 'G列
       
  If w = "1" Then
  Set obj = Nothing '変数をクリアさせる⇒効果なし
  Set obj = sh.Cells.Find(what:="商品2") '続けて2回目の検索⇒NG
  End If
  w = ""

  Next sh

End Sub

【76287】Re:複数回連続して検索したいが上手くゆ...
発言  独覚  - 14/10/28(火) 9:20 -

引用なし
パスワード
   ▼ペンネーム船長 さん:

>  w = obj.Offset(0, 7).Value 'G列

Offsetは自分自身を返す場合は「Offset(0,0)」右に「7」ということはobjがA列でも
「H列」になってG列にはなりようがないけども。

ブレーク行やステップイン(一行実行)などのデバッグ方法を覚えるといいよ。

【76307】Re:複数回連続して検索したいが上手くゆ...
回答  ペンネーム船長  - 14/10/29(水) 22:38 -

引用なし
パスワード
   大変失礼しました。
検索する商品はD列にあり、K列に1階にある商品は「1」と入れてあります。
よって
>>  w = obj.Offset(0, 7).Value 'G列
ではなく
   w = obj.Offset(0, 7).Value 'K列
でした。
申し訳ありません。

「商品1」がD列にあり、K列に「1」があるとき、次に「商品2」を探す。
D列から数えて7つ目がK列になります。

2回目の検索が無視されてしまいます。

【76309】Re:複数回連続して検索したいが上手くゆ...
発言  γ  - 14/10/30(木) 7:33 -

引用なし
パスワード
   > 次に商品2があるかどうか始めのシートから調査したい
ということなら、「始めから」ということにはなっていませんね。

今のコードに手を入れるなら、
商品1が見つかったとき、新たに、For Nextループで各シートを
検索することになりますね。

ただし、商品1や商品2は複数あるのかどうかにもよって
処理が変わってくるかも、知れません。
複数ある場合、いわば掛け算で何度も検索する必要があるのか、
単に、商品1,商品2をそれぞれ単独で検索してよいのではないですか?

そうした条件をもう少し検討されたほうがよいでしょう。

【76329】Re:複数回連続して検索したいが上手くゆ...
回答  ペンネーム船長  - 14/10/31(金) 0:10 -

引用なし
パスワード
   商品1も商品2も1シートにひとつしかありません。
しかし、複数のシートに登録されています。
商品1のある行のK列には、必ず「1」「2」「3」「4」「5」のいずれかの数字があります。
下記のように1回目の検索に使う変数と2回目に使う変数を変えても2回目の検索
が無視されてしまいます。
なお、商品1も商品2もD列に登録されています。

Private Sub CommandButton1_Click()
On Error Resume Next 'エラーを無視して進む
Dim sh As Worksheet
Dim sh2 As Worksheet
Dim obj As Range
Dim obj2 As Range
Dim w As String

For Each sh In Worksheets

  Set obj = sh.Cells.Find(what:="商品1") '1回目の検索

  w = obj.Offset(0, 7).Value 'K列
  
  If w = "1" Then  ’wが1のとき2回目の検索を実行する
    For Each sh2 In Worksheets
      Set obj2 = sh2.Cells.Find(what:="商品2") '続けて2回目の検索⇒NG
    Next sh2
  End If
  w = ""

Next sh

End Sub

【76330】Re:複数回連続して検索したいが上手くゆ...
発言  γ  - 14/10/31(金) 3:04 -

引用なし
パスワード
   こんにちは。
> 2回目の検索が無視されてしまいます。
このことは、何をもってそう判断されているのでしょうか。
今のコードでは、それを判断できるものはないと思いますが。

簡単な例を作って、ステップ実行して確認しておられますか?
本来、マッチする場面でどのようなことが起きているのでしょうか。
そのことを教えて下さい。

・一回目はマッチしますか?
・その時のwの値は何ですか?
・マッチしたとき、再度、検索をする処理を通っていますか?
・その検索で、各シートでどんな振る舞いがみられるのですか?
・マッチしないとしたら、そのマッチすべきセルには何が入っていますか?
 数字の全角半角とか間違いないですか?

なお、
(1)
>On Error Resume Next 'エラーを無視して進む
これは何を目的に入れているのでしょうか。
マッチの有無を判定するには、
結果が Nothing であるかどうかで判定すれば済むことです。

今回は影響がないかもしれませんが、
本来、エラーになるべき時に、エラーになりませんから、
少なくともデバッグ中は、「百害あって一利なし」です。
重要な情報を隠すだけの効果しかありません。
仮に使う場合も、できるだけ早い時点で、
On Error Goto 0 としておくべきです。

(2)
Findの引数はもっと多いはずですが、普通は省略しないほうがよろしいでしょう。
以前の条件をそのまま引き継いでしまうからです。
この場合も、それが原因である可能性は低いかもしれませんが。

【76338】Re:複数回連続して検索したいが上手くゆ...
お礼  ペンネーム船長  - 14/11/1(土) 13:57 -

引用なし
パスワード
   γさん

いつもお世話になっています。

1)Findの引数を記述しました。文字の属性に左右されないよう記述したら、2回目も検索出来ました。

2)「On Error Resume Next 」を外すと、objのある行が実行時エラー91がでていたのですが、検索結果がNothingの時の処理が出来ていなかったことに気付きました。
下記のように記述を直しました。

3)シートの商品の構成をよく見ると、商品1と商品2は同じシートにあることが分りました。よって、ワークシート変数shとsh2と区別せず、shのみとしました。

何れもγさんのアドバイスで気付けた事です。
本当に有難う御座いました。

Private Sub CommandButton1_Click()
Dim sh As Worksheet
Dim obj As Range
Dim obj2 As Range
Dim w As String

For Each sh In Worksheets
  Set obj = sh.Cells.Find(what:="商品1", LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, MatchByte:=False)            '1回目の検索
  If Not obj Is Nothing Then
    w = obj.Offset(0, 7).Value   'K列
    If w = "1" Then
      Set obj2 = sh.Cells.Find(what:="商品2", LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False, MatchByte:=False)  ’2回目の検索
      MsgBox ”商品2が検索できました”
    End If
  End If
  w = ""
Next sh
End Sub

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