Excel VBA質問箱 IV

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

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


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

【74423】inputboxで複数条件の検索 isausa 13/6/10(月) 10:52 質問[未読]
【74424】Re:inputboxで複数条件の検索 UO3 13/6/10(月) 12:35 発言[未読]
【74425】Re:inputboxで複数条件の検索 isausa 13/6/10(月) 13:17 質問[未読]
【74426】Re:inputboxで複数条件の検索 isausa 13/6/10(月) 13:46 質問[未読]
【74427】Re:inputboxで複数条件の検索 UO3 13/6/10(月) 14:04 発言[未読]
【74428】Re:inputboxで複数条件の検索 isausa 13/6/10(月) 15:03 質問[未読]
【74429】Re:inputboxで複数条件の検索 UO3 13/6/10(月) 16:23 発言[未読]
【74430】Re:inputboxで複数条件の検索 13/6/11(火) 7:44 回答[未読]
【74431】Re:inputboxで複数条件の検索 isausa 13/6/12(水) 13:16 質問[未読]
【74432】Re:inputboxで複数条件の検索 UO3 13/6/12(水) 15:04 発言[未読]
【74434】Re:inputboxで複数条件の検索 13/6/13(木) 6:44 回答[未読]
【74435】Re:inputboxで複数条件の検索 isausa 13/6/13(木) 9:51 お礼[未読]

【74423】inputboxで複数条件の検索
質問  isausa  - 13/6/10(月) 10:52 -

引用なし
パスワード
   ご指導お願いいたします。
シート枚数は各年度1枚づつ持っており、今のところ10シートです。一番上に検索シートがあり、検索語をinputoboxで入れると、各年のデータがでるようになっています。つぎはぎですが下記のマクロでうまく動いています。
しかし、現在では、I2に入力された検索語だけが検索ワードなので、inputoboxをもう一つ作り、j2に条件ををもう一つ入れて(AND)で検索したいのですが、方法がわかりません。
どなたかご教授下さい。

Sub 検索()
'
'  Dim X As String, SHX As String
  myR = Range("A" & Rows.Count).End(xlUp).Row + 1
  Range("A6:Q" & myR).ClearContents
  Range("I2").ClearContents
  
  
  X = Application.InputBox(prompt:="検索ワード", Type:=2)
  SHX = "*" & X & "*"
  Range("I2") = SHX


  自シ = ActiveSheet.Name
  検索語 = Range("I2").Value


  For Each mySH In Sheets
    If mySH.Name <> 自シ Then
    
      Set 結果 = mySH.Cells.Find( _
            What:=検索語, _
            LookIn:=xlValues, _
            lookat:=xlWhole)
      If Not 結果 Is Nothing Then
        先頭 = 結果.Address
        Do
          myR = Range("A" & Rows.Count).End(xlUp).Row + 1
          Range("A" & myR).Value = mySH.Name
          Range("B" & myR).Value = 結果.Offset(0, -7).Value
          Range("C" & myR).Value = 結果.Offset(0, -6).Value
          Range("D" & myR).Value = 結果.Offset(0, -5).Value
          Range("E" & myR).Value = 結果.Offset(0, -4).Value
          Range("F" & myR).Value = 結果.Offset(0, -3).Value
          Range("G" & myR).Value = 結果.Offset(0, -2).Value
          Range("H" & myR).Value = 結果.Offset(0, -1).Value
          Range("I" & myR).Value = 結果.Value
          Range("J" & myR).Value = 結果.Offset(0, 1).Value
          Range("K" & myR).Value = 結果.Offset(0, 2).Value
          Range("L" & myR).Value = 結果.Offset(0, 3).Value
          Range("M" & myR).Value = 結果.Offset(0, 4).Value
          Range("N" & myR).Value = 結果.Offset(0, 5).Value
          Range("O" & myR).Value = 結果.Offset(0, 6).Value
          Range("P" & myR).Value = 結果.Offset(0, 7).Value
          Range("Q" & myR).Value = 結果.Offset(0, 8).Value
          
          
          Set 結果 = mySH.Cells.FindNext(結果)
          If 結果.Address = 先頭 Then Exit Do
        Loop
      End If
      
    End If
  Next
End Sub

【74424】Re:inputboxで複数条件の検索
発言  UO3  - 13/6/10(月) 12:35 -

引用なし
パスワード
   ▼isausa さん:

こんにちは

困っておられるのは 2つの条件を2つのInputBoxでいれるところですか?
それとも、いれられて2つの条件で AND 検索するところですか?

