[[20190912061514]] 『マクロにて対象物がない時に次の動作をさせる方法』(Takkr) ページの最後に飛ぶ

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

 

『マクロにて対象物がない時に次の動作をさせる方法』(Takkr)

お世話になります。

自動作成マクロで集計リストを作ったのですが、対象のものがなかった場合
次の動作に飛ぶ方法はどのようにすればよいかご教授願います。
以下作成例

Sheets("該当月リスト").Select

    ActiveSheet.Range("$A$1:$Z$572").AutoFilter Field:=3, Criteria1:="車両1"
    ActiveSheet.Range("$A$1:$Z$572").AutoFilter Field:=7, Criteria1:=Array( _
        "消耗品", "消耗品(品番有)", "補助材料", "補助材料(品番有)"), Operator:=xlFilterValues
    Rows("2:572").Select
    Selection.Copy
    Sheets("車両1").Select
    Rows("9:68").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("該当月リスト").Select
    ActiveSheet.Range("$A$1:$Z$572").AutoFilter Field:=7, Criteria1:="固定(特別)"
    Rows("2:572").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("車両1").Select
    Rows("73:132").Select
    ActiveSheet.Paste
     Range("A9").Select
    Sheets("該当月リスト").Select
    ActiveSheet.Range("$A$1:$Z$572").AutoFilter Field:=7
    ActiveSheet.Range("$A$1:$Z$572").AutoFilter Field:=3
    Range("A2").Select

    Sheets("該当月リスト").Select
    ActiveSheet.Range("$A$1:$Z$572").AutoFilter Field:=3, Criteria1:="車両2"
    ActiveSheet.Range("$A$1:$Z$572").AutoFilter Field:=7, Criteria1:=Array( _
        "消耗品", "消耗品(品番有)", "補助材料", "補助材料(品番有)"), Operator:=xlFilterValues
    Rows("2:572").Select
    Selection.Copy
    Sheets("車両2").Select
    Rows("9:68").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("該当月リスト").Select
    ActiveSheet.Range("$A$1:$Z$572").AutoFilter Field:=7, Criteria1:="固定(特別)"
    Rows("2:572").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("車両2").Select
    Rows("73:132").Select
    ActiveSheet.Paste
     Range("A9").Select
    Sheets("該当月リスト").Select
    ActiveSheet.Range("$A$1:$Z$572").AutoFilter Field:=7
    ActiveSheet.Range("$A$1:$Z$572").AutoFilter Field:=3
    Range("A2").Select

該当月リストに車両1データーが存在している時は作動するのですが
無い場合勝手に違うデータをコピペしていきます。

  車両1でデーターがない時車両2へ移動させる方法はありませんか?

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


提示のコードをちょっと直しつつ手を入れてみました。
(実データを用意してチェックしたわけではないのでミスっていたらごめんなさい)

    Sub 名無しのマクロ_整理()
        Dim MyArr As Variant
        MyArr = Array("消耗品", "消耗品(品番有)", "補助材料", "補助材料(品番有)")

        With Sheets("該当月リスト")
            '▼オートフィルタの強制解除と設定
            .AutoFilterMode = False
            .Range("A1:Z1").AutoFilter

                '▼抽出
                .AutoFilter.Range.AutoFilter Field:=3, Criteria1:="車両1"
                .AutoFilter.Range.AutoFilter Field:=7, Criteria1:=MyArr, Operator:=xlFilterValues

                '▼データがあるかチェックしてデータがあったときだけコピペ
                    '// C列の最終行を調べたときに項目行である1だったら抽出されたものはない //
                If .Cells(.Rows.Count, "C").End(xlUp).Row > 1 Then
                    .AutoFilter.Range.Offset(1).Copy    '項目行を除いてコピー
                    Sheets("車両1").Range("A9").PasteSpecial Paste:=xlPasteValues
                End If

                '▼抽出
                '.AutoFilter.Range.AutoFilter Field:=3, Criteria1:="車両1"
                .AutoFilter.Range.AutoFilter Field:=7, Criteria1:="固定(特別)"

                '▼データがあるかチェックしてデータがあったときだけコピペ
                If .Cells(.Rows.Count, "C").End(xlUp).Row > 1 Then
                    .AutoFilter.Range.Offset(1).Copy    '項目行を除いてコピー
                    Sheets("車両1").Range("A73").PasteSpecial Paste:=xlPasteValues
                End If

                '---ここから 車両2の分 ---
                .AutoFilter.Range.AutoFilter Field:=3, Criteria1:="車両2"
                .AutoFilter.Range.AutoFilter Field:=7, Criteria1:=MyArr, Operator:=xlFilterValues
                If .Cells(.Rows.Count, "C").End(xlUp).Row > 1 Then
                    .AutoFilter.Range.Offset(1).Copy
                    Sheets("車両2").Range("A9").PasteSpecial Paste:=xlPasteValues
                End If

                .AutoFilter.Range.AutoFilter Field:=7, Criteria1:="固定(特別)"
                If .Cells(.Rows.Count, "C").End(xlUp).Row > 1 Then
                    .AutoFilter.Range.Offset(1).Copy
                    Sheets("車両2").Range("A73").PasteSpecial Paste:=xlPasteValues
                End If
                '--- ここまで 車両2の分 ---

                '▼オートフィルタは解除せずに抽出だけ解除
                .ShowAllData
            End With

    End Sub

質問の「車両1でデーターがない時車両2へ移動させる方法はありませんか?」がちょっと理解できてませんが、「車両1」でデータがない場合【処理せず】、車両2の処理へ進むようにできませんか?」と解釈した場合、上記のように抽出した段階で最終行をチェックしてみてはどうでしょうか?

