- hoehoe1234
- 2857
- 4
- 1
- 0
簡単な例だと「ファイルのコピーでコピー先に同じファイルがある場合」などは、機能としてはフィアルのコピーだけどUIとして「Yes/No/Skip」なんかをユーザに確認したくなるんだよね。
2021-06-28 05:20:17これをUIとその他に分離しようとすると、UIモジュール内で先に「フィアルがあるかどうかを確認する」必要がでてくるんだよね。もしくは関数IFを工夫して「ファイルがあることを返す」とかを分かるようにするとか。
2021-06-28 05:21:22他には、引数で「問い合わせをするかしないか」というフラグを渡したりも考えられる。しかし、UIが機能モジュールの中にあるとエクセルアプリとかならまだいいんだけど、既存の他のUIと合わないこともかんがえられるんだよね。
2021-06-28 05:22:46こういうのが延々とつづいて、これは結局、どういう問題かというと「機能の中で問い合わせをしたいんだけど、その問い合わせ機能を『疎結合』にできない」ってもんだいなんじゃないかと思う。
2021-06-28 05:24:17この場合の基本的な解決方法は「こまったらコールバックしてね」の方式で、関数に「既存ファイルが有った場合のコールバックを引数で渡す」という解決方法があるんだよね。これはもう、そこらじゅうで使われている基本的な解決方法なんだけどね。
2021-06-28 05:25:44これは関数を注入するひつようがあって、フラグじゃあだめなですよね。フラグだとUIコードが構文結合しちゃうんでUIを呼び出し側が変えられない。なのでコールバックにしてコールバック関数内でUIを構築する必要ががでてくるんだよね。これでいちおう分離はできた形になる。
2021-06-28 05:27:31これを実装するには、エラートラップができないという欠点があるけどrun関数で十分なのでは?と思います。疎結合の方式は、思いつく限り書いてみると、
2021-06-28 05:29:03①データ構造をまとめて返す(戻り値) ②データを都度返す(ジェネレータ)VBAになし ③第一引数にグローバルな構造化されたデータ構造 ④コールバック関数の登録 ⑤インスタンスの登録 ⑥関数オブジェクトの登録(④、⑤、⑥は概念的には同じ) ⑦シートによる共有 みたいな感じ?
2021-06-28 05:32:02いろいろ方式はあるけど、結局は「構文結合」をどうやって回避するか?ってところになるんだなと。構文結合とはその内容を変化點せられないものがコード中に直接現れること。端的には関数呼び出しだね。
2021-06-28 05:33:14もとに戻って検討すると、UIモジュールは分離したいけど、非UIモジュール内でもUIが使いたいことがあり、それをどう解決するか?ということなんだよね。現状ではワイの解決策はやはりrun関数を使ったコールバックかな? おしまい。
2021-06-28 05:35:10TLでみたことなんですけど、VBAの配列へんてこ問題の1つは ①dim arr(4) ではなくて ②dim arr(1 to 5)とすることで相当わかりやすくなりますね。 あとはベース0と1の混在による混乱はもうしかたないですが、for文と合わせて1ベースはとても使い勝手がいですね。他言語から来た人は使ってみて。
2021-06-28 05:48:16for 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パターンぽいものを正規表現ぽいもので書く⇒レールロードを書く⇒状態遷移に直す⇒相互再帰でパーサぽいもの書く・・というのがめんどくさくて仕方ない・・・。簡単にえばlexがほしい。vba-lex。lex準拠で書いたら認識ルーチンを生成してほしい。
2021-06-28 17:33:23unixの世界では30年も40年も?w前から標準ツールでlexがついてる。これでパターン書くだけでC言語で利用できる関数が生成される。VBAで正規表現で抹茶操作してどうのこうのという道の他に、VBA関数生成する道も用意してほしい。 ja.wikipedia.org/wiki/Lex
2021-06-28 17:35:45正規表現をプログラム中で書くという利用とは別に、字句解析部を作るというのは別の用途として必要。もしこれがあれば、CSVの解析なんてCSV解析用lexファイルを流通させて終わりなのにね。コード生成してくれると介入できるから便利なんだよね。
2021-06-28 17:38:08探したらそれぽいもの有ったけど、リンク切れだったわ。lexファイル読み込んでVBAのモジュール(内部には複数の認識関数)を作るツールほしい。これを内部文字列に応用すると文字列の解析が正規表現ベースでなくてコードベースで簡単にできるようになるんだけどね。
2021-06-28 17:40:54まあこんなの作るとなると大変だから、まずは正規表現を入力したらそれでトークナイザー作るとか、正規表現で分割するとか、エスケープ処理をするとか、そういうregexpによく使うラップかぶせたようなのを作るのがワイには限界や・・・。
2021-06-28 17:45:26たしか、lexとかだと優先順位があって、上に書いたほうが優先順位が高くて「かぶる」正規表現も使えたように思う。字句解析部というとちょっと大げさだけど、入力文字列解析って感じで手軽に使いたい。
2021-06-28 17:47:11for each e in token_stream(reg_ptn, s) k = token_king(e) v = token_valu(e) こんな感じでかきたいんや。パターンと種別の関連付けを指定できないのがかなしい。lexだとできる。
2021-06-28 17:50:31lexつかうと、受理したトークンとその種別が得られるんだよね。 ①パターンの優先順位を指定できる ②受理したトークの種別を指定できる この2つは解析部を作る上で必要だからね。これを正規表現でやると都度ロジックが必要になる。なのでvba-lexほしい。楽がしたい。
2021-06-28 17:52:24ワイもつくってみた。ちょうど関数の説明に前からほしかったところ。神髄さんのサイトを参考にさせていただきました。ほんとなんでもあります。ありがたいです。 excel-ubara.com/excelvba5/EXCE… pic.twitter.com/oygLq32yJi
2021-06-29 03:10:23withは便利だからプロパティ設定系は使っていこうかな。ローカル変数とメソッド/プロパティがバッティングするのもう対策やめ。ローカル変数の頭大文字を許容することにしますたw。最初からそうしとけばよかったかも?。TLで教えてもらった方式。
2021-06-29 03:25:23①app.wait VBAのスレッドが止まる ②sleep api エクセルのプロセスが止まる ③doEvents エクセルプロセスが実行可能状態のままOSに制御(プロセス?イベントループ?)を返す であってるかな?
2021-06-29 03:52:38@akashi_keirin @MasazaneKunohe これ、たぶん、ArgumentのAで、smalltalk(1980年代)ぐらいから有ったように思います。変数プレフィックスは型の短縮名よりも変数の性質によりつけるのがVBAではうまく機能しますね。特に仮引数の「a_」はおすすめですわ。
2021-06-29 19:29:09