読者です 読者をやめる 読者になる 読者になる

Powerpoint VBAを使おう!

Powerpoint VBAやExcelのVBAで遊んでいます。Word VBAも始めました。

効率がいいデータ集計ってどうすればいいんでしょうね。

最近はただひたすら,データ集計やデータ整理,整形することに終始する日々でした。

予想だけで作っていたデータ処理と現実のデータ処理では,細部が違い,列の挿入や削除,等データ構成自身がかわることがいくらかあります。

想像より少なくはありましたが,今までなら元データの構造を変えるとかメンテナンスに追われる時間がものすごいものでした。


でも,今回クラスモジュールと列挙型で作ってるので,宣言に使っているモジュールを書き換えるだけで,あとは新規で入ったり,無くなったプロパティ等を書き換えるだけ。

本当にほかに修正するところがないのか,過剰にチェックに回りますが,他に変更することは何もありませんでした。なんというメンテナンスのしやすさ。クラスモジュール様々です。

これは自分にとっては革命的なことです。いろいろと教えてもらったことを組み込んでいって,作り上げてよかったなぁとしみじみ。

まだ途中ですし,始まったばかりですが,とても順調なスタートを切ったようです。



ここのところ,Dictionaryオブジェクトに興味を馳せているんですが,それと並行してやはりCollectionも面白いので使います。通常の配列も。

配列やCollection,Dictionaryオブジェクトの相互データ交換とか,Excelの場合はセルにスムーズに流し込む方法ってなんだろう,といろいろと試してみる。

For each NextやFor Next,Do Loop等を使って目的を達成することはもちろんできます。

例えば Variant変数に Excelシートの範囲の値を 一気に流し込む

Data=worksheets( ).range( ).value

みたいに一気に流し込めたりその逆ができたりすることは,それを知ったとき ( Д ) ゜゜びっくりしました。

CollectionやDictionaryもそんな感じのことができないのか,いろいろと遊んでみているところ。

Excelを使っているのに,配列やらコレクションやらとにらめっこして組むのはどうなの?と,少し思うところが無いわけではありませんが,

頭の中やメモと向き合って,思った通りに組んで,それが見事に形になったとき,妙な達成感がありますので面白い。


ソートもほんとバブルソートだけで私は十分ぽいので,そのあたりのパーツをいつでも使えるように自分専用のライブラリ化すると楽なんですよね。きっと。

とにかくそれなりの規模のデータと向き合い,時間が限られた中,正確に求められるものを出さないといけないので,

いろいろな方のいろいろな方法を見ないといけません。自分で作るとすぐIf文だらけになります(゚▽゚*)

Select caseのほうが好きなんですが,そちらは複数の条件を書くのにはあまり向いてない気がしています。

IIfとかもかっこいいですね。ほんと知れてよかったものです。


解決はしたけどスマートには書けなかったのでどうしようか悩んだことを書いてみます。
f:id:chemiphys:20170203221427p:plain

Sub 抽出()
    Dim TargetSheet: Set TargetSheet = ThisWorkbook.Worksheets(1)
    Dim db As Object: Set db = CreateObject("Scripting.Dictionary")
    Dim Data As Variant: Data = TargetSheet.Range("a1").CurrentRegion.Value
    Dim i As Long: i = 1
    Do
        db(Data(i, 2)) = Data(i, 1)
    i = i + 1
    Loop Until i = UBound(Data)
    
    Dim Collection1 As Collection: Set Collection1 = New Collection
    Dim Collection2 As Collection: Set Collection2 = New Collection
    
    Dim c
    For Each c In db
        If db.Item(c) = "カテ1" Then Collection1.Add c Else Collection2.Add c
    Next
    
    i = 1
    For Each c In Collection1
        TargetSheet.Cells(i, 5) = c
        i = i + 1
    Next
    i = i + 1
    For Each c In Collection2
        TargetSheet.Cells(i, 5) = c
        i = i + 1
    Next

End Sub

昨日教えてもらったことを活かそうと意気揚々と朝シミュレーションをして,うん イケソウダと思い,実際の作業の時間を迎えました。

縦方向に あるデータの所属が並び,横方向には18項目だったかな,いろいろな条件が分類されて並びます。
各データはその条件のどれかにあてはまり,あてはまったらそこに1ずつ追加していき,各要素に該当するデータがいくつあるかを数えています。

そして,データの所属のところに重複の無いリストを使いたかったわけです。

そこで出会ったのは,所属にもいくつかのグルーピングがあり,重複せずなおかつ,カテゴリーごとに分ける必要がありました。

例ではカテ1とカテ2となっていて,順番としてはランダムに入り込んでいます。

dictionaryオブジェクトをせっかく知ったので,それは使おうと思い,キーと値の二値ともを今日は使おうと試みています。

キーには所属を入れ,これは重複を無くしたい。値にはカテゴリの値を入れ,これでグループ分けしたいと考えました。

コードでは,まずdictionaryで重複を無くしあとはif文で二つ準備したCollectionに振り分けてグループ分けしています。

その後,できたCollectionをセルにかっこよく流し込みたいんですが,Variantのように一行でm9(゚∀゚)ビシッと入れる方法は全くわかりませんでした。

ローカルウィンドウの様子からは放り込めそうな気がするのに,いろいろと怒られます。

楽しいのでもうちょい試してみますが,シンプルにかっこよく書けるようになりたいなぁ。