フィールド数が多いデータに取り組む ① Enumをあきらめないために
(エントリの流れのためにちょっと表題を変更しました。)
さて,thomさんにアドバイスをいただいていた分に今日は着手をはじめていました。昨日要素をあらかた決め,ソート等に使うキーになるのが10個くらいあるなぁ
くらいの見通しまで立てて終わってたんですが,少しずつコード部分を考え始めています。
列が多いからこそEnumをあきらめたくないけど,じゃあ標準モジュールの宣言部分に80行くらい書くのかというのはもちろんノーです。
:でつなげれるし,どうにかあきらめずに済む方法はないかなぁとしばらく考える。
プログラマの方から嫌われるかもしれませんが,背に腹はかえられない。コロンを大量に使う方向で考えよう。
Enum c a = 1: b: c: d: e End Enum
これは使える。 a=1 b=2 c=3 d=4 e=5 として認識してくれる。
Enum c a = 1: b: c: d: e_ f: g: h End Enum
改行したらどうだろうとやってみると,あれれ ラベルになってしまったようです。怒られます。
もともと改行して使ってたものですから,改行先につづくよ,というアンダーバーはまずいらない。
でも,二行目に続かない・・・うーん・・
Enum c a = 1: b: c: d: e f = 6: g: h End Enum
これでどうだ。
イケルジャナイカ。
ということで,数行でなんとか全部宣言できそうな見通しをつけました。
素のデータは公開できませんので,がっつりてきとーなデータ
1行目はいちいちR1C1に直したくないためだけの行。2行目は(結局)現在の予定で84項目になってたので,
カテゴリ分け&メンバ表示のとき自分好みに並べたい&オートコンプリートで目的の要素にすばやくアクセスしたいという接頭辞役
3行目が実際のデータのラベルになります。
素人プログラマのわたしは,フローチャートは書きませんし,設計資料等も作りません。作りながらどんどん変えていく。
なので,ミスを前提として,コードでEnumの中身を生成させることにしました。
たしか,thomさんのブログでイミディエイトウィンドウにコードを書き出させるというのがあったはず・・と頭をひねってみてつくったのが次。
Option Explicit Sub MakeEnum() Dim i As Long: i = 1 Dim Sht As Worksheet: ThisWorkbook.Worksheets ("データ") Dim Rng As Range With Sht Do While .Cells(3, i) <> "" If i = 1 Then Debug.Print .Cells(2, i) & .Cells(3, i) & "=" & .Cells(1, i) & ":"; ElseIf Left(.Cells(2, i), 1) <> Left(.Cells(2, i + 1), 1) Then If .Cells(2, i + 1) = "" Then Debug.Print .Cells(2, i) & .Cells(3, i) Else Debug.Print .Cells(2, i) & .Cells(3, i) Debug.Print .Cells(2, i + 1) & .Cells(3, i + 1) & "=" & i + 1 & ":"; i = i + 1 End If Else Debug.Print .Cells(2, i) & .Cells(3, i) & ": "; End If i = i + 1 Loop End With End Sub
(表記がぶれていたところを訂正しました。インテリセンスも効くようにさらに訂正)
結果は次のように。 横に長いので08以降略
makeenum a01カテ1_01=1:a02カテ1_02: a03カテ1_03: a04カテ1_04: a05カテ1_05: a06カテ1_06: a07カテ1_07: a08カテ1_08 b01カテ2_01=12:b02カテ2_02: b03カテ2_03: b04カテ2_04: b05カテ2_05: b06カテ2_06: b07カテ2_07 c01カテ3_01=19:c02カテ3_02: c03カテ3_03: c04カテ3_04: c05カテ3_05: c06カテ3_06: c07カテ3_07: c08カテ3_08 d01カテ4_01=33:d02カテ4_02: d03カテ4_03: d04カテ4_04: d05カテ4_05: d06カテ4_06: d07カテ4_07: d08カテ4_08 e01カテ5_01=51:e02カテ5_02: e03カテ5_03: e04カテ5_04: e05カテ5_05: e06カテ5_06: e07カテ5_07: e08カテ5_08 f01カテ6_01=69:f02カテ6_02: f03カテ6_03: f04カテ6_04: f05カテ6_05: f06カテ6_06: f07カテ6_07: f08カテ6_08
これをenum なんとか ~ end enumの間にいれれば完成です。
かっこわるい・・でもいいんだ優先すべきは今回はそこではない。
使ってみる様子
だいたいの目星で接頭辞付近を入れていけばその付近に行くので,ずれていればカーソルで移動して終わる。
アクセスのしやすさはかなり改善した。
ラベル情報もあるからほぼ間違わない。
これならいけそう。
まず第一歩をそれなりにスタート。
Collectionにキーを指定しながらデータを入れて行くためのコードの書き方がまったく思いつかなかったり,クラスモジュール使おうとしたらエラーで進まなくて,すっかりいろいろ忘れているようなので
次はそこらへんに進みます。ガンバラナイト。。