Powerpoint VBAを使おう!

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

フィールド数が多いデータに取り組む ① Enumをあきらめないために

(エントリの流れのためにちょっと表題を変更しました。)

さて,thomさんにアドバイスをいただいていた分に今日は着手をはじめていました。昨日要素をあらかた決め,ソート等に使うキーになるのが10個くらいあるなぁ
くらいの見通しまで立てて終わってたんですが,少しずつコード部分を考え始めています。

thom.hateblo.jp

列が多いからこそ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

これでどうだ。
f:id:chemiphys:20170105183139p:plain
f:id:chemiphys:20170105183236p:plain
イケルジャナイカ。

ということで,数行でなんとか全部宣言できそうな見通しをつけました。

素のデータは公開できませんので,がっつりてきとーなデータ
f:id:chemiphys:20170105183512p:plain
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の間にいれれば完成です。
f:id:chemiphys:20170105184401p:plain

かっこわるい・・でもいいんだ優先すべきは今回はそこではない。

使ってみる様子
f:id:chemiphys:20170105184603p:plain

だいたいの目星で接頭辞付近を入れていけばその付近に行くので,ずれていればカーソルで移動して終わる。
アクセスのしやすさはかなり改善した。
ラベル情報もあるからほぼ間違わない。

これならいけそう。

まず第一歩をそれなりにスタート。
Collectionにキーを指定しながらデータを入れて行くためのコードの書き方がまったく思いつかなかったり,クラスモジュール使おうとしたらエラーで進まなくて,すっかりいろいろ忘れているようなので
次はそこらへんに進みます。ガンバラナイト。。