ほえほえのプログラミング情報(2021年7月投稿順)

5
前へ 1 2 ・・ 24 次へ
ほえほえ@スプシマン @hoehoe1234

簡単な例だと「ファイルのコピーでコピー先に同じファイルがある場合」などは、機能としてはフィアルのコピーだけどUIとして「Yes/No/Skip」なんかをユーザに確認したくなるんだよね。

2021-06-28 05:20:17
ほえほえ@スプシマン @hoehoe1234

これをUIとその他に分離しようとすると、UIモジュール内で先に「フィアルがあるかどうかを確認する」必要がでてくるんだよね。もしくは関数IFを工夫して「ファイルがあることを返す」とかを分かるようにするとか。

2021-06-28 05:21:22
ほえほえ@スプシマン @hoehoe1234

他には、引数で「問い合わせをするかしないか」というフラグを渡したりも考えられる。しかし、UIが機能モジュールの中にあるとエクセルアプリとかならまだいいんだけど、既存の他のUIと合わないこともかんがえられるんだよね。

2021-06-28 05:22:46
ほえほえ@スプシマン @hoehoe1234

こういうのが延々とつづいて、これは結局、どういう問題かというと「機能の中で問い合わせをしたいんだけど、その問い合わせ機能を『疎結合』にできない」ってもんだいなんじゃないかと思う。

2021-06-28 05:24:17
ほえほえ@スプシマン @hoehoe1234

この場合の基本的な解決方法は「こまったらコールバックしてね」の方式で、関数に「既存ファイルが有った場合のコールバックを引数で渡す」という解決方法があるんだよね。これはもう、そこらじゅうで使われている基本的な解決方法なんだけどね。

2021-06-28 05:25:44
ほえほえ@スプシマン @hoehoe1234

これは関数を注入するひつようがあって、フラグじゃあだめなですよね。フラグだとUIコードが構文結合しちゃうんでUIを呼び出し側が変えられない。なのでコールバックにしてコールバック関数内でUIを構築する必要ががでてくるんだよね。これでいちおう分離はできた形になる。

2021-06-28 05:27:31
ほえほえ@スプシマン @hoehoe1234

これを実装するには、エラートラップができないという欠点があるけどrun関数で十分なのでは?と思います。疎結合の方式は、思いつく限り書いてみると、

2021-06-28 05:29:03
ほえほえ@スプシマン @hoehoe1234

①データ構造をまとめて返す(戻り値) ②データを都度返す(ジェネレータ)VBAになし ③第一引数にグローバルな構造化されたデータ構造 ④コールバック関数の登録 ⑤インスタンスの登録 ⑥関数オブジェクトの登録(④、⑤、⑥は概念的には同じ) ⑦シートによる共有 みたいな感じ?

2021-06-28 05:32:02
ほえほえ@スプシマン @hoehoe1234

いろいろ方式はあるけど、結局は「構文結合」をどうやって回避するか?ってところになるんだなと。構文結合とはその内容を変化點せられないものがコード中に直接現れること。端的には関数呼び出しだね。

2021-06-28 05:33:14
ほえほえ@スプシマン @hoehoe1234

もとに戻って検討すると、UIモジュールは分離したいけど、非UIモジュール内でもUIが使いたいことがあり、それをどう解決するか?ということなんだよね。現状ではワイの解決策はやはりrun関数を使ったコールバックかな? おしまい。

2021-06-28 05:35:10
ほえほえ@スプシマン @hoehoe1234

TLでみたことなんですけど、VBAの配列へんてこ問題の1つは ①dim arr(4) ではなくて ②dim arr(1 to 5)とすることで相当わかりやすくなりますね。 あとはベース0と1の混在による混乱はもうしかたないですが、for文と合わせて1ベースはとても使い勝手がいですね。他言語から来た人は使ってみて。

2021-06-28 05:48:16
ほえほえ@スプシマン @hoehoe1234

for i = 1 to coll.count for i = 1 to len(s): x =mid(s, i,1) for i = Lbound(a) to Ubound(a) このように、a to b形式で書く場合は両端が含まれる形式にするととても都合がよくて、終了インデックスがlen(s)などで取れるのは本当に書きやすい。

2021-06-28 05:58:52
ほえほえ@スプシマン @hoehoe1234

正規表現、めんどくさいけどやるか・・・。正規表現からVBAのコードに落としてくれるツールとかないかな?w