前者だとして、1つのInputBox で以下のように処理する手もありますね。
後者だという場合は、これらの2つの検索語が、どのようにセルに入っているのか
その要件を教えてください。 (2つの検索語の順番は不動? とか)

Sub Test()
  Dim s As String
  Dim v As Variant
  
  s = Application.InputBox("検索語を 〇〇〇/□□□ の形式で2つ指定してください", Type:=2)
  If s = "" Then Exit Sub 'キャンセルボタン
  
  v = Split(s, "/")
  If UBound(v) <> 1 Then
    MsgBox "入力の形式が正しくないですよ"
    Exit Sub
  End If
  
  '〇〇〇 と □□□ を使った処理コード
  
  '以下参考
  
  MsgBox v(0) & vbLf & v(1)
  
End Sub

【74425】Re:inputboxで複数条件の検索
質問  isausa  - 13/6/10(月) 13:17 -

引用なし
パスワード
   ▼UO3 さん:
早速のご回答ありがとうございます。
今からやってみようと思っていますが、その前にご質問にお答えしたいと思います。

>
>困っておられるのは 2つの条件を2つのInputBoxでいれるところですか?
>それとも、いれられて2つの条件で AND 検索するところですか?
実はとりかかりからわからなくて両方質問事項の両方がわからないのです。
例えば北海道・・・札幌と北海道・・・釧路という単語が入っている行がいくつかあるとすると、北海道、釧路と二つの検索語で、北海道・・・釧路の行が取り出せるといいなと考えたのです。質問内容がわかりにくくて申し訳ありません。>

【74426】Re:inputboxで複数条件の検索
質問  isausa  - 13/6/10(月) 13:46 -

引用なし
パスワード
   すみません。
一つ書き忘れました。
inputboxで検索した二つの語を、I2とJ2のアドレスに書き出して、それを検索したいと思っています。

【74427】Re:inputboxで複数条件の検索
発言  UO3  - 13/6/10(月) 14:04 -

引用なし
パスワード
   ▼isausa さん:

こんにちは

北海道 といったものを検索する列はきまっていますか?
それとも、どこにあるかわからないということでしょうか?
同じく 釧路 といったものを検索する列はきまっていますか?

それと、このシートにはタイトル行はありますか?
もしタイトル行があって、かつ、それぞれの項目の列が決まっていれば
フィルターオプションやオートフィルターで簡単に抽出できると思いますが?
(手作業でもあっという間ですし、VBAでということなら、それをコード化すればいいんですが)

【74428】Re:inputboxで複数条件の検索
質問  isausa  - 13/6/10(月) 15:03 -

引用なし
パスワード
   ▼UO3 さん:
>
>
>北海道 といったものを検索する列はきまっていますか?
>一応、各シートH列に検索したいデータが入るようにしました。>
>それと、このシートにはタイトル行はありますか?
>タイトル行はあります。しかし各シート3000件から4000件であり、各シートで抽出したデータを検索シート(一番最初の)に、シート名(実はH25、H24、H23と年が入ってます。)と該当の行を抽出して、書き出す様になっており、一覧になるので、見やすいのですが・・・・)
検索語によっては、5〜600件ほどになり、二つの検索でいけば、もっと絞れるかと思ったのですが・・・。

【74429】Re:inputboxで複数条件の検索
発言  UO3  - 13/6/10(月) 16:23 -

引用なし
パスワード
   ▼isausa さん:

I2,J2 は、どのシートですか?
また、ここにセットすることは必須ですか?
それとも、2つのワードで検索できれば、I2,J2へのセットは不要ですか?

それと、
H列に 涼しい北海道の網走市 といったように入っているのですか?
それともH列には 北海道が含まれる字句が、I列に網走が含まれる字句が入っているのですか?

【74430】Re:inputboxで複数条件の検索
回答    - 13/6/11(火) 7:44 -

引用なし
パスワード
   こんにちは。

UO3さんのアドバイスとはちょっとずれますが、
ご要望どおり、インプットボックスを2つ出すのもいいと思います。


VBEに書かれたコードは原則として上から順番に実行されることは
ご存知だと思います。
つまり
sub test
  msgbox "1回目"
  msgbox "2回目"
end sub
となっていれば、メッセージボックスが2回出るわけです。

インプットボックスも事情は同じで
sub test
  inputbox "1回目"
  inputbox "2回目"
end sub
これで2回出ます。

とはいえ、ボックスだけ2回出してみても なんにもならないので
インプットボックスの結果を変数に代入します。
あとはこの変数をつかっていろいろ操作します。
sub test
  Dim 変数1 As String
  Dim 変数2 As String
  
  変数1 = inputbox ("1回目")
  変数2 = inputbox ("2回目")