(もこな2) 2019/09/12(木) 09:03


ちなみに、実際に車両がいくつあるのか分かりませんが、たくさんある場合は、ループ処理にすることを考えてみるとコンパクトに記述できるかもです。
    Sub ループ処理()
        Dim MyArr As Variant
        Dim buf As Variant
        MyArr = Array("消耗品", "消耗品(品番有)", "補助材料", "補助材料(品番有)")

        With Sheets("該当月リスト")

            .AutoFilterMode = False
            .Range("A1:Z1").AutoFilter

            '▼ループ処理
            For Each buf In Array("車両1", "車両2")

                .AutoFilter.Range.AutoFilter Field:=3, Criteria1:=buf
                .AutoFilter.Range.AutoFilter Field:=7, Criteria1:=MyArr, Operator:=xlFilterValues
                If .Cells(.Rows.Count, "C").End(xlUp).Row > 1 Then
                    .AutoFilter.Range.Offset(1).Copy
                    Sheets(buf).Range("A9").PasteSpecial Paste:=xlPasteValues
                End If

                .AutoFilter.Range.AutoFilter Field:=7, Criteria1:="固定(特別)"
                If .Cells(.Rows.Count, "C").End(xlUp).Row > 1 Then
                    .AutoFilter.Range.Offset(1).Copy
                    Sheets(buf).Range("A73").PasteSpecial Paste:=xlPasteValues
                End If

            Next buf

            .ShowAllData

        End With
    End Sub

(もこな2) 2019/09/12(木) 09:10


もこな2様

ありがとうございます。

マクロ初心者の為、大変助かりました。

説明が要領を得ず、すみませんでした。

もこな2さんのご察しのとうりでございます。

早速試してみたいと思います。

(Takkr) 2019/09/12(木) 13:25


問題発生つまずいてます。

                End If
                .AutoFilter.Range.AutoFilter Field:=7, Criteria1:="固定(特別)"
                If .Cells(.Rows.Count, "C").End(xlUp).Row > 1 Then

で="固定(特別)"は1項目だけなら検出するのですが、追加で"固定(定期)、"固定(共有

と増えていく場合

        MyArr = Array("消耗品", "消耗品(品番有)", "補助材料", "補助材料(品番有)")

以外の複数を検出させるにはどのように表示させればよいのでしょうか。

同じように

    Sub ループ処理()
        Dim MyArr As Variant
        Dim buf As Variant
        MyArr = Array("固定(特別)", "固定(定期)", "固定(共有)")

と入れていくのが良いのでしょうか?

(Takkr) 2019/09/18(水) 09:26


こんな風に定数で2種類宣言しておいたらいかがでしょうか?

下は、参考まで。動作確認してませんので、上手く結果が出なければごめんなさいです。

Sub test()

    Const cKey材料費 As String = "消耗品,消耗品(品番有),補助材料,補助材料(品番有)"
    Const ckey固定費 As String = "固定(特別),固定(定期)"
    Dim rngTable As Range
    Dim rng固定 As Range
    Dim rngデータ As Range
    Dim ws As Worksheet
    Dim wsList As Worksheet

    Set wsList = Worksheets("該当月リスト")
    Set rngTable = wsList.Range("A1").CurrentRegion
    Getデータセル Split(ckey固定費, ","), "", rngTable, rng固定

    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> wsList.Name Then
            If Getデータセル(ws.Name, Split(cKey材料費, ","), rngTable, rngデータ) Then
                ws.UsedRange.ClearContents
                urion(rngデータ, rng固定).Copy ws.Range("A1")
            End If
        End If
    Next

End Sub

Function Getデータセル(ByVal sKeyWord1 As String, _

                  ByVal sKeyWord2 As String, _
                  ByRef rngTarget As Range, _
                  ByRef Rng As Range) As Boolean
    With rngTarget
        On Error Resume Next
        .Worksheet.ShowAllData
        On Error GoTo 0

        .AutoFilter Field:=3, Criteria1:=sKeyWord1
        .AutoFilter Field:=7, Criteria1:=sKeyWord2

        If .Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then
            Getデータセル = True
            Set Rng = .SpecialCells(xlCellTypeVisible)
        End If
        .AutoFilter
    End With
End Function

(まっつわん) 2019/09/18(水) 10:15


まっつわん様

早速の回答、誠にありがとうございます。

何か高度で難しいですね。検出したいのは"消耗品,消耗品(品番有),補助材料,補助材料(品番有)"だけで

それ以外は

                If .Cells(.Rows.Count, "C").End(xlUp).Row > 1 Then
                    .AutoFilter.Range.Offset(1).Copy
                    Sheets(buf).Range("A73").PasteSpecial Paste:=xlPasteValues
                End If

でA73に張付けたいのですが、あまり高度になると。。。。"(****)"とかの

代用で処理できれば

よのですが、とりあえず参考に修正掛けてみますが

他の方法が有れば教えてください。

なるべくなら、マクロの項目修正を都度しない方法を、選択したいのですが

無理ですかね。

(Takkr) 2019/09/18(水) 11:05


https://www.excel.studio-kazu.jp/kw/20190917170249.html

 こちらとは同じじゃないんですかね

 それはさておき

 このようなケースであれば 
 ・決まった別シートに抽出する
 ・選択条件がある程度固定
 という点で
 オートフィルターよりフィルタオプションのほうがベターだと思いますが・・
 マクロを使わなくてもできますし、
 条件の修正も比較的簡単です。

(渡辺ひかる) 2019/09/18(水) 11:43


コメント返信:

[ 一覧(最新更新順) ]


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