インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

Excelデータを扱う コレクションラッパークラス⑤ 検証中

chemiphys.hateblo.jp
利用は自己責任で,と謳ってはいても,できうる限り確認はしなきゃいと,確認してみています。

自分も,実際使う気満々なので,そのためにも検証したかった。
たった5行程度のデータで作ってましたからね,大量のデータを使ってみないと。
thomさんのブログで紹介されている,なんちゃって個人情報を使ってみました。200件のデータを準備
f:id:chemiphys:20170205121505p:plain
自動生成されたものとはいえ,確かに実名と重なる可能性があるので,ちっちゃいです。

前のコードの DataCollection.cls に Countプロパティ を追加しました。そっちのほうが使い勝手が良かった。

Property Get Count() As Long
    Count = Col.Count
End Property

そして,標準モジュールでいろいろ試してみた。

Option Explicit

Sub test()
    Dim Data As DataCollection: Set Data = New DataCollection
    Dim TargetSheet As Worksheet: Set TargetSheet = ThisWorkbook.Worksheets(1)
    
    '元データを設定
    Data.GetData TargetSheet.Range("a1"), True
    Dim ret As Variant
    
    Data.Extract(3, "=", "男").Reduce("1 2 3 7 6 4").Output Worksheets(2).Cells(1), True
    
    '重複無しリストをvariantで返す。添え字は1からにしています。第3引数を付けると,ワークシートに出力
    ret = Data.UniqueList(7, False, TargetSheet.Cells(1, 10))
    Dim i
    For i = 1 To UBound(ret)
        TargetSheet.Cells(i, 11) = Data.Extract(7, "=", ret(i)).Count
        Worksheets.Add after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
        Data.Extract(7, "=", ret(i)).Output ActiveSheet.Cells(1, 1), True
        ActiveSheet.Name = ret(i)
    Next

    ret = Data.UniqueList(4, True, TargetSheet.Cells(1, 12))
    For i = 1 To UBound(ret)
        TargetSheet.Cells(i, 13) = Data.Extract(4, "=", ret(i)).Count
    Next
    
    ret = Data.UniqueList(6, True, TargetSheet.Cells(1, 14))
    For i = 1 To UBound(ret)
        TargetSheet.Cells(i, 15) = Data.Extract(6, "=", ret(i)).Count
    Next

    
End Sub

単独でそれぞれ使うのは前回やってみていましたが,作り的に,組み合わせて使えるように作れているようでした。自覚無し。

Data.Extract(3, "=", "男").Reduce("1 2 3 7 6 4").Output Worksheets(2).Cells(1), True

性別が男のデータを抽出して,列を1,2,3,7,6,4の順に並び替えて 2番目のシートに出力する。 3つのメソッドを組み合わせて使えました。
さすがFunction

ret = Data.UniqueList(7, False, TargetSheet.Cells(1, 10))
Dim i
For i = 1 To UBound(ret)
TargetSheet.Cells(i, 11) = Data.Extract(7, "=", ret(i)).Count
Worksheets.Add after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
Data.Extract(7, "=", ret(i)).Output ActiveSheet.Cells(1, 1), True
ActiveSheet.Name = ret(i)
Next

前回ミスってたUniqueListで 重複無しリストを出力して,そのそれぞれについて,抽出したデータのカウントを取ったり,
ワークシートを追加して,Extractで抽出したデータをOutputで次々に出力していく。これもできました。

非常に多くのシートができるので,スクリーンショットは載せませんが,やっていることに対して, 標準コードの量はかなり少ない。

テストの検証はずさんではありますので,まだ使い込んでみないとわからないことも多々ですが,なかなかうまく動いている気はする。

かなり複雑化しましたので,もはやラッパークラスという表現はおかしいのかもしれませんが,

Collectionは便利でとてもいいものだと思いつつ,使いづらいなと思った点をクラスモジュールで自分が使いやすいように変えていけるという実感は今回持てました。

経験を積めば,もっときちんと組めるようになるかな~。