キャリア別でシートを作成 の続き
先日、配列を編集する自作のクラスモジュール「ArrayEdit」を改修した。
infoment.hatenablog.com
しかし、どうにも気持ち悪い。自分でやっておきながら、
「元の配列を書き換える」
という行いが、何だか後ろめたくて仕方ない。
ということで何日かかけて、さらに改造してみた。
今回は、元々の配列に加え、二つの配列を準備してみた。
- source_array 元の配列
- edited_array 編集の結果得られた配列
- invers_array 編集の過程で除外された配列
三つの関係は単純で、
source_array = edited_array + invers_array
となる。なお、inverse(「逆」の意)のeが抜けているのは、何となく
文字数を揃えたかったから。
すると、先日の「キャリア別でシートを作成する」は、こんな感じになる。
これなら、元の配列は温存しつつ、編集結果の二つの配列を取得できる。
さらに配列を貼り付ける際も、上記三つのどれを貼るか指定できるようにした。
※クラスモジュール全文に興味のある方は、更新した ↓ こちらを参照して欲しい。
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
結果が ↓ こちら。
5000人のなんちゃってな方々を、1~2秒ほどで仕訳けてしまった。
個人レベルの業務改善としては、まずまずといったところかな。
参考まで。