キャリア別でシートを作成 の続き

先日、配列を編集する自作のクラスモジュール「ArrayEdit」を改修した。
infoment.hatenablog.com

しかし、どうにも気持ち悪い。自分でやっておきながら、
「元の配列を書き換える」
という行いが、何だか後ろめたくて仕方ない。

ということで何日かかけて、さらに改造してみた。
f:id:Infoment:20200703224533p:plain

今回は、元々の配列に加え、二つの配列を準備してみた。

  • source_array 元の配列
  • edited_array 編集の結果得られた配列
  • invers_array 編集の過程で除外された配列

三つの関係は単純で、

source_array = edited_array + invers_array

となる。なお、inverse(「逆」の意)のeが抜けているのは、何となく
文字数を揃えたかったから。

すると、先日の「キャリア別でシートを作成する」は、こんな感じになる。
f:id:Infoment:20200703225948p:plain 

これなら、元の配列は温存しつつ、編集結果の二つの配列を取得できる。
さらに配列を貼り付ける際も、上記三つのどれを貼るか指定できるようにした。
※クラスモジュール全文に興味のある方は、更新した ↓ こちらを参照して欲しい。
infoment.hatenablog.com

それでは、今回のテスト用コードがこちら。

Sub test()
    ' テーブル(なんちゃって個人情報)。
    Dim Tb As Excel.ListObject
    Set Tb = Sheet1.ListObjects(1)

        With New VBAProject.ArrayEdit
            ' テーブル全体を元となる配列に格納する。
            .source_array = Tb.Range
            
            ' キャリア別でシートを作成。
            Dim キャリア As String
                キャリア = .source_array(2, Tb.ListColumns("キャリア").Index)
                Do
                    .RowFilter filt:=キャリア, _
                               column_index:=Tb.ListColumns("キャリア").Index, _
                               rf_result:=rdRemain, _
                               select_array:=case_invers
                    
                    .PasteArray sheet_name:=キャリア, _
                                paste_type:=ptTable, _
                                column_autofit:=True, _
                                select_array:=case_edited
                    On Error Resume Next
                    キャリア = .invers_array(2, Tb.ListColumns("キャリア").Index)
                Loop While Err.Number = 0
        End With
End Sub

結果が ↓ こちら。
f:id:Infoment:20200703231045p:plain
f:id:Infoment:20200703231119p:plain
f:id:Infoment:20200703231156p:plain
f:id:Infoment:20200703231228p:plain

5000人のなんちゃってな方々を、1~2秒ほどで仕訳けてしまった。

個人レベルの業務改善としては、まずまずといったところかな。

参考まで。