[[20201219120235]] 『テーブルの列の空白以外の行をクリアしテーブル範』(muu) ページの最後に飛ぶ

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

 

『テーブルの列の空白以外の行をクリアしテーブル範囲を自動調整』(muu)

sheet1〜sheet10までにA4セルからテーブルがあります。

  A     B    C    D  E  F  G
1
2
3
4 職種番号 職種  職員番号         退職日

この各sheet1〜10のテーブルで一括で下記作業を行いたいです。

1. G列が退職日となっており、退職日が入っている行をすべてクリアする

  行ごと削除するとセルの条件付き書式が増殖するためクリアしたいです。

2. 職員番号、職種番号の順で昇順で並び替えをする。
  クリアした空白行が一番下に移動する

3.一番下にきた空白行をテーブルの範囲から除外するため、テーブル範囲を自動調整する

この3つを一連の動作として行いたいです。
ご教示いただけないでしょうか?

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


 何度かテストしてみたけど、条件付き書式が増殖することはなかったです。
 再現手順を教えてもらえませんか?

 参考までに行削除バージョンです。
 シート1〜10となっていますが、すべてのシーに同じ処理をさせるコードです。
 必要なら、Forの後にIfで条件分岐させますが、正確なシート名がわからないと何もできなかったためすっ飛ばしました。
 対象シート > 対象外シート でしたら、対象外シート名だけ条件分岐してスルーさせればよさそうです。

    Sub test()
        Dim ws As Worksheet
        Dim LO As ListObject
        For Each ws In Sheets
            '各シートにテーブルが1つしかないと想定
            Set LO = ws.ListObjects(1)

            '退職日の絞り込みと削除
            With LO.DataBodyRange
                .AutoFilter Field:=7, Criteria1:="<>" '退職日のみ表示
                '行削除でも条件付き書式が増殖しなかったので、行削除にしました。
                'ListObjectの行削除参考:https://qiita.com/tomikiya/items/d0d9f19221b8dcd93192
                Application.DisplayAlerts = False
                    .Columns(7).SpecialCells(xlCellTypeVisible).Delete '行全体の削除
                Application.DisplayAlerts = True
            End With

            'フィルタ解除
            ws.ShowAllData

            '並び替え
            With LO.Sort
                With .SortFields
                    .Clear
                    '職員番号昇順で文字列も数値とみなして並び替え
                    .Add _
                        Key:=LO.DataBodyRange(4), _
                        SortOn:=xlSortOnValues, _
                        Order:=xlAscending, _
                        DataOption:=xlSortTextAsNumbers
                    '職種番号昇順で文字列も数値とみなして並び替え
                    .Add _
                        Key:=LO.DataBodyRange(1), _
                        SortOn:=xlSortOnValues, _
                        Order:=xlAscending, _
                        DataOption:=xlSortTextAsNumbers
                End With
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
        Next ws
        MsgBox "退職者の削除と並び替えが完了しました。"
    End Sub

(稲葉) 2020/12/19(土) 13:58


稲葉様
ありがとうございます。

条件付き書式に上下のセルが異なる場合そのその境目のA列からV列まで罫線を引くようにしています。
式は=$B5=$B6でやっています。
これが行削除するとどんどん増えていきます。

すいません。
正確にはシート数は35くらいあってそのうち処理をしたいシートは5〜15及び35といった感じです。
ご教示いただいたコードを試してみたら、インデックスが有効範囲にありませんというエラーがでました。
(muu) 2020/12/19(土) 16:41


 >式は=$B5=$B6でやっています。
 なるほど再現できました。ありがとうございます。
 勉強になりました。

 >正確にはシート数は35くらいあってそのうち処理をしたいシートは5〜15及び35といった感じです
 私にそのシートがどれかがわからないです。
 名前で判断できなければ、決まった位置に特定の文言が入っている等でも構いません。
 今回は、テーブルが存在しなければスルーで条件分岐しました。
 しばらくパソコンみませんので、ご了承ください

    Sub test()
        Dim ws As Worksheet
        Dim LO As ListObject
        Dim tmpErr As Long
        Dim msg(2) As String
        For Each ws In Sheets
            tmpErr = 0

            'テーブルが存在すれば処理実行
            If ws.ListObjects.Count > 0 Then
                '各シートにテーブルが1つしかないと想定
                Set LO = ws.ListObjects(1)

                '退職日の絞り込みと削除
                With LO.DataBodyRange
                    .AutoFilter Field:=7, Criteria1:="<>" '退職日のみ表示
                    On Error Resume Next
                    .SpecialCells(xlCellTypeVisible).ClearContents
                    tmpErr = Err.Number
                    On Error GoTo 0
                End With

                'フィルタ解除
                ws.Activate
                LO.Range.Activate 'リストオブジェクトの範囲内のセルがアクティブになっていないと、ShowAllDataでエラーになる
                ws.ShowAllData

                '並び替え
                With LO.Sort
                    With .SortFields
                        .Clear
                        '職員番号昇順で文字列も数値とみなして並び替え
                        .Add _
                            Key:=LO.DataBodyRange(4), _
                            SortOn:=xlSortOnValues, _
                            Order:=xlAscending, _
                            DataOption:=xlSortTextAsNumbers
                        '職種番号昇順で文字列も数値とみなして並び替え
                        .Add _
                            Key:=LO.DataBodyRange(1), _
                            SortOn:=xlSortOnValues, _
                            Order:=xlAscending, _
                            DataOption:=xlSortTextAsNumbers
                    End With
                    .Header = xlYes
                    .MatchCase = False
                    .Orientation = xlTopToBottom
                    .SortMethod = xlPinYin
                    .Apply
                End With

                '処理の結果を文字列で取得
                If tmpErr > 0 Then
                    msg(0) = msg(0) & vbCrLf & ws.Name
                Else
                    msg(1) = msg(1) & vbCrLf & ws.Name
                End If
                LO.Resize LO.Range.CurrentRegion
            Else
                msg(2) = msg(2) & vbCrLf & ws.Name
            End If
        Next ws

        '処理結果の出力
        MsgBox "■退職者がいませんでした" & msg(0) & vbCrLf & _
               "■退職者の削除と並べ替えを実行しました" & msg(1) & vbCrLf & _
               "■対象外のシートです。" & msg(2)
    End Sub

(稲葉) 2020/12/19(土) 17:30


都度、条件付き書式を設定し直すのはどうですか
その場合でも、並び替えは必要ですか?
 Sub test2()
    Dim ws As Worksheet

    For Each ws In Worksheets
        If ws.Name Like "テーブル*" Then
            With ws.ListObjects(1).Range
                .AutoFilter Field:=7, Criteria1:="<>"
                .Offset(1).EntireRow.Delete
                .AutoFilter Field:=7
                With .FormatConditions
                    .Delete
                    .Add(Type:=xlExpression, Formula1:="=$B4=$B5") _
                        .Borders(xlBottom).LineStyle = xlNone
                End With
                .Sort key1:=.Cells(1), Header:=xlYes
            End With
        End If
    Next

 End Sub

(マナ) 2020/12/19(土) 20:02


対象シートかどうかは、シート名で判断させます。
この行です。名前を工夫してください。

 >If ws.Name Like "テーブル*" Then

(マナ) 2020/12/19(土) 20:28


コメント返信:

[ 一覧(最新更新順) ]


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