リストボックスを使った複数選択のフィルタリング

このQ&Aのポイント
  • 2つのリストボックスを使っての複数選択でのフィルタをかける方法を教えてください。
  • リストボックスで選択した項目を組み合わせて、データを抽出する方法を教えてください。
  • リストボックスを使用して、特定の条件を満たすデータを抽出する方法を教えてください。
回答を見る
  • ベストアンサー

2つのリストボックスを使っての抽出

2つのリストボックスでの複数選択でのフィルタをかけたいと思い、色々試行錯誤でイカのようにやってみましたが、何も抽出されない状態になります。下は最初にやってみてエラーになりました。 顧客タイプがアルファベットで文字列なのですが、ダブルクォーテーションの付き方が問題だと思うのですが、なかなか思うようになりません。アドバイスお願いします。 また、見よう見まねで初めて書いたようなコードなので無駄も多いと思いますが、そこのあたりのアドバイスも頂けるとうれしいです。宜しくお願いします。 Dim ctl1 As Control Dim ctl2 As Control Dim abc As String Dim aaa As Long Dim bbb As Variant Dim ddd As Variant Dim quot As String Set ctl1 = Me!検索1 Set ctl2 = Me!検索2 abc = "[月] in (" aaa = Len(abc) If ctl1.ItemsSelected.Count = 0 Or ctl2.ItemsSelected.Count = 0 Then MsgBox "月か顧客タイプの選択がされていません!", , "エラー" Exit Sub End If For Each bbb In ctl1.ItemsSelected If Len(abc) > aaa Then abc = abc & "," End If abc = abc & ctl1.Column(0, bbb) Next bbb quot = Chr(34) abc = abc & ") and [顧客タイプ] in (" & quot For Each ddd In ctl2.ItemsSelected If Len(abc) > aaa Then abc = abc & "," End If abc = abc & ctl2.Column(0, ddd) Next ddd abc = abc & quot & ")" Me.Filter = abc Me.FilterOn = True 最初は以下のようにしてもやってみました。 Dim ctl1 As Control Dim ctl2 As Control Dim abc As String Dim def As String Dim aaa As Long Dim bbb As Variant Dim ccc As Long Dim ddd As Variant Dim quot As String Dim ad As String Set ctl1 = Me!検索1 Set ctl2 = Me!検索2 abc = "[月] in (" aaa = Len(abc) If ctl1.ItemsSelected.Count = 0 Or ctl2.ItemsSelected.Count = 0 Then MsgBox "月か顧客タイプの選択がされていません!", , "エラー" Exit Sub End If For Each bbb In ctl1.ItemsSelected If Len(abc) > aaa Then abc = abc & "," End If abc = abc & ctl1.Column(0, bbb) Next bbb abc = abc & ")" quot = Chr(34) def = "[顧客タイプ] in (" & quot ccc = Len(def) For Each ddd In ctl2.ItemsSelected If Len(def) > ccc Then def = def & "," End If def = def & ctl2.Column(0, ddd) Next ddd def = def & quot & ")" ad = abc And def Me.Filter = ad Me.FilterOn = True こちらは型が違う、とエラーになります。

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

def = [顧客タイプ] in ("A","C") abc = [月] in (3) ad= 最終的に ad の値に ad = "[顧客タイプ] in ('A','C') and [月] in (3)" という文字列が渡されるまで頑張って。

tamating
質問者

お礼

無事抽出できました。 試行錯誤の結果、 ad = abc & " And " & def でうまくabcとdefがつなげられました。 ありがとうございました。

その他の回答 (1)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

>If Len(abc) > aaa Then ←ここと >abc = abc & "," >End If ← ここは要らないのでは? 何のアプリケーションを使われているか分からないので見当違いかもしれませんが Access なら In 演算子に渡すとき 数値型なら In (1,2,3) テキスト型なら In ('1','2','3') のようになります。 abc = abc & quot & ")" Debug.Print "abc = " & abc '←追加 Me.Filter = abc ad = abc And def Debug.Print "ad = " & ad '←追加 Me.Filter = ad でイミディエイトウィンドウで abc と ad を確認してみては?

tamating
質問者

補足

回答ありがとうございます。 基本的な情報を記載しておりませんでした。 access2003でOSはxpです。 以下のように買えてみましたが、型が違うと返ってきます。 イミディエイトでは def = [顧客タイプ] in ("A","C") abc = [月] in (3) ad= となり、adがおかしいです。 Dim ctl1 As Control Dim ctl2 As Control Dim abc As String Dim def As String Dim aaa As Long Dim bbb As Variant Dim ccc As Long Dim ddd As Variant Dim quot As String Dim ad As String Set ctl1 = Me!検索1 Set ctl2 = Me!検索2 abc = "[月] in (" aaa = Len(abc) If ctl1.ItemsSelected.Count = 0 Or ctl2.ItemsSelected.Count = 0 Then MsgBox "月か顧客タイプの選択がされていません!", , "エラー" Exit Sub End If For Each bbb In ctl1.ItemsSelected abc = abc & "," abc = abc & ctl.Column(0, bbb) Next bbb abc = abc & ")" quot = Chr(34) def = "[顧客タイプ] in (" & quot ccc = Len(def) For Each ddd In ctl2.ItemsSelected If Len(def) > ccc Then def = def & quot & "," & quot End If def = def & ctl2.Column(0, ddd) Next ddd def = def & quot & ")" Debug.Print "abc = " & abc ' ad = abc And def Debug.Print "ad = " & ad ' Me.Filter = ad Me.FilterOn = True

関連するQ&A

  • バッチファイルでファイルを比較後他のフォルダにコピ

    次のようなファイル構成で C:\AAA     C:\BBB   \ccc      \ccc    abc.txt    abc.txt    def.jpg    def.jpg   \ddd      \ddd    ghi.txt    ghi.txt    jkl.jpg    jkl.jpg C:AAA\ccc\abc.txt と C:BBB\ccc\abc.txt を比較 C:AAA\ccc\def.jpg と C:BBB\ccc\def.jpg を比較 C:AAA\ddd\ghi.txt と C:BBB\ddd\ghi.txt を比較 C:AAA\ddd\jkl.jpg と C:BBB\ddd\jkl.jpg を比較 全てのファイルに対し比較後C:\CCC(別のフォルダ)に階層を含めコピーしたく for /R %%A in ("C:\AAA") do for /R %%B in ("C:\BBB") do if %%~zA NEQ %%~zB (goto A) :A echo NEQ としましたがループしてしまいました 比較後C:\CCC(別のフォルダ)に階層を含めコピーする方法も含め ご教授をい願いします

  • VBAの正規表現

    VBAで正規表現による置換をしたいです。 以下のような行が複数あります。 1 aaa bbb ccc ddd 2 aaa bbb ccc ddd 3 aaa bbb ccce ddd 4 aaa bbb eccc ddd ccc の部分のみ置換したいです。 dim hensuu as string dim replace as string replace = eee hensuu = ccc (省略) strPattern = "(\s*)" & hensuu & "(\s+)" rep = RegExpObj.Replace(buf, "\1" & replace & "\2") 行数1,2 のみを置換したのですが、4も置換されてしまいます。 (\s*) の "*" が良くないのは理解していますが、"+" にしてもうまくいきません。 どなたかどのようにしたら1,2のみ置換できるようになるかをご教授お願いできませんでしょうか よろしくお願いいたします。

  • IF関数で表示される特定の文字の色を変えたい

    IF関数で表示される特定の文字の色を変えたい Excelです。 例えば、 =if(a1=0,"abc012","def345") という関数を作って、このabcの色だけ赤に変えたいです。 マクロで Sub Macro1() Dim rng As Range Dim ptr As Integer Const tStr As String = "abc"  For Each rng In ActiveSheet.Cells.SpecialCells(xlCellTypeConstants, 23)   ptr = InStr(rng.Value, tStr)   If ptr > 0 Then    rng.Characters(Start:=ptr, Length:=Len(tStr)).Font.ColorIndex = 3   End If  Next rng End Sub と組んだのですが、普通にabcと打つと赤に変わるのですが、IF関数で表示されるabcは赤に変わりません。 どうすればいいか教えてください。

  • dosでサイズを比較して異なるファイルだけコピー

    dosで全フォルダ内のファイルサイズを比較して異なるファイルだけコピーしたい 次のようなファイル構成で AAAフィルダ    BBBフォルダ  cccフォルダ    cccフォルダ   abc.txt      abc.txt   def.jpg      def.jpg  dddフォルダ    dddフォルダ   ghi.txt      ghi.txt   jkl.jpg      jkl.jpg AAA\ccc\abc.txtとBBB\ccc\abc.txt AAA\ccc\def.jpgとBBB\ccc\def.jpg AAA\ddd\ghi.txtとBBB\ddd\ghi.txt AAA\ddd\jkl.jpgとBBB\ddd\jkl.jpg 拡張子は問わずそれぞれに対するファイルのファイルサイズを比較して 大きくても小さくても異なるファイルだけbbbフォルダ内に上書きコピー したくご教授をお願いします

  • アクセスのVBEの初歩的な質問

    アクセス(に限らないとは思うのですが)のVBEを今、一生懸命勉強しているのですが、初歩的なところで、つまずいています。 あああ いいい ううう えええ 1 1 あいうえお かきくけこ 1 2 あいうえお かきくけこ 1 3 あいうえお かきくけこ 2 1 あいうえお かきくけこ 2 2 あいうえお かきくけこ 2 3 あいうえお かきくけこ 3 1 あいうえお かきくけこ 3 2 あいうえお かきくけこ 3 3 あいうえお かきくけこ というような、データを自動で入力したいのです。多分、for next と、do until あたりを組み合わせるとできると思うのですが、どうしてもうまくいきません。 とりあえず、以下のような、めちゃめちゃ効率の悪いコードを書いたのですが、もっと効率よくするには、どうしたらいいでしょうか?  ………………………………………………… Private Sub コマンド6_Click() Dim Aaa As Integer Dim Bbb As Integer Dim Ccc As String Dim Ddd As String DoCmd.GoToRecord , , acFirst Aaa = 1 Bbb = 0 Ccc = "あいうえお" Ddd = "かきくけこ" For i = 1 To 3 Bbb = Bbb + 1 あああ = Aaa いいい = Bbb ううう = Ccc えええ = Ddd DoCmd.GoToRecord , , acNext Next i Aaa = 2 Bbb = 0 For i = 1 To 3 Bbb = Bbb + 1 あああ = Aaa いいい = Bbb ううう = Ccc えええ = Ddd DoCmd.GoToRecord , , acNext Next i Aaa = 3 Bbb = 0 For i = 1 To 3 Bbb = Bbb + 1 あああ = Aaa いいい = Bbb ううう = Ccc えええ = Ddd DoCmd.GoToRecord , , acNext Next i End Sub …………………………………… ほんとうに、おはずかしいのですが、どうかご指導くださいませ。m(__)mm(__)m

  • テキストボックスなら空白にする

    フォームにテキストボックス2つとコンボボックス2つを設置して、 規定値に値を設定し、 Private Sub cb_テキストボックスなら空白にする_Click() Dim ctl As Control For Each ctl In Me.Controls If ctl.ControlType = acTextBox Then ctl.Value = Empty End If Next ctl End Sub としたのですが何も起こりません。 空白にするにはどうすればいいでしょうか? あと、 ctl.Valueと打つ時に、 ドットの後に、Valueが一覧に出てきませんでした。 それが原因で空白にならないのでしょうか? ご回答よろしくお願いします。

  • フォーム上のコントロールの名前を配列に格納したい

    アクセスです フォーム上のコントロールの名前を配列に格納したいのですが もっとスマートな方法はありますか? 私が考えたコードは Dim avarContorol As Variant Dim ctl As Control Dim mystr As String For Each ctl In Forms(Me.Name).Controls mystr = mystr & ctl.Name & "," Next ctl '右から1文字消す mystr = Left(mystr, Len(mystr) - 1) avarContorol = Split(mystr, ",") なのですが、 ループのみで格納できる方法があれば教えてください。

  • 分岐処理について

    "AAA"、"BBB"という検索条件でdatagridviewに表示させたいのですが、 『argumentNullexceptionはハンドルされませんでした』というMSGが、haisinA.fill(tbl)の部分で止まってしまいます。これを解決するにはどうすればいいのでしょうか? 色々検索とかしてみたのですが混迷してしまって・・・。 ご助言を頂けたら幸いです。宜しくお願い致します。 ******************************************************************************** Dim tbl As New DataTable() Dim haishinA As New OracleDataAdapter 'リスト条件 Dim SBL As String = Me.cbox2.SelectedIndex.ToString If SBL = "0" Then SBL = "AAA" ElseIf SBL = "1" Then SBL = "BBB" End If '検索 Dim SBF1, SBF2 As String SBF1 = "select * from テーブル名 where sendto = 'AAA'" SBF2 = "select * from テーブル名 where sendto = 'BBB'" Console.WriteLine(SBF1) Console.WriteLine(SBF2) haishinA.Fill(tbl) DataGridView1.DataSource = tbl ******************************************************************************** 

  • エクセルのマクロについて教えて下さい。

    エクセルのマクロについて教えて下さい。 Sub Ref() Dim ax As String Dim num As Integer, i As Integer Dim arr As Variant Dim tex As String Range("A1").Select ax = ActiveCell.Formula arr = Split(ax, ",") For i = 0 To UBound(arr) num = i + 1 Cells(num, 1).Value = arr(i) Next i For i = 1 To 10 ActiveCell.Offset(, 1).Select tex = ActiveCell.Formula Selection.Resize(num, 1).Select Selection.Formula = tex Selection.Resize(1, 1).Select Next i End Sub このマクロを10行ほどまで対応させたいです。 例として2行の表ですが、           A         B   C  D   E  F 1 C100,C101,C102,C103 aaa bbb ccc ddd eee 2 C104,C105,C106,C107 とうい表を、     A B  C  D   E   F 1 C100 aaa bbb ccc ddd eee 2 C101 aaa bbb ccc ddd eee 3 C102 aaa bbb ccc ddd eee 4 C103 aaa bbb ccc ddd eee 5 C104 aaa bbb ccc ddd eee 6 C105 aaa bbb ccc ddd eee 7 C106 aaa bbb ccc ddd eee 8 C107 aaa bbb ccc ddd eee という表にしたいです。 結合してから展開しようと考えたのですが 1列目の文字列の最後にカンマが無い場合、ある場合がありまして、 対応する事が出来ませんでした。 マクロ初心者なので教えてください。 よろしくお願いします。

  • VBAのIF構文について

    VBAでまたわからないところが出てきたので質問させてください。 ActiveWorkbookのworksheet1のa1セルに何か文字列が入っていると仮定して、下記のstrSUB に入る文字列をifで分岐させたいのですが、どのような構文が適していますでしょうか? 下記の内容では、エラーになってしまいます。 識者の方々、よろしくお願いいたします。 ----------------------------------------------------------------- Sub test送信メール作成() Dim oApp As Object Dim objMAIL As Object Dim strSUB As String Dim strBODY As String Set oApp = CreateObject("Outlook.Application") Set objMAIL = oApp.CreateItem(0) strSUB = if ActiveWorkbook.Worksheets(1).range("a1") = "abc" then "aaa" Else "bbb" End If strBODY = "a" & vbCrLf _ & "b" & vbCrLf _ & "c" With objMAIL .To = "aaa@bbb.com" .CC = "ccc@ddd.com" .Subject = strSUB .Body = strBODY .Display End With End Sub

専門家に質問してみよう