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

Powerpoint VBAを使おう!

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

フィールド数が多いデータに取り組む ②

仕事上,神経を使うデータ集計のために今日も取り組んでみました。
実際のデータも寸前までないので,予測に基づき想定した処理を実装していくというふわふわしたものです。
chemiphys.hateblo.jp

こちらで少し進んでいた作業ですが,実際やっていくと私の浅はかさと,thomさんがアドバイスしてくださってたコードの完成度のものすごさに驚かされました。
アドバイスしてくださった記事はこちら

thom.hateblo.jp

Enumで列を列挙したかった&少し入力してみた感じ,目的の列ラベルを探すのに苦労して,カテゴリ&列数とラベルのミックスでやってみてたんですが

あたりまえの弱点として,列の挿入・削除にきわめて弱い(;´▽`A``それを補助するためにラベル作成をVBAで組んではいたものの,はっきり言って

連想配列の個性(長所)が思いっきり死んでいることにはたと気づく。序列がとても邪魔します。

データ処理のプロなわけではないので,データ構造は適当なまま思いつくまま形作っていき,実際のデータが入った段階で最終形にぐっと持っていく。そのため,列の挿入・削除は頻繁にあり得ます。

しかし間違いは職務上致命的だったりしますので,最終的な正確性は確保しなければいけません。しかも期間もそれほど余裕は無く進行していく業務だったりします。

メンテナンスしにくいものは,まず使えませんので,こないだ自慢げに書いていたカテゴリ分け&序列を完全に撤廃し,
thomさんのコメントにあった,『標準モジュールに普通に縦に並べる』という方法を取りました。シンプルにラベルをそのまま列挙します。
全体で使いたい列挙型ラベルになるので,Publicで宣言して,宣言専用の標準モジュールを1つ確保しました。

ちょっと目的のラベルを探すのには少し時間はかかりますが,1文字入れればインテリセンスでほぼ補完してくれるので,たいした手間ではありません。

列がずれるたびに根本からコードを見直して,チェックしていく必要がある前のラベルは最悪なので,その重要度は比較にもなりません。

でも,目的の列を迷わず確実に選択できるので,今日は83列になっていましたが,コード書いててとても気持ちがよかった。

今まではこの列番号で良かったんだっけとチェックする回数がとても多かったけど,今回は間違いようがありません。

列ラベルにする関係でラベルの文字列は 『 重複✖ 』 『 先頭は数字は✖ 』 という制限は出ますがそこはどうにでもなりました。

今のところプロパティは11個。中にはいくつかのパラメーターを繋げたりした複合型のプロパティもあります。

クラスモジュール内の Property Get 部分だけでそのあたりに対応ができるので,とてもシンプルで感動してました。

Sub LetParameter(paramno, value)
    parameter(paramno) = value
End Sub

Function GetParameter(paramno) As Variant
    GetParameter = parameter(paramno)
End Function

Property Get Self() As Object
    Set Self = Me
End Property

thomさんが書いてくださっているものをここはそのまま使っています。

これがすごいですね。全てのパラメーターを一手に引き受けてくれます。

f:id:chemiphys:20170106194537p:plain  f:id:chemiphys:20170106192553p:plain
パラメーターが83個あるのがローカルウィンドウから確認できます。各プロパティは簡単にアクセスができ,
パラメーターを結合して作ったプロパティもある様がわかっていただけると思います。

ソートや抽出時のキーとなる分はアクセスしやすいようにプロパティにし,ほかの要素についてはGetParameter関数で引っ張っていける。
paramnoには列挙型ラベルを入れますので,そこに何のデータを読み込んでいるのか見ただけでわかる。

こんな見てすぐわかって,柔軟に変えていけるものは今までではじめてです。職務上はとりあえず知ってる知識だけでも組んでいけたので,

今までは,こんな感じでもいいさと思ってて,コメントをたくさん入れてなんとかわかるように作っていました。

今年はなんとなくクラスモジュールに引き込まれている途中なわけですが,いろんな意味で次元の違いを痛感します。

コードが形になってきたあたりから,ローカルウィンドウを見てにやにやしている不思議なヒトになってましたね。

はたから見ると怖い人だったかもしれませんが,目からウロコとはまさにこのことだよな,と大いに納得していました。

thomさんの記事では,さらにデータ抽出の方法等にも触れてあったので,データ処理についても見通しが立ってます。

ソートには,とりあえずソートができるかどうかだけ確認したかったので,

thom.hateblo.jp

こちらのコードをお借りして組んでみました。けっこう短いコードで簡単に並べ替えができることも確認。

安定ソートって表現があるんですね,もう一つキーを与えた場合のコードも簡単に書けたので,ほぼ自分の要求を満たすコードは書けました。

ただ,いろいろな条件を与えてソート・抽出をしなければいけないので,CallByNameを使った~というコードを参考にさせてもらいながら,

ソート・抽出部分を分離していかないとなーと思ってます。

ローカルウィンドウを見るようになって,オブジェクト変数にはかなりの自分が要求していないデータまで含まれているんだなぁと思うようになったこの頃。

必要なデータのみを適切なサイズの入れ物に放り込んで,メンテナンスしやすいコードで処理していくとか

面白そうでたまらなかったりします。

どんどんコードを借りて,自分の要件を満たすものを作っていって触れ続ければ,そのうち自分で設計,コード化ができていくはず。

期間的にクラスモジュールやコレクションを使って業務遂行は実はきついのか!?と不安を持ちつつ,でもやりたいなぁと思いながら,時間の合間を見つけつつ取り込んできました。

これはすごい,これはいけるなと確信できたので,きっちりやり遂げようと思ってるところです。

これ1から自分で作れるようになったら,うれしいだろうなぁ・・(゚▽゚*)