2021年6月1日

エクセル、VBA、プログラミング雑感

13
ほえほえ@DX塾 @hoehoe1234

VBAでは関数の戻り値の設定箇所がわかりにくいという構文上の欠点があったんだけど、短いよい名前のプロパティを導入することで解決したった!。他言語から来たひと限定かもしれませんがw pic.twitter.com/QZSoRMy6eY

2021-05-29 17:18:53
拡大
ほえほえ@DX塾 @hoehoe1234

VBAのプロパティええね。まあ沼でもあるんだけど。set|let/getは同一関数でできるようにしてほしかったけど記法上むりやったんかな。フレンドな変数がほしいけど、それ、すでにオブジェクトやしwww。

2021-05-29 17:53:58
ほえほえ@DX塾 @hoehoe1234

この記法はVBAの戻り値の仕組みを隠すとともに、オブジェクト/値型を同一視し、かつ、Retrunという名称により戻り値が設定されていることが明示的にわかる。すばらしい。引数としてのtk_runは自明なので簡単に戻り値を設定しているとよめる。 pic.twitter.com/F26rnmmi9o

2021-05-29 17:56:35
拡大
ほえほえ@DX塾 @hoehoe1234

ワークシート関数で参照を返すのはoffsetとindirectだけなのかな。indexも返すけど操作には不便だし。ワークシート関数で、Union、Range、Intersectはどう表現すればよいのかわからない。(レンジの記法なんだろうけどもっとおもしろいことがしたい・・)

2021-05-29 18:01:35
ほえほえ@DX塾 @hoehoe1234

エクセルの関数のわかりにくさは2つあるかな?とおもっていまして、 ①関数なので入れ子になり対応関係がわかりにくい ②変数のように「よい名前」が付けられない のうち、作業列では「②」に名前が付けられるのでとてもよいと思います。王道だと思います。 twitter.com/sugoi_kaizen/s…

2021-05-29 23:22:02
ほえほえ@DX塾 @hoehoe1234

@sugoi_kaizen なるほど。ワイはこんなユーザ関数(UDF)を作って特定のシート(ブック情報)などに固定表示してます。名前は、視認性さえよければ強力ですよね。 pic.twitter.com/SYIa3iftFk

2021-05-29 23:41:14
拡大
ほえほえ@DX塾 @hoehoe1234

ValueとItemのどちらにディスパッチしてよいかはLet/Set文脈または左辺値の型によりきまるのでしかたないっす。だからこそ便利なんですけど。 twitter.com/toshi81350036/… pic.twitter.com/5fHAdtQDHN

2021-05-30 18:14:03
拡大
ほえほえ@DX塾 @hoehoe1234

range(文字列)とcells(i,j)が結果的に比較されるのはデフォルトプロパティのせいなんだけど、これはプラスの面が相当大きいとおもいます。とにかくわかりやすい。いやわからなくても「それでよい」というようにできています。DPは功罪ともどもですね。

2021-05-30 19:00:39
ほえほえ@DX塾 @hoehoe1234

cellsはあくまでプロパティで親オブジェクトをセル単位にスライスし直すだけなんですけど、 ①x = cells(i,j)は ②cells.[_defalult]経由でItem(i,j)メソッドを呼び出し ③Item(i,j)は新しいRangeを返し(これをrngとします) ④x = rngとなるので

2021-05-30 19:04:21
ほえほえ@DX塾 @hoehoe1234

⑤rng.[_defalut]経由で、今度は引数がないのでValueメソッドを呼び出し ⑥この呼出結果(値)がxに代入される という手順を踏んでるんですね。

2021-05-30 19:05:57
ほえほえ@DX塾 @hoehoe1234

ですから途中経過を省くと ⑦x = rng.Item(i,j).Value がもっともシンプルな形となります。この形を ⑧x = rng(i,j) で表記ためにデフォルトプロパティとItemとValueへの引数ありなしによるディスパッチがあるのですね。よくできていると思います。

2021-05-30 19:08:08
ほえほえ@DX塾 @hoehoe1234

Range("A1")形式はよいが、Range("R1C1")形式を許容しないのはうまいとおもう。Rnage(1,1)形式も許容しないのもうまい設定。cells(i,j)というショートカットとあまり誤用が生じないようになっているように思う。Itemメソッドが"A"を1に読み替えるのはやや不満。そこは関数か演算子用意してほしかった。

2021-05-30 20:41:55
ほえほえ@DX塾 @hoehoe1234

@excelvba_diary なるほど。そのような経緯があったのですね。Range("A1")形式、"RC"形式、cells(i, j)、デフォルトプロパティ・・・歴史、経緯、設定が入り混じって現在の姿なのですね。

2021-05-30 21:29:21
ほえほえ@DX塾 @hoehoe1234

あえていうならば、その他のデバック手法を覚えなくなるとか、ステップインでは解析できないようなモノ(非同期、再帰、式ベースの関数、、、)があるということでしょうか。単に併用すればよいので否とはいえませんがwww。ステップ実行とイミデト実行は最高ですね。 twitter.com/sugoi_kaizen/s…

2021-05-30 21:32:58
ほえほえ@DX塾 @hoehoe1234

中学までの数学ほんと大切。 A1 -> 数字 数字 -> A1 形式で使う数学は中学(小学?)レベルだけど割となやんだりします。これは商と剰余の問題ですね。

2021-05-30 21:40:37
ほえほえ@DX塾 @hoehoe1234

これは反対側。簡単。 midループをつかってもいいけど、文字列の配列化をしている。 pic.twitter.com/9y7ygB0wGk

2021-05-31 00:42:09
拡大
ほえほえ@DX塾 @hoehoe1234

自分のコードには必要ないけど、他人のアプリをみるためには「モジュール構成図」を作る必要がやっぱりありますよね。関数一覧とかは自動生成できるので後は関数単位に解析して呼び出しツリーをつくればええのかな?

2021-05-31 01:19:38
ほえほえ@DX塾 @hoehoe1234

モジュール(関数)の凝縮度と疎結合密結合のはなしはほんとうに難しいです。わいも本職を退いて、ブバTLをみて、自分でライブラリつくってみて、言語化をして、最近やっと感覚がつかめたように思います。オブジェクト指向だとその部分は曖昧でもうまくいきますからね。 twitter.com/excelvba_diary…

2021-05-31 17:21:50
ほえほえ@DX塾 @hoehoe1234

抽象パス(あるかないかわからないディレクトリorファイル)の存在確認は ①パスの最後に\があれば削除 ②getattr関数でパスの属性確認 でうまくいくと思います。 ただ例外があって C:\はC:にしちゃうとDocuments見にいっちゃうし、\のみは読み替えが発生しますし・・・ twitter.com/KotorinChunChu…

2021-05-31 18:15:13
ほえほえ@DX塾 @hoehoe1234

モジュール変数はとても便利なので、教条主義におちいることなくつかってみてほしい。これは結局は関数が1つの状態を持つということで、通常は悪い副作用がおおいんだけど、うまく使えばほんと便利です。

2021-05-31 18:27:23
ほえほえ@DX塾 @hoehoe1234

関数の所属するモジュールは、「もしクラスが作れたらどのクラスにこの関数は所属するべきか?」で考える。ただし、ダンプ、ログのようなアスペクト系もあるのでちょっと注意が必要。でも大体はこの考えでいいはず。なぜなら探すときの考え方だから。

2021-05-31 20:45:43
ほえほえ@DX塾 @hoehoe1234

モジュール変数の使い方例。このような文字列系の関数ではエラーも文字列となるので最終ステータスをモジュール変数に持たせておくと呼び出し側できれいなコードをかけます。再帰対応にするには1つラップが必要になりますけど多くの場合は不要でしょう。 pic.twitter.com/kYNfQ7DwMv

2021-05-31 20:50:30
拡大
ほえほえ@DX塾 @hoehoe1234

DSUソートにソート関数オブジェクトを注入できるようにしてみた。ワークシート関数も注入可能。 pic.twitter.com/igPluWtzV0

2021-05-31 21:09:57
拡大
ほえほえ@DX塾 @hoehoe1234

強い凝縮性はあたりまえなので前提として、密結合から疎結合への変換は、要は、識別子(構文)による結合からデータによる結合に変換すればよくて、そこが理解できれば様々な手法を俯瞰して見ることができるようになると思います。

2021-05-31 21:17:24
ほえほえ@DX塾 @hoehoe1234

関数オブジェクト、ジェネレーター、クロージャ、データ構造引き回し・・・すべて構文結合を避けるための手法、記法、機能とみることができますね(もちろん、他の機能もありますが)。この理解の先に、エクセル+VBAでのシート密結合方式があると思います。

2021-05-31 21:18:55
残りを読む(24)

コメント

コメントがまだありません。感想を最初に伝えてみませんか?