Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows Vista Home Basic : Excel 2007)
ユーザーフォームから複数条件で検索
投稿日時: 18/01/18 09:42:30
投稿者: パイロット

 よろしくお願いします。
 ユーザーフォームに検索ボタンを1個配置し、各テキストボックス及びコンボボックスに入力された文字、値で検索し、また入力されていないテキストボックス及びコンボボックスはスルーできるよう、実現したかったのですができませんでした。
 ご教授お願い致します。
 検索ボタンコード
  Dim ken As Integer
    Dim mei As String
    Dim Aza As String
    Dim Yoto As Integer
 
    If txt1 <> "" Then
     ken = txt1.Value
    End If
     
    With Worksheets("データ")
     .Range("A1").AutoFilter Field:=1, Criterial1:=">=" & ken, Operator:=xlAnd
    End With
     
   If txt2 <> "" Then
     mei = txt2.Value
    End If
   
    With Worksheets("データ")
     .Range("A1").AutoFilter Field:=2, Criterial1:="=*" & mei & "*", Operator:=xlAnd
    End With
 
   If CombBox1 <> "" Then
     Aza = CombBox1.Value
    End If
     
    With Worksheets("データ")
     .Range("A1").AutoFilter Field:=3, Criterial1:,="=*" & Aza & "*", Operator:=xlAnd
    End With
  
   If CombBox2 <> "" Then
     Yoto = CombBox2.Value
    End If
     
    With Worksheets("データ")
     .Range("A1").AutoFilter Field:=4, Criterial1:,="=*" & Yoto & "*", Operator:=xlAnd
    End With
  
 長々とすみません。
 お願いします。
 
 
 
 
 
 
    
      

回答
投稿日時: 18/01/18 10:59:35
投稿者: もこな2

こういうことでしょうか?

Private Sub 検索ボタン_Click()
With ThisWorkbook.Worksheets("データ")
    'フィルタ状態をクリアするため、オートフィルタがセットされてたら解除
    If .AutoFilterMode Then .Range("A1").AutoFilter

    '各コントロールのValueがブランクでなければ、オートフィルタの条件に追加
    If Me.TextBox1.Value <> "" Then
        .Range("A1").AutoFilter Field:=1, Criteria1:=">=" & Me.TextBox1.Value, Operator:=xlAnd
    End If
    If Me.TextBox2.Value <> "" Then
        .Range("A1").AutoFilter Field:=2, Criteria1:=">=" & Me.TextBox2.Value, Operator:=xlAnd
    End If
    If Me.ComboBox1.Value <> "" Then
        .Range("A1").AutoFilter Field:=3, Criteria1:=">=" & Me.ComboBox1.Value, Operator:=xlAnd
    End If
    If Me.ComboBox2.Value <> "" Then
        .Range("A1").AutoFilter Field:=4, Criteria1:=">=" & Me.ComboBox2.Value, Operator:=xlAnd
    End If
End With
End Sub
※うまくいかなかったのは、スペルミスっぽい Criterial1 → Criteria1

回答
投稿日時: 18/01/18 11:14:29
投稿者: もこな2

よく考えたら Then節しかないんだから、End If 省略してもよかった・・・
 
ということでこちらの方が見やすいかもしれません。

Private Sub 検索ボタン_Click()
With ThisWorkbook.Worksheets("データ")
    'フィルタ状態をクリアするため、オートフィルタがセットされてたら解除
    If .AutoFilterMode Then .Range("A1").AutoFilter

    '各コントロールのValueがブランクでなければ、オートフィルタの条件に追加
    If Me.TextBox1.Value <> "" Then .Range("A1").AutoFilter _
            Field:=1, Criteria1:=">=" & Me.TextBox1.Value, Operator:=xlAnd

    If Me.TextBox2.Value <> "" Then .Range("A1").AutoFilter _
            Field:=2, Criteria1:=">=" & Me.TextBox2.Value, Operator:=xlAnd

    If Me.ComboBox1.Value <> "" Then .Range("A1").AutoFilter _
            Field:=3, Criteria1:=">=" & Me.ComboBox1.Value, Operator:=xlAnd

    If Me.ComboBox2.Value <> "" Then .Range("A1").AutoFilter _
            Field:=4, Criteria1:=">=" & Me.ComboBox2.Value, Operator:=xlAnd
End With
End Sub

回答
投稿日時: 18/01/18 11:19:02
投稿者: mattuwan44

すでに、適切な回答が付いてますが、書いちゃったので、貼っておきます。
コントロールと列の関係が上手く行ってないと困りますが。。。。^^;
 
Private Sub UserForm_Click()
    Dim objFilter As AutoFilter
    Dim c As MSForms.Control
    Dim i As Long
     
    Set objFilter = Worksheets("データ").AutoFilter
     
    For Each c In Me.Controls
        i = i + 1
        If Len(c.Value) > 0 Then
            objFilter.Range.AutoFilter Field:=i, Criteria1:="=*" & c.Value & "*"
        Else
            objFilter.Range.AutoFilter Field:=i
        End If
    Next
End Sub

投稿日時: 18/01/18 13:31:29
投稿者: パイロット

 もこな2さん。
 回答ありがとうございます。
 出張にて職場のパソコンに触れずにいます。
 後ほど試してみたいと思います。
 私でも理解できるコードありがとうございます。
 1ヵ月ほど悩んだのがよかったと思います。
 (Criteria1、こちらに記入した時の単純ミスでした。)
 
  mattuwan44さん。
 回答ありがとうございます。
 まだ理解できないところがあり、考えながら試してみたいと思います。

投稿日時: 18/01/22 09:48:24
投稿者: パイロット

もこな2さん。
  返信遅くなり申し訳ありません。
 できました。ありがとうございます。
 エクセルに不慣れな人も、容易に検索できるようになります。
 
「各コントロールのValueがブランクでなければ、オートフィルタの条件に追加」
 この部分が分からず悶々としていました。
 勉強になりました。
 
mattuwan44さん。
 スキルを上げるためにためしてみます。
 
  重ねてお礼申し上げます。
  ありがとうございました。