• ベストアンサー

エクセルVBAのオートフィルタについて

いつもお世話になります。 エクセル2007でVBAでオートフィルタを操作したいのですが、 一部うまくいきません。 以下の様なコードを書いて 日付で絞り込みたいのですが、 何も抽出されません。 リストを見てみると、変数はちゃんと入っており OK ボタンを押すとその日付で抽出されます。 何故VBAでの操作では抽出されないのでしょうか。 ご存じの方がおられましたら、よろしくお願いします。 Sub test() Dim mydate As Variant Dim rng3 As Range Dim fmt As Variant Dim objList3 As ListObject Dim wb1 As Workbook Dim wb2 As Workbook Dim wb4 As Workbook Dim sh1 As Worksheet Dim sh2 As Worksheet Dim sh3 As Worksheet Dim sh4 As Worksheet Dim sh7 As Worksheet '----------------------------------------------------------------------- Set wb1 = Workbooks("301.xlsm") Set wb2 = Workbooks("1.xls") Set wb4 = Workbooks("2.xls") Set sh1 = wb1.Worksheets("@") Set sh2 = wb1.Worksheets("@@") Set sh3 = wb2.Worksheets("@@@") Set sh4 = wb2.Worksheets("@@@@") Set sh7 = wb4.Worksheets("@@@@@") '---------------------------------------------------------- sh2.Range("A1:z63").ClearContents With sh7 Set objList3 = .ListObjects("リスト1") fmt = .Range("A2").NumberFormatLocal mydate = Format(mydate, fmt) objList3.Range.AutoFilter Field:=7, Criteria1:=mydate objList3.Range.AutoFilter Field:=5, Criteria1:="test" Set rng3 = objList3.Range.SpecialCells(xlCellTypeVisible) rng3.Copy sh2.Range("A2") objList3.Range.AutoFilter Field:=5 objList3.Range.AutoFilter Field:=5, Criteria1:=">=190" Set rng3 = objList3.Range.SpecialCells(xlCellTypeVisible) rng3.Copy sh2.Range("A20") objList3.Range.AutoFilter Field:=5 objList3.Range.AutoFilter Field:=7 End With Application.CutCopyMode = False Set rng3 = Nothing Set fmt = Nothing Set objList3 = Nothing Set wb1 = Nothing Set wb2 = Nothing Set wb4 = Nothing Set sh1 = Nothing Set sh2 = Nothing Set sh3 = Nothing Set sh4 = Nothing Set sh7 = Nothing End Sub (一部省略しています)

  • kkke
  • お礼率71% (66/92)

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

コードが長すぎてあまりちゃんと読んでいませんが……。 変数 mydate はStringですよね? AutoFillterに渡す日付を文字列ではなく、日付データにすると上手くいきそうな気がします。 objList3.Range.AutoFilter Field:=7, Criteria1:=mydate ↓ objList3.Range.AutoFilter Field:=7, Criteria1:=DateValue(mydate)

kkke
質問者

お礼

ありがとうございます。 mydateはvariant型にしています。 date型でやってみます! 今日は時間がないので、明日にでも。

kkke
質問者

補足

date型にしたらうまくいきました。 ありがとうございました! でもずっとvariant型で問題なかったのに 何故でしょうか・・・・

その他の回答 (2)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

No.2 です。 ちょっと勘違いしていました。先の回答は無視してください。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

mydate = Format(mydate, fmt) の部分が間違っています。 この時点ではmydateには何も入力されていないはずです。 (一部省略部分なのでしょうか) fmt = .Range("A2").NumberFormatLocal mydate = Format(mydate, fmt) を mydate = Range("A2").Value としてみて下さい。

kkke
質問者

お礼

ありがとうございます。 mydateはinputboxから入力するんです。 省略してしまってました。 申し訳ありません。

関連するQ&A

  • Excel VBA :2回目以降実行で貼り付けるセルが変わる

    いつもお世話になっております。 ExcelのVBAでご質問があります。 指定した日付のデータを抽出して 別のシートに貼り付けるサブプロシージャなのですが、 下記のようなコードを書きましたところ、 貼り付けるセルが何故か("BH2")になってしまいます。 コードの一部を変えて、実行するとコード通り ("BH3")のセルに貼り付けてくれるのですが、 もう一度別の日付を入力して実行すると ("BH2")のセルに貼り付けてしまうのです。 何が原因なのでしょうか・・・? ちなみに最初にコードを書いたときは 貼り付け先は("BH2")のセルにしていましたが 途中で間違いに気づき、("BH3")に書き換えました。 これが関係あるのでしょうか。 何卒よろしくお願いします。 ------------------------------------------------------ Sub 予定表() Application.ScreenUpdating = False 'ファイルオープン Dim i As Integer For i = 1 To Workbooks.Count If (Workbooks(i).Name = "予定表.xls") Then Exit For End If Next If (i > Workbooks.Count) Then Workbooks.Open Filename:="\\Dress\予定表.xls" ' 予定表の取り込み Dim date1 As Date Dim fmt As String Dim objList1 As ListObject Dim wb1 As Workbook Dim wb2 As Workbook Dim Rng As Range Dim sh1 As Worksheet Dim sh4 As Worksheet '----------------------------------------------------------------------- Set wb1 = Workbooks("製品.xls") Set wb2 = Workbooks("予定表.xls") Set sh1 = wb1.Worksheets("Sheet1 (3)") Set sh4 = wb2.Worksheets("1") '------------------------------------------------------------------------- sh1.Range("BH3:BN20").ClearContents '日付のチェック Do date1 = Application.InputBox("日を入力して下さい。", "印刷日入力", Type:=2) If VarType(date1) = vbBoolean Then Exit Sub If IsDate(date1) = False Then MsgBox date1 & " は、日付ではありません。" Loop Until IsDate(date1) With sh4 Set objList1 = .ListObjects("予定") fmt = .Range("A2").NumberFormatLocal '書式を取る date1 = Format(date1, fmt) '入力文字の書式変更 objList1.Range.AutoFilter Field:=1, Criteria1:=date1 Set Rng = objList1.Range.SpecialCells(xlCellTypeVisible) Rng.Copy sh1.Range("BH3") objList1.Range.AutoFilter Field:=1 End With Application.CutCopyMode = False Range("R3").Value = date1 Set Rng = Nothing Set objList1 = Nothing Set wb1 = Nothing Set wb2 = Nothing Set sh1 = Nothing Set sh4 = Nothing End Sub

  • エクセルVBA フォルダ内のどんなシート名であっても読み込みたい

    フォルダ内の別ブック(D3で指定)の「情報」シートを読み込んで対象年月日に該当するデータを抽出して別ブックに貼り付けるものなんですが、下のコードではSet ws = wb.Worksheets("情報")と、なっていて、限定しているのですが、これをD3のファイルのどんなシート名であっても読み込みたいのですが、どのようにコードにしたらいいでしょうか?D3で指定するブックには必ずひとつのシートしかありません。 よろしくお願いします。 Sub test_1() Dim wb As Workbook Dim ws As Worksheet Dim ms As Worksheet Dim nb As Workbook Dim r As Long Set ms = ThisWorkbook.Worksheets("メニュー") Set wb = Workbooks.Open(ms.Parent.Path & "\" & ms.Range("D3").Value) Set ws = wb.Worksheets("情報") Set nb = Workbooks.Add With ws .Range("Q1").AutoFilter _ Field:=17, _ Criteria1:=">=" & ms.Range("D5").Text, _ Operator:=xlAnd, _ Criteria2:="<=" & ms.Range("F5").Text With .AutoFilter.Range r = .Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count If r = 1 Then MsgBox "抽出対象データ無し。" wb.Close False nb.Close False Set wb = Nothing: Set ws = Nothing Set ms = Nothing: Set nb = Nothing Exit Sub End If .Copy End With End With With nb.Worksheets(1) .Paste With .Range("A1:AG1") .Interior.ColorIndex = 6 .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With End sub

  • VBA オートフィルタで抽出したものを連続貼り付け

    下記のように情報が100近くまで存在した場合に、オートフィルターで一つずつ抽出したものをコピーし、新規シートに貼り付けたいのですが、どうすれば良いのでしょうか? 1 1 1 2 2 2 3 3 3 たとえばシート1に 1 1 1     シート2に 2 2 2 といったように処理したいので、教えて下さい。 vbaの参考書とサンプルを見て下記のように作成したのですが上手くいきません。 どんな本を読めば作成出来るようになるのかわからず、質問させていただきました。 ub オートフィルター() Dim myRng As Range Dim mySht As Worksheet Set myRng = _ Worksheets(1).Range("A1").CurrentRegion With Worksheets Set mySht = .Add(after:=.Item(.Count)) End With With myRng .AutoFilter field:=1, Criteria1:=8 On Error Resume Next .Resize(.Rows.Count - 1).Offset(1).Copy mySht.Range("A1") .SpecialCells(xlCellTypeVisible).Copy mySht.Range("A1").AutoFilter mySht.Range("A1").AutoFilter If Err.Number <> 0 Then Application.DisplayAlerts = False mySht.Delete Application.DisplayAlerts = True End If On Error GoTo 0 End With Set myRng = Nothing Set mySht = Nothing End Sub

  • エクセルのVBAの記述について

    VBAの記述についてなのですが、 Sub filter() Dim gyo As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = Worksheets("データ") Set ws2 = Worksheets("チーム") Application.ScreenUpdating = False ws2.Range("A4:BH30").Clear gyo = ws1.Range("A65536").End(xlUp).Row ws1.Activate With ws1.Range(Cells(4, 1), Cells(gyo, 6)) .AutoFilter Field:=1, Criteria1:="A" .SpecialCells(xlCellTypeVisible).Copy ws2.Range("A4") Selection.AutoFilter End With Application.ScreenUpdating = True End Sub ならプログラムははしるのですが、 14行目を .SpecialCells(xlCellTypeVisible).Copy ws2.Range(Cells(4, 1)) だと 「実行時エラー 1004 Rangeメソッドは失敗しました Worksheet オブジェクト」 とでるのですが、出来ないのでしょうか? Cells(4, 1)の1のところを変数にして変えていきたいのですが、よい方法はありますか。 よろしくお願いいたします。

  • Excel VBAについて教えて下さい。

    00というブックとテストというブックがあります。 00のデータを並び替え、一部変更し、テストのシート3へ貼付けを行いたいのですが、 うまく作動してくれません。以下に現在のコードを記載しましたので、ご指摘いただければと思います。 やりたいことは 1.ブック”00”のシート00にて条件がF列が0、E列がHでソートをかけます。 2.E列のHをすべて数字の1に変更します。 3.今度は別の条件、F列が1、E列がH、D列が1でソートをかけます。 4.E列のHをすべて消去します。 5.すべて表示させA列からE列までのデータを、テストのシート3へ貼付けをします。 コピー&ペーストは上手くいくのですが、肝心のソート+文字の変更+消去が出来ていません。 ネットを見ながら書いたコードで、VBAを勉強中です。 よろしくお願いします。 あと、この作業の前にブック00のB列にて昇順のソートをかけるというコードを追加したいのですが、 それについても教えていただけるとうれしいです。 よろしくお願い致します。 Private Sub Worksheet_Activate() Dim wb1 As Workbook Dim wb2 As Workbook Dim i As Long Application.ScreenUpdating = False Set wb1 = ActiveWorkbook Set wb2 = Workbooks.Open("C:\Documents and Settings\デスクトップ\メモ\00.xls", ReadOnly:=True) With wb2.Worksheets("00").Range("A1").CurrentRegion .AutoFilter .AutoFilter Field:=6, Criteria1:="=" & "0", Operator:=xlAnd .AutoFilter Field:=5, Criteria1:="=" & "H", Operator:=xlAnd .AutoFilter x = .Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To x If Cells(i, 5) = "H" Then Cells(i, 5) = Replace(Cells(i, 5), "H", "1") End If Next i With wb2.Worksheets("00").Range("A1").CurrentRegion .AutoFilter .AutoFilter Field:=6, Criteria1:="=" & "0", Operator:=xlAnd .AutoFilter Field:=5, Criteria1:="=" & "H", Operator:=xlAnd .AutoFilter Field:=4, Criteria1:="=" & "1", Operator:=xlAnd .AutoFilter x = .Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To x If Cells(i, 5) = "H" Then Cells(i, 5) = Replace(Cells(i, 5), "H", " ") End If Next i wb2.Sheets("00").Range("B1", .Cells(Rows.Count, 5).End(xlUp)).Copy wb1.Sheets("Sheet3").Range("K3").PasteSpecial wb2.Close False Range("A1").Select Application.ScreenUpdating = True End With End With End Sub

  • エクセルVBAでつまずいています

    教えてください。以前別のブックから、抽出条件を指定して、 項目を追加して、ある条件を検査して、それによって追加した項目の列 に対応する値を書き込むというコードを教えていただきました。 質問は、今現在、 With .Range("AH2").Resize(r - 1, 1) .FormulaR1C1 = _ "=IF(RC[-25]=""AAA"",""aaa""," & _ "IF(RC[-25]=""BBB"",""bbb""," & _ "IF(RC[-25]=""CCC"",""ccc""," & _ "IF(RC[-25]=""DDD"",""ddd"",""xxx"") の部分で、関数を設定していますが、AIの列にも同じように関数 (VLOOKUP)を設定したいのですが、Resize(r - 1, 1)の意味するところが しっかり理解していないためできません。 A1形式ですが、例えば、 参照先がD2、A2:J100として =VLOOKUP(D2,A2:J100,5,FASE) =VLOOKUP(D2,A2:J100,6,FASE) =VLOOKUP(D2,A2:J100,7,FASE) という条件を追加したいのですが、わかりませんでした。 どのようにしたらいいでしょうか。よろしくお願いします。 Sub test() Dim wb As Workbook Dim ws As Worksheet Dim ms As Worksheet Dim nb As Workbook Dim r As Long Set ms = ThisWorkbook.Worksheets("条件入力") Set wb = Workbooks.Open(ms.Parent.Path & "\" & ms.Range("D3").Value) Set ws = wb.Worksheets("元データ") Set nb = Workbooks.Add With ws .Range("Q1").AutoFilter _ Field:=17, _ Criteria1:=">=" & ms.Range("D5").Text, _ Operator:=xlAnd, _ Criteria2:="<=" & ms.Range("F5").Text With .AutoFilter.Range r = .Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count If r = 1 Then MsgBox "抽出対象データ無し。" wb.Close False nb.Close False Set wb = Nothing: Set ws = Nothing Set ms = Nothing: Set nb = Nothing Exit Sub End If .Copy End With End With With nb.Worksheets(1) .Paste With .Range("A1:AG1") .Interior.ColorIndex = 6 .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With .Range("AH1").Value = "追加項目A" .Range("AI1").Value = "追加項目B" .Range("AJ1").Value = "追加項目C" .Range("AK1").Value = "追加項目D" With .Range("AH2").Resize(r - 1, 1) .FormulaR1C1 = _ "=IF(RC[-25]=""AAA"",""aaa""," & _ "IF(RC[-25]=""BBB"",""bbb""," & _ "IF(RC[-25]=""CCC"",""ccc""," & _ "IF(RC[-25]=""DDD"",""ddd"",""xxx"") End With End With nb.SaveAs _ Filename:=ms.Parent.Path & "\" & _ Replace(wb.Name, ".xls", "") & "更新データ.xls" wb.Close False nb.Close Set wb = Nothing: Set ws = Nothing Set ms = Nothing: Set nb = Nothing End With End Sub

  • エクセルマクロで、他ブックからオートフィルタ抽出

    エクセルで別ブックで作成してあるカレンダーから、稼働日を判断して指定した期間の日付をオートフィルターを使って抽出したいのですが、うまくいきません。 このようなコードを記述しましたが、別ブックでオートフィルターを使用する事はできるのでしょうか? Dim book1 As Workbook '変数book1をワークブック型で宣言 Dim book2 As Workbook '変数book2をワークブック型で宣言 Dim today As Date Set book1 = Application.ActiveWorkbook 'アクティブになっているブックをbook1へセット Application.ScreenUpdating = False '画面の更新を止める '↓アドレスのブックを開く事までbook2にセット(ReadOnly:=Trueで読み込み専用) Set book2 = Application.Workbooks.Open("\\sv\C1\\稼働日カレンダー.xls", ReadOnly:=True) today = Date maxdate = cdate("2014/3/3") ' book2.Worksheets("DATA").Cells.Copy Destination:=book1.Worksheets("Sheet1").Range("A1") '----オートフィルタでデータを抽出 With book2.Worksheets("Sheet1").Range("A1").CurrentRegion .AutoFilter .AutoFilter Field:=1, Criteria1:=">=" & today, Operator:=xlAnd, Criteria2:="<=" & maxdate ' .AutoFilter Field:=2, Criteria1:="=" & 1 '----抽出データをコピー&貼り付け .Copy ActiveSheet.Range("A" & maxrow) .AutoFilter End With ' Range("A1").Select Application.ScreenUpdating = True Set book1 = Nothing '変数book1を開放 book2.Close SaveChanges:=False 'book2を閉じる(SaveChanges:=Falseで保存せずに終了) Application.ScreenUpdating = True '画面の更新を再開する Set book2 = Nothing '変数book2を開放

  • エクセル2007のVBAでオートフィルタのチェック

    エクセル2007のVBAでオートフィルタのチェックを閾値以上の%のみに入れたいのです。  ユーザー設定フィルタでは視覚的に解りつらい為、フィルタの▽をクリックした時に、チェックがされている事を確認したいのです。 【シート1の内容】 セルA1から行方向に数字の1~3 セルB1から行方向に、値1、値2、% セルA3~Bnは列方向に、整数 セルC3から列方向に、“=A3/B3”が入力されており、書式は パーセンテージ(小数点以下の桁数は“1”) セルD1に 閾値として 10.5%・・・書式はC3に同じ 【目的】 動きとしては、閾値以上の結果を出すつもりで書きました。 【質問】 フィルタがかかった▽をクリックした時に、1行、2行及びC列の10.5%以上のチェックボックスにチェックを入れたいのです。 しかし、下記コードの .AutoFilter Field:=3, Criteria1:=Array("%") _ , Operator:=xlFilterValues, Criteria2:=Array(TargetCD) でエラーが出てしまいます。 実行時エラー '1004': Range クラスの AutoFilter メソッドが失敗しました。 Sub Threshol() Dim MaxRow As Integer Dim TargetCD Dim CDDiff As Integer Dim MinCD As Single Dim MaxCD As Single Dim i As Integer Dim j As Single MaxRow = Range("C1").End(xlDown).Row With ActiveSheet.Range(Cells(3, 3), Cells(MaxRow, 3)) MinCD = ThisWorkbook.Worksheets(1).Range("D1").Value * 100 MaxCD = Application.Round(Application.Max(.Cells) * 100, 1) CDDiff = (MaxCD - MinCD) * 10 ReDim TargetCD(1 To CDDiff + 1) For i = 1 To UBound(TargetCD) TargetCD(i) = FormatPercent(MinCD / 100 + j, 1) j = Format(j + 0.001, "#.###") Next .AutoFilter Field:=3, Criteria1:=Array("%") _ , Operator:=xlFilterValues, Criteria2:=Array(TargetCD) End With End Sub 皆様、良いご助言を宜しくお願い致します。

  • VBAでオートフィルタを使った抽出がうまくいきませんのでどなたか教えて

    VBAでオートフィルタを使った抽出がうまくいきませんのでどなたか教えてください。 A列、C列に日付が入っていて、A列は空白以外のセルを表示し、かつC列は、開始日、終了日で抽出したいのですが、うまくいきません。 With Worksheets("sheet").Activate 開始日 = ">=" & TextBox1.Text 終了日 = "<=" & TextBox2.Text .Range("A1:N200").AutoFilter Field:=1, Criteria1:="<>" .Range("A1:N200").AutoFilter Field:=3, _ Criteria1:=開始日, Operator:=xlAnd, _ Criteria2:=終了日

  • VBA なんですが

    VBA なんですが すべてのワークシートを順番に選択して 指定した範囲をコピーし『まとめ』と言う別のシートに貼り付けたいのですが どうしたらいいのかわかりません。 それらしいのは考えたのですが Set sh = Worksheets(sh.Name)でエラーになります。 頭がいいかた教えてください。   Dim sh3 As Worksheet Dim sh As Worksheet Dim en As Long Set sh3 = Worksheets("まとめ") For Each sh In ActiveWorkbook.Worksheets If sh.Name <> "まとめ" Then en = sh.UsedRange.Rows.Count Set sh = Worksheets(sh.Name) sh.Range(Cells(2, 1), Cells(en, 10)).Copy

専門家に質問してみよう