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

14
ほえほえ@スプシマン @hoehoe1234

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

2021-05-29 17:18:53
拡大
ほえほえ@スプシマン @hoehoe1234

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

2021-05-29 17:53:58
ほえほえ@スプシマン @hoehoe1234

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

2021-05-29 17:56:35
拡大
ほえほえ@スプシマン @hoehoe1234

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

2021-05-29 18:01:35
ほえほえ@スプシマン @hoehoe1234

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

2021-05-29 23:22:02
吉田拳@Excel作業代行の㈱すごい改善 @sugoi_kaizen

やはり長くて難しいExcel関数式は徹底的に複数セルに分割した方が「人にやさしい」と再確認した日。 一つ一つのセルの式は極限までかんたんに。 一つずつ順次よく値を出して引き継いで、最後に求める値に行き着く。 その流れがわかりやすい作業セルを用意する感じ。 誰でも分かるシートになる。

2021-05-29 22:46:23
ほえほえ@スプシマン @hoehoe1234

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

2021-05-29 23:41:14
拡大
ほえほえ@スプシマン @hoehoe1234

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

2021-05-30 18:14:03
としじ 🍥🔑 @toshi81350036

ここでなんでMSはVariantで返却させてるのか、Rangeにしたら何かマズかったのか? というのが最大の謎なんだよね〜、まあ仕方ないんだけどもモヤるっちゃモヤるよね( ´Д`)=3 twitter.com/KotorinChunChu…

2021-05-30 17:03:21
拡大
ほえほえ@スプシマン @hoehoe1234

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

2021-05-30 19:00:39
ほえほえ@スプシマン @hoehoe1234

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

2021-05-30 19:04:21
ほえほえ@スプシマン @hoehoe1234

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

2021-05-30 19:05:57
ほえほえ@スプシマン @hoehoe1234

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

2021-05-30 19:08:08
ほえほえ@スプシマン @hoehoe1234

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

2021-05-30 20:41:55
ほえほえ@スプシマン @hoehoe1234

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

2021-05-30 21:29:21
ほえほえ@スプシマン @hoehoe1234

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

2021-05-30 21:32:58
ほえほえ@スプシマン @hoehoe1234

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

2021-05-30 21:40:37
ほえほえ@スプシマン @hoehoe1234

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

2021-05-31 00:42:09
拡大
ほえほえ@スプシマン @hoehoe1234

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

2021-05-31 01:19:38
ほえほえ@スプシマン @hoehoe1234

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

2021-05-31 17:21:50
Excel VBA Diary @excelvba_diary

一つのプロシージャに複数の処理(通常は数個)が含まれている場合、その処理を切り出しし易いようにコードを書く。これでかなり読み易くなるはず。類似の処理が二つ以上現れる場合は、切り出して一つのプロシージャにまとめる。こういう作業を繰り返すうちに適切なプロシージャの大きさに落ち着く。

2021-05-31 17:18:00
ほえほえ@スプシマン @hoehoe1234

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

2021-05-31 18:15:13
ちゅん🐥えくせるちゅんちゅん @KotorinChunChun

また、実体と紐付いていないパスを、実体にする処理は本当はとても難しい(面倒くさい) If Not fso.FolderExists(p) Then fso.CreateFolder p が成功するとは限らない。 同名の File があればエラーになる。 さらに fso.DeleteFolder p は File が存在するとエラーは出ないし、消えもしない。

2021-05-31 09:04:28
ほえほえ@スプシマン @hoehoe1234

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

2021-05-31 18:27:23
ほえほえ@スプシマン @hoehoe1234

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

2021-05-31 20:45:43
ほえほえ@スプシマン @hoehoe1234

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

2021-05-31 20:50:30
拡大
ほえほえ@スプシマン @hoehoe1234

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

2021-05-31 21:09:57
拡大
ほえほえ@スプシマン @hoehoe1234

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

2021-05-31 21:17:24
ほえほえ@スプシマン @hoehoe1234

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

2021-05-31 21:18:55