end sub

※変数は必ず宣言して下さい。
 すべての変数を宣言して下さい。
 
とりあえずここまで。


▼isausa さん:
>ご指導お願いいたします。
>シート枚数は各年度1枚づつ持っており、今のところ10シートです。一番上に検索シートがあり、検索語をinputoboxで入れると、各年のデータがでるようになっています。つぎはぎですが下記のマクロでうまく動いています。
>しかし、現在では、I2に入力された検索語だけが検索ワードなので、inputoboxをもう一つ作り、j2に条件ををもう一つ入れて(AND)で検索したいのですが、方法がわかりません。
>どなたかご教授下さい。
>
>Sub 検索()
>'
>'  Dim X As String, SHX As String
>  myR = Range("A" & Rows.Count).End(xlUp).Row + 1
>  Range("A6:Q" & myR).ClearContents
>  Range("I2").ClearContents
>  
>  
>  X = Application.InputBox(prompt:="検索ワード", Type:=2)
>  SHX = "*" & X & "*"
>  Range("I2") = SHX
>
>
>  自シ = ActiveSheet.Name
>  検索語 = Range("I2").Value
>
>
>  For Each mySH In Sheets
>    If mySH.Name <> 自シ Then
>    
>      Set 結果 = mySH.Cells.Find( _
>            What:=検索語, _
>            LookIn:=xlValues, _
>            lookat:=xlWhole)
>      If Not 結果 Is Nothing Then
>        先頭 = 結果.Address
>        Do
>          myR = Range("A" & Rows.Count).End(xlUp).Row + 1
>          Range("A" & myR).Value = mySH.Name
>          Range("B" & myR).Value = 結果.Offset(0, -7).Value
>          Range("C" & myR).Value = 結果.Offset(0, -6).Value
>          Range("D" & myR).Value = 結果.Offset(0, -5).Value
>          Range("E" & myR).Value = 結果.Offset(0, -4).Value
>          Range("F" & myR).Value = 結果.Offset(0, -3).Value
>          Range("G" & myR).Value = 結果.Offset(0, -2).Value
>          Range("H" & myR).Value = 結果.Offset(0, -1).Value
>          Range("I" & myR).Value = 結果.Value
>          Range("J" & myR).Value = 結果.Offset(0, 1).Value
>          Range("K" & myR).Value = 結果.Offset(0, 2).Value
>          Range("L" & myR).Value = 結果.Offset(0, 3).Value
>          Range("M" & myR).Value = 結果.Offset(0, 4).Value
>          Range("N" & myR).Value = 結果.Offset(0, 5).Value
>          Range("O" & myR).Value = 結果.Offset(0, 6).Value
>          Range("P" & myR).Value = 結果.Offset(0, 7).Value
>          Range("Q" & myR).Value = 結果.Offset(0, 8).Value
>          
>          
>          Set 結果 = mySH.Cells.FindNext(結果)
>          If 結果.Address = 先頭 Then Exit Do
>        Loop
>      End If
>      
>    End If
>  Next
>End Sub

【74431】Re:inputboxで複数条件の検索
質問  isausa  - 13/6/12(水) 13:16 -

引用なし
パスワード
   佳さん
▼UO3 さん:
 佳さん
しばらく時間がなくて、お返事できませんでした。すみません。
>I2,J2 は、どのシートですか?
>また、ここにセットすることは必須ですか?
>それとも、2つのワードで検索できれば、I2,J2へのセットは不要ですか?
>
I2,J2は検索シートです。(各年のシートの検索結果を抽出して転記させるのに使っています。そのI2 AND J2を一つの検索ワードにして各年のH列のデータを抽出して、検索シートに書き出したいのです。

>それと、
>H列に 涼しい北海道の網走市 といったように入っているのですか?
>それともH列には 北海道が含まれる字句が、I列に網走が含まれる字句が入っているのですか?
各シートのH列にデータ検索データを入れていますので、H列に北海道A社札幌出張とか北海道B社来社(釧路)とか入っており、北海道だけで検索するよりももう一つ検索語があったほうが絞りやすいと考えています。
UO3 さん佳さんのアドバイスに従って検索シートのI2,J2に 検索語を表示することはできました。
そこで検索なのですが、
Set 結果 = mySH.Cells.Find( _
>            What:=検索語, _
>            LookIn:=xlValues, _
>            lookat:=xlWhole)
>      If Not 結果 Is Nothing Then
>        先頭 = 結果.Address
の部分でWhat:検索語 AND 検索語1としたら、見事にエラーになってしまいました。
        I2       J2
ここはどうしたらいいのでしょうか。

【74432】Re:inputboxで複数条件の検索
発言  UO3  - 13/6/12(水) 15:04 -

引用なし
パスワード
   ▼isausa さん:

文字列連結は & で行います。
AND だと 論理積 になりますので。

以下、参考になりますでしょうか。
新規ブックに書いてお試しください。

Sub Test()
  Dim f As Range
  Dim c As Range
  Dim wd As String
  Dim r As Range
  
  Cells.Clear
  
  'テストデータ
  Range("H1").Value = "日本国北海道の東の釧路市"   '対象
  Range("H2").Value = "北海道の札幌だよ"
  Range("H3").Value = "北海道B社来社(釧路)"    '対象
  Range("H4").Value = "山形にも釧路ってある?ないよね"
  Range("H5").Value = "釧路は北海道にあるんだよね"
  
  '検索語句のセット
  Range("I2").Value = "北海道"
  Range("J2").Value = "釧路"
  
  '以下処理サンプル
  wd = "*" & Range("I2").Value & "*" & Range("J2").Value & "*"
  Set r = Range("H1", Range("H" & Rows.Count).End(xlUp))
  Set c = r.Find(What:=wd, Lookat:=xlWhole, After:=r.Cells(r.Count))
  If c Is Nothing Then
    MsgBox "みあたりません"
    Exit Sub
  End If
  
  Set f = c
  
  Do
    MsgBox c.Address
    Set c = r.FindNext(c)
  Loop While c.Address <> f.Address
  
End Sub

【74434】Re:inputboxで複数条件の検索
回答    - 13/6/13(木) 6:44 -

引用なし
パスワード
   こんにちは。

Set 結果 = mySH.Cells.Find( _
            What:=検索語, _
            LookIn:=xlValues, _
            lookat:=xlWhole)

ここに出てくるFindというのは、手作業での「検索」機能に相当します。
キーボードで Ctrl + F を押すと出てくるダイアログボックスです。
このコードで行くと「検索する語句」の欄に検索語を入れ
「検索対象」で値を選択、「完全に同一なセルを検索」にチェックを入れる
ことになります。(wholeとは全体という意味)

それでたとえば「北海道」と「網走」の入ったセルを検索するには
検索する語句を「*北海道*網走*」とします。
または「完全に同一なセルを検索」のチェックを外した上で「北海道*網走」
としてもOKです。
(こういったことは一般機能のヘルプに載っていると思いますので
目を通しておいて下さい。そして実際に手を動かして、いろいろためして
実感してください。この実感の量がVBAを書くときにあとあと利いてきます)


ということでVBAで「*北海道*網走*」という文字列を作って What:=検索語
に入れれば、検索できるということになります。
VBAでの「*北海道*網走*」の作り方ですが、たとえばこんなです。
 Dim 検索語 As String
 検索語 = "北海道" 'とりあえずinbutboxの代わり.
 MsgBox 検索語
 MsgBox "■" & 検索語


※ただしこの方法では「北海道」が先に来て「網走」があとに来るものが
 検索されます。「網走は北海道にある」はヒットしないのです。
※それでは困るという場合は、VBAのヘルプで like演算子の項目を読むと
 参考になるでしょう。あ、困らない場合でもヘルプを読んで損をする
 ことはないので、時間と気持ちに余裕があれば読んでおくといいです。


▼isausa さん:
>佳さん
>▼UO3 さん:
> 佳さん
>しばらく時間がなくて、お返事できませんでした。すみません。
>>I2,J2 は、どのシートですか?
>>また、ここにセットすることは必須ですか?
>>それとも、2つのワードで検索できれば、I2,J2へのセットは不要ですか?
>>
>I2,J2は検索シートです。(各年のシートの検索結果を抽出して転記させるのに使っています。そのI2 AND J2を一つの検索ワードにして各年のH列のデータを抽出して、検索シートに書き出したいのです。
>
>>それと、
>>H列に 涼しい北海道の網走市 といったように入っているのですか?
>>それともH列には 北海道が含まれる字句が、I列に網走が含まれる字句が入っているのですか?
>各シートのH列にデータ検索データを入れていますので、H列に北海道A社札幌出張とか北海道B社来社(釧路)とか入っており、北海道だけで検索するよりももう一つ検索語があったほうが絞りやすいと考えています。
>UO3 さん佳さんのアドバイスに従って検索シートのI2,J2に 検索語を表示することはできました。
>そこで検索なのですが、
>Set 結果 = mySH.Cells.Find( _
>>            What:=検索語, _
>>            LookIn:=xlValues, _
>>            lookat:=xlWhole)
>>      If Not 結果 Is Nothing Then
>>        先頭 = 結果.Address
>の部分でWhat:検索語 AND 検索語1としたら、見事にエラーになってしまいました。
>        I2       J2
>ここはどうしたらいいのでしょうか。

【74435】Re:inputboxで複数条件の検索
お礼  isausa  - 13/6/13(木) 9:51 -

引用なし
パスワード
   ▼UO3さん:
 佳 さん:
 
ありがとうございました。
ANDを&に替えて、結果が出せました。これで会社のパソコン苦手の人たちに(私も含めて)こうすれば、検索できるよと言ってあげられます。
ただし、お二方の指摘どおり、わざわざ検索語を二つにしなくても、*でつなげばいいんだとか、そうすると検索語の順番がいるとか、いろいろ改良点はありそうです。
これから、少しずつ頑張ってみます。行き詰ったらまた質問します。
有難うございました。


>こんにちは。
>
>Set 結果 = mySH.Cells.Find( _
>            What:=検索語, _
>            LookIn:=xlValues, _
>            lookat:=xlWhole)
>
>ここに出てくるFindというのは、手作業での「検索」機能に相当します。
>キーボードで Ctrl + F を押すと出てくるダイアログボックスです。
>このコードで行くと「検索する語句」の欄に検索語を入れ
>「検索対象」で値を選択、「完全に同一なセルを検索」にチェックを入れる
>ことになります。(wholeとは全体という意味)
>
>それでたとえば「北海道」と「網走」の入ったセルを検索するには
>検索する語句を「*北海道*網走*」とします。
>または「完全に同一なセルを検索」のチェックを外した上で「北海道*網走」
>としてもOKです。
>(こういったことは一般機能のヘルプに載っていると思いますので
>目を通しておいて下さい。そして実際に手を動かして、いろいろためして
>実感してください。この実感の量がVBAを書くときにあとあと利いてきます)
>
>
>ということでVBAで「*北海道*網走*」という文字列を作って What:=検索語
>に入れれば、検索できるということになります。
>VBAでの「*北海道*網走*」の作り方ですが、たとえばこんなです。
> Dim 検索語 As String
> 検索語 = "北海道" 'とりあえずinbutboxの代わり.
> MsgBox 検索語
> MsgBox "■" & 検索語
>
>
>※ただしこの方法では「北海道」が先に来て「網走」があとに来るものが
> 検索されます。「網走は北海道にある」はヒットしないのです。
>※それでは困るという場合は、VBAのヘルプで like演算子の項目を読むと
> 参考になるでしょう。あ、困らない場合でもヘルプを読んで損をする
> ことはないので、時間と気持ちに余裕があれば読んでおくといいです。
>
>
>▼isausa さん:
>>佳さん
>>▼UO3 さん:
>> 佳さん
>>しばらく時間がなくて、お返事できませんでした。すみません。
>>>I2,J2 は、どのシートですか?
>>>また、ここにセットすることは必須ですか?
>>>それとも、2つのワードで検索できれば、I2,J2へのセットは不要ですか?
>>>
>>I2,J2は検索シートです。(各年のシートの検索結果を抽出して転記させるのに使っています。そのI2 AND J2を一つの検索ワードにして各年のH列のデータを抽出して、検索シートに書き出したいのです。
>>
>>>それと、
>>>H列に 涼しい北海道の網走市 といったように入っているのですか?
>>>それともH列には 北海道が含まれる字句が、I列に網走が含まれる字句が入っているのですか?
>>各シートのH列にデータ検索データを入れていますので、H列に北海道A社札幌出張とか北海道B社来社(釧路)とか入っており、北海道だけで検索するよりももう一つ検索語があったほうが絞りやすいと考えています。
>>UO3 さん佳さんのアドバイスに従って検索シートのI2,J2に 検索語を表示することはできました。
>>そこで検索なのですが、
>>Set 結果 = mySH.Cells.Find( _
>>>            What:=検索語, _
>>>            LookIn:=xlValues, _
>>>            lookat:=xlWhole)
>>>      If Not 結果 Is Nothing Then
>>>        先頭 = 結果.Address
>>の部分でWhat:検索語 AND 検索語1としたら、見事にエラーになってしまいました。
>>        I2       J2
>>ここはどうしたらいいのでしょうか。

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