[[20200509134223]] 『VBAでフィルター→印刷を繰り返す処理』(SS) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAでフィルター→印刷を繰り返す処理』(SS)

動作環境
Excel 2019
OS windows10
お世話になっております

やりたいこと


A列 ↓B〜K列にそれぞれデータが入力されています
1
1
1
2
2
3
3
...

やりたいこと
・1をオートフィルターで絞る
・E列からK列までのデータ入力されている範囲を選択し印刷
・印刷後2の番号をオートフィルター
・以降同様の処理を10まで繰り返す

下記のように組んでみたのですが、SelectCaseで条件指定してフィルターまでできてもその後の印刷がうまくいきません。
繰り返し処理をする場合はどうすればよいのでしょうか?

Sub Sample7()

'条件指定してフィルター
Dim num As Variant

    num = "1" '←必要?
Dim cmax As Long
cmax = Worksheets("Sheet8").Range("E2000:K2000").End(xlUp).Row

Select Case num

    Case 1
    With ActiveSheet
        .Sort.SortFields.Add Key:=.Range("A1"), Order:=xlAscending
        .Sort.AutoFilter Field:=1, Criteria1:="1"
    '↑メソッドエラー

        .Sort.Header = xlYes
        .Sort.Apply

    End With

    'SelectCaseで指定した状態で印刷ができない?

  With Worksheets("Sheet8").PageSetup

          .PrintArea = "E1:K" & cmax
          .FitToPagesTall = 1
          .FitToPagesWide = 1

     End With
     ActiveWindow.SelectedSheets.PrintPreview

    Case 2〜10をくり返す

     End Select

End Sub

よろしお願いいたします

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 こんにちは!
原文を残しながら書いてみましたけど、、Filterですよね???
cmaxは、
.Range("A1").CurrentRegion.Rows.Count
でも
.AutoFilter.Range.Rows.Count
でもいいみたいです???(自信ない(^^;)

 Option Explicit
Sub Sample7()
Dim i As Long
Dim cmax As Long
For i = 1 To 8
    With Worksheets("Sheet8")
        With .Range("A1").CurrentRegion
            .AutoFilter Field:=1, Criteria1:=i
            cmax = .Rows.Count
        End With
'        cmax = .AutoFilter.Range.Rows.Count
        With .PageSetup
            .PrintArea = "E1:K" & cmax
            .FitToPagesTall = 1
            .FitToPagesWide = 1
        End With
        ActiveWindow.SelectedSheets.PrintPreview
    End With
Next
End Sub
(SoulMan) 2020/05/09(土) 18:25

ちょっと確認ですが、やりたいことの中に「並べ替え」は入ってませんが、なんで「.Sort」の操作をしようとしてますか?

「AutoFilter」はシートオブジェクトに対して行うものだから、エラーになっちゃっているとおもいますが・・

また、
>E列からK列までのデータ入力されている範囲を選択し印刷
これは、単純に【E〜kの抽出されている部分を印刷】という解釈でも問題ないですか?

(もこな2 ) 2020/05/10(日) 12:20


ご返信いただきありがとうございます。
ご丁寧にありがとうございます!
試してみたところ完璧でした! ありがとうございます。

ちょっと確認ですが、やりたいことの中に「並べ替え」は入ってませんが、なんで「.Sort」の操作をしようとしてますか? 「AutoFilter」はシートオブジェクトに対して行うものだから、エラーになっちゃっているとおもいますが・・ 元々並べ替えをした後フィルターをかけて印刷、という流れで試していたのですが、最終的に必要なくなったので「.Sort」は消し忘れです… 混乱させてしまいあ申し訳ありませんでした。

>E列からK列までのデータ入力されている範囲を選択し印刷
これは、単純に【E〜kの抽出されている部分を印刷】という解釈でも問題ないですか?
もこな2様の考えている通りです。

ちなみに1点お伺いしたいのですが、例えば1、10、100...などフィルターで絞りたい番号が連続ではない場合でも上記の処理は可能なのでしょうか?
(SS) 2020/05/11(月) 14:17


 こんばんは!
 だいたいは、設計するものですから。。。どうにでもなると言えばどうにでもなる。。。(^^;
 >例えば1、10、100...などフィルターで絞りたい番号が連続ではない場合でも
 一例です。。。

 Dim v As Variant
Dim i As Long
v = Array(1, 30, 34, 44, 55, 100)
For i = LBound(v) To UBound(v)
    MsgBox v(i)
Next
(SoulMan) 2020/05/11(月) 20:33

気になる点がいくつかあるので順番に。

■1
おそらく、↓はE〜Kのうち最大の最終列としたかったのでしょうけど、残念ながらそういう指定はできません。

 cmax = Worksheets("Sheet8").Range("E2000:K2000").End(xlUp).Row

 cmax = Worksheets("Sheet8").Range("E2000").End(xlUp).Row

セル範囲を与えたときは左上セルのみで判断され、↑のように解釈されます。

■2
ちょっと↓の説明がよくなかったです
>「AutoFilter」はシートオブジェクトに対して行うもの
オートフィルタは、"セル範囲"に対して実行します。

そして、1シートに設定できるオートフィルタの数は1つのみです。
よって、対象のオートフィルタが属するシートが分かれば、オートフィルタが設定されているか、オートフィルタが設定されている範囲なども調べることが可能です。

■3
オートフィルタを設定するときに、1つのセルを指定するか、セル範囲を指定するかで違いがあります。

 ・単一のセルを指定した場合
    指定したセルを含む表範囲にオートフィルタを設定します

 ・セル範囲を指定した場合
    指定した範囲の1行目を項目行にしてオートフィルタを設定します

さらに、セル範囲を指定した場合、有効なデータがない部分まで含めて指定しても、有効な部分のみを対象にするように忖度してくれる仕様です。

■4
普段、印刷する時には”シート”を印刷しているとおもいますが、実は”セル範囲”を印刷対象に指定することも可能です。
(通常の”選択した部分を印刷”に相当)

したがって、

 (1)ページの【印刷範囲を】E1〜オートフィルタが設定されている最後のセルに設定する
 (2)毎回、E1〜オートフィルタが設定されている最後のセルを印刷する

のどちらでもOKです。

■5
踏まえるとこんな感じです。

    Sub 実験01()
        Dim 最後のセル As Range
        Stop
        With Worksheets("Sheet2")
            '▼オートフィルタを強制解除
            .AutoFilterMode = False

            '▼オートフィルタを設定(抽出はしない)
            .Range("A:K").AutoFilter

            '▼オートフィルタが設定されている範囲の最後のセルを調べる
            With .AutoFilter.Range
                Set 最後のセル = .Cells(.Cells.Count)
            End With

            '▼印刷範囲を設定する
             .PageSetup.PrintArea = .Range("E1", 最後のセル).Address

             '▼オートフィルタで”抽出”する
             .AutoFilter.Range.AutoFilter Field:=1, Criteria1:=1

             '▼印刷(プレビュー)する
             .PrintPreview
        End With
    End Sub
    '-----------------------------------------------------------------------------
    Sub 実験02()
        Dim 最後のセル As Range
        Stop
        With Worksheets("Sheet2")
            '▼オートフィルタを強制解除
            .AutoFilterMode = False

            '▼オートフィルタを設定(抽出はしない)
            .Range("A:K").AutoFilter

            '▼オートフィルタが設定されている範囲の最後のセルを調べる
            With .AutoFilter.Range
                Set 最後のセル = .Cells(.Cells.Count)
            End With

             '▼オートフィルタで”抽出”する
             .AutoFilter.Range.AutoFilter Field:=1, Criteria1:=1

             '▼印刷(プレビュー)する
             .Range("E1", 最後のセル).PrintPreview
        End With
    End Sub

■6
>例えば1、10、100...などフィルターで絞りたい番号が連続ではない場合〜可能なのでしょうか?
可能ですが、まずは1つだけで考えてみましょう。
そして、1だけのコードが理解できたら、どこからどこを繰り返せばよいか、どの部分が次々に入れ替わればよいのか、一旦ご自身で考えてみてください。
入れ替える方法や、繰り返す方法は別途説明します。(たぶん)

(もこな2 ) 2020/05/12(火) 11:42


ご返信ありがとうございます。
こんなにもご丁寧に回答いただいて恐縮です…
特に■2〜4が今までうまく理解できていなかった点だったのですが、もこな様の説明でようやく理解できました。

>例えば1、10、100...などフィルターで絞りたい番号が連続ではない場合〜可能なのでしょうか?
こちらの質問ですがもこな様の説明を参考に試してみたところうまくいきました。ありがとうございました。

今回の質問を機にまずは基礎理解を深めていこうと思います。
今回はお時間いただきありがとうございました!
(SS) 2020/05/13(水) 10:31


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.