2021-06-28 17:29:56
ほえほえ@スプシマン @hoehoe1234

パターンぽいものを正規表現ぽいもので書く⇒レールロードを書く⇒状態遷移に直す⇒相互再帰でパーサぽいもの書く・・というのがめんどくさくて仕方ない・・・。簡単にえばlexがほしい。vba-lex。lex準拠で書いたら認識ルーチンを生成してほしい。

2021-06-28 17:33:23
ほえほえ@スプシマン @hoehoe1234

unixの世界では30年も40年も?w前から標準ツールでlexがついてる。これでパターン書くだけでC言語で利用できる関数が生成される。VBAで正規表現で抹茶操作してどうのこうのという道の他に、VBA関数生成する道も用意してほしい。 ja.wikipedia.org/wiki/Lex

2021-06-28 17:35:45
ほえほえ@スプシマン @hoehoe1234

正規表現をプログラム中で書くという利用とは別に、字句解析部を作るというのは別の用途として必要。もしこれがあれば、CSVの解析なんてCSV解析用lexファイルを流通させて終わりなのにね。コード生成してくれると介入できるから便利なんだよね。

2021-06-28 17:38:08
ほえほえ@スプシマン @hoehoe1234

探したらそれぽいもの有ったけど、リンク切れだったわ。lexファイル読み込んでVBAのモジュール(内部には複数の認識関数)を作るツールほしい。これを内部文字列に応用すると文字列の解析が正規表現ベースでなくてコードベースで簡単にできるようになるんだけどね。

2021-06-28 17:40:54
ほえほえ@スプシマン @hoehoe1234

まあこんなの作るとなると大変だから、まずは正規表現を入力したらそれでトークナイザー作るとか、正規表現で分割するとか、エスケープ処理をするとか、そういうregexpによく使うラップかぶせたようなのを作るのがワイには限界や・・・。

2021-06-28 17:45:26
ほえほえ@スプシマン @hoehoe1234

たしか、lexとかだと優先順位があって、上に書いたほうが優先順位が高くて「かぶる」正規表現も使えたように思う。字句解析部というとちょっと大げさだけど、入力文字列解析って感じで手軽に使いたい。

2021-06-28 17:47:11
ほえほえ@スプシマン @hoehoe1234

for each e in token_stream(reg_ptn, s) k = token_king(e) v = token_valu(e) こんな感じでかきたいんや。パターンと種別の関連付けを指定できないのがかなしい。lexだとできる。

2021-06-28 17:50:31
ほえほえ@スプシマン @hoehoe1234

lexつかうと、受理したトークンとその種別が得られるんだよね。 ①パターンの優先順位を指定できる ②受理したトークの種別を指定できる この2つは解析部を作る上で必要だからね。これを正規表現でやると都度ロジックが必要になる。なのでvba-lexほしい。楽がしたい。

2021-06-28 17:52:24
ほえほえ@スプシマン @hoehoe1234

ワイもつくってみた。ちょうど関数の説明に前からほしかったところ。神髄さんのサイトを参考にさせていただきました。ほんとなんでもあります。ありがたいです。 excel-ubara.com/excelvba5/EXCE… pic.twitter.com/oygLq32yJi

2021-06-29 03:10:23
拡大
ほえほえ@スプシマン @hoehoe1234

withは便利だからプロパティ設定系は使っていこうかな。ローカル変数とメソッド/プロパティがバッティングするのもう対策やめ。ローカル変数の頭大文字を許容することにしますたw。最初からそうしとけばよかったかも?。TLで教えてもらった方式。

2021-06-29 03:25:23
ほえほえ@スプシマン @hoehoe1234

①app.wait  VBAのスレッドが止まる ②sleep api エクセルのプロセスが止まる ③doEvents エクセルプロセスが実行可能状態のままOSに制御(プロセス?イベントループ?)を返す であってるかな?

2021-06-29 03:52:38
ほえほえ@スプシマン @hoehoe1234

@akashi_keirin @MasazaneKunohe これ、たぶん、ArgumentのAで、smalltalk(1980年代)ぐらいから有ったように思います。変数プレフィックスは型の短縮名よりも変数の性質によりつけるのがVBAではうまく機能しますね。特に仮引数の「a_」はおすすめですわ。

2021-06-29 19:29:09
前へ 1 2 ・・ 24 次へ