編集部イチオシ

VBAのクラスはいつ使うのか?なんで使うのか?

時々話題になるVBAのクラスの使いどころが分からないという話。 今日もちょっとした一言から良いお話がいっぱい聞けたので整理しておきました。
72
ちゅん🐤 @KotorinChunChun

#VBA#クラス が出来るまでの流れ① 1.なんかいっぱい変数ができる 2.複数のプロシージャで共有したくて同じ引数を付け始める 3.面倒になってモジュール変数にする 4.変数セットを複数作りたくて、それぞれを配列にする 5.面倒になってやっぱりやめる 6.クラス化して量産できるようにする

2020-02-10 21:34:12
ちゅん🐤 @KotorinChunChun

#VBA#クラス が出来るまでの流れ② 1.なんかいいっぱい変数ができる 2.複数のプロシージャで受け渡したくなる 3.Typeで一つにまとめる 4.複数セット作りたくてType配列にする 5.やっぱりDictionaryで管理したくなるがTypeは入らない 6.クラス化して量産できるようにする

2020-02-10 21:34:12
ちゅん🐤 @KotorinChunChun

#VBA#クラス が出来るまでの流れ③ 4.②と同じ理由でType配列にする 5.複数の列を繋いで使う構文が出来た 6.そこら中で使われ初めて、ルールの確認が面倒になってきた 7.クラス化してルールに沿った結果を返すプロパティを追加した (例:管理番号 & "_" & Format(年月日, "yyyymmdd") & ".xlsm")

2020-02-11 17:48:41
ちゅん🐤 @KotorinChunChun

VBAのデータ構造の進化系リスト モジュール変数群 → Dictionary(列名Const群) → Dictionary(列名Const群)(行数) → Dictionary(列名Const群)(Dictionary(キー)) → 配列(Enum) → 配列(Enum, 行数) → Type → Type(行数) → Class → Class(行数) → Class(Dictionary(キー))

2020-02-11 14:46:19

はけた様

はけた@できるExcel2021 @excelspeedup

このプログラムはクラスモジュールをガンガン使って実装しています。 データ量が多くなると、クラスモジュールを使わない実装だと、相当速度が遅くなると思います。 なので、クラスモジュールが使えないなら、たぶん仕様自体を変えざるを得ません。 twitter.com/excelspeedup/s…

2020-02-10 22:16:11
はけた@できるExcel2021 @excelspeedup

私が作った、他ではあまり見かけないVBAマクロというと、仕訳入力シートのレイアウトが動的に変わるものくらいですかね。 pic.twitter.com/AEceod4PqR

2020-02-08 22:53:12
はけた@できるExcel2021 @excelspeedup

私が作った、他ではあまり見かけないVBAマクロというと、仕訳入力シートのレイアウトが動的に変わるものくらいですかね。 pic.twitter.com/AEceod4PqR

2020-02-08 22:53:12
はけた@できるExcel2021 @excelspeedup

でも、実際は、設計次第でクラスモジュールを使わないでも速くなるのかな?ひょっとしたら。 自分の腕が悪いだけかもしれません。

2020-02-10 22:22:06
はけた@できるExcel2021 @excelspeedup

VBAのクラスは「中身に触れる必要がなければ」メインロジックがスッキリするので、むしろ初心者に優しいと思います。 問題は、中身に触れる必要が出てしまったときですね。一気に、初心者に厳しくなります。

2020-02-10 22:06:48
はけた@できるExcel2021 @excelspeedup

@hoehoe1234 何きっかけでmapが理解できるようになったのか、まったく覚えがないんですよね。 ただ、ある時点で、なぜか「あたりまえ」になりました。

2020-02-10 12:02:22
はけた@できるExcel2021 @excelspeedup

VBAじゃないですけど、昔、map関数が分からず、理解が止まったりとかしてましたからね。今は、mapを使わないと逆に読みづらい感がありますが。 VBAだと、クラスがないと、書きにくくてしょうがないですが、初心者には、優しくないんでしょうね。

2020-02-10 11:49:38

reime様

reime @_reime

「複数の値を返す関数」っぽいのを作るテクで、引数をByRefで渡して呼び出し先で変更するのがあるけど、 あれやるくらいならクラス作ってプロパティを設定するほうがわかりやすいと思う。

2020-02-10 22:22:20
reime @_reime

VBAのクラスモジュールは別に特別な機能でも難解な機能でもないでしょう。 Functionプロシージャと同じくらい気軽に使って良いと思う

2020-02-10 22:52:20
reime @_reime

ただコードが複雑になるにつれて、だんだんとわけがわからなくなる。 それでコードをすっきりさせる為にプロシージャを分割するようになり、もっと複雑になるとクラスを挿入するようになる。要するにコードを完結にする記法。 さらに複雑になったら?VBAじゃない言語でやるべきじゃないかな。

2020-02-10 23:08:13

その他の意見等

Excel VBA Diary (ENOWA Quality Lab.) @excelvba_diary

クラスを使わないという選択肢はないやろ。 とは言え無理に使う必要もないだろう。データー構造と操作をカプセル化することで恩恵を受けるのは、標準モジュールがある程度の規模を持ち、内部構造を意識すことなくプログラミングしたい場合だろう。

2020-02-10 22:46:57
としじ @toshi81350036

今度書くマクロは思いっきりClass使いつつメインをスッキリさせるのを目指して書いてみようかな。

2020-02-10 23:13:35
reime @_reime

@hoehoe1234 燃えそうw 個人的にはTypeの使いどころの方が難しい(といって油を注ぐw)

2020-02-11 01:16:02
ちゅん🐤 @KotorinChunChun

@_reime @hoehoe1234 正直クラスよりTypeのほうが使うの難しいよね 本当に限定的にしか使えない

2020-02-11 01:21:55
ほえほえ@スプシマン @hoehoe1234

@KotorinChunChun @_reime ですね。ワイも実質、メモリ内容を書き込んで型変換(型バインド)するためぐらいにしかつかっていません。なんといってもバリアントバインド不可、コレクション系不可、その他制限多い。ということがありますので涙とともに配列で多値w

2020-02-11 01:24:16

最後に

ちゅん🐤 @KotorinChunChun

@ichina970803 頭空っぽにして読み返すと、実体験のない人には共感できないので意味不明かもしれませんね。 途中工程をすっ飛ばして、説明だけ聞いてクラスを理解しようとすると無理があるんだと思います。 いっぱいコードを書いて、試行錯誤しているうちにクラスにたどり着いた人が多いんじゃないかと。

2020-02-11 11:06:13

このTogetterは @KotorinChunChun が日々の思い出のためにまとめました。
趣味でExcelやVBAのブログ書いてます。よろしくおねがいします。