No.3ベストアンサー
- 回答日時:
貴方、アタマがいいね。
> もっと簡単に考えることができるのでは無いかと思っています。
こう考えられる人は少ない、んだ。
生憎、僕は全然VBは知らないんだけど、個人的には発想は間違ってないと思うよ。
図を描ける辺りもいい。
んで、だな。
恐らく単純な問題で、まずは一つの方策。
貴方が恐らく気づいたポイントは、「似たようなパターンが頻出してる」って辺りだと思う。「似たようなパターンが頻出してる」のに全部を関数として一纏めにすると「条件分岐が煩わしい」と。
言い換えると「全部を一つの関数として書いちゃおう」としなければいいんだよな(笑)。
貴方が提示した図はコンピュータサイエンスでは総合的には「木」と言われるモノになっている。「締め切り入力」を「根」、あるいは「ルート」と呼ぶ。「10日以前」とか「xがnullか」と言うのは「節」、あるいは「ノード」と呼ぶ。そして末端を「葉」と呼ぶ。
ちょうど、現実世界にある「木」が上下逆になってるように見えるよね?
で、だ。
葉から考えてみると、
xがnullか---->エラーメッセージ
|
|-> 画面遷移
って「パターン」は木の右も左も変わんないわけだよな。こういう「パターンが全く変わらない」部分をまとめちゃって「関数にしちまえばいい」んだよ。
その上も
yがnullか---->xがnullか
|
|-> 画面遷移
と実は全く同じパターンだ。と言うことは上で作った関数が・・・汎用的なら適用可能だ、って事だ。ここも右も左もパターンが同じだ。
こういうカンジで、葉から初めてルートに向かって「必要な関数」を組み上げて、呼び出しつつそれらを繰り込んでいけば、最終的にはルートからの分岐は条件分岐が2つで済む、わけだ。
上手い具合に引数と返り値が連鎖出来るように書けば、「全部を一纏めにした関数」として書くよりスッキリすると思うよ。
繰り返すけど、貴方が「もっと簡単に考えることができるのでは無いか」って感付いた最大の原因は「類似パターンが多い」と言う辺りなんだと思う。結果、「類似パターンが多い」のならその「パターン」は敢えて切り出しちゃって、そこだけを「小さい関数」として書いちゃう、ってのが良い方策だと思う。関数は「部品」なんで、そういうパーツを細かく書いていって、最終的に大きな関数にする、ってのはティピカルな方法論だ。
そして一般に、プログラマって「深いネスト(入れ子)は好まない」んだよ。貴方が最初に書こうとした関数は、条件分岐により「深いネスト」を生成する。その辺に拒否感もあったんだろう。そういう「拒否感」は大事な感覚だ。だから最終的に「分岐はたった2つ」まで落とし込むのは戦略的には悪い手ではなくなる。
ちなみに、貴方が描いた図はコンピュータサイエンス的には二分木と呼ぶ。
二分木:
https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86 …
実の事を言うと、VBより高機能な言語(例えば関数がファーストクラスオブジェクトだったり、遅延評価を持ってる言語)だったら、実際貴方が描いたダイアグラムそのままで、データ型として直接二分木を実装する、ってのも悪くない手だとは思う。そうすれば、ちょっとした単純な「検索関数」を作って、二分木を条件によって辿って行くだけで望んだ結果になる、ってテクニックだよな。
まぁ、その辺はVBだと出来ないか、逆にかなりややこしくなる畏れがあるんで、やっぱ単純に「細かい関数」を書いていって繰り込んでいった方がいいと思うよ。
No.6
- 回答日時:
赤い木と黄色い木が、非常に似通っていますよね。
木を共通にして、違いのある部分だけ
if( 締切日が10日以前 ) 赤の処理 else 黄色の処理
の形で各所にバラ撒いたほうが、
何をやっているのか見通しがよいと思います。
No.5
- 回答日時:
簡単にする事のために非常に重要なのはデータ構造を考えることからです。
またそれとは関係なくif分岐はベン図で表せると思っていて、
あなたの行いたい作業における集合がシンプルかどうかで分岐処理の複雑さは異なるかと思いますし、ベン図に起こせば複雑な処理はもっと簡単にも見えます。(見え方、感じ方の問題です。)
多分やりたいこととしては、10日以内なら先月のデータを表示したいみたいなことじゃないでしょうか?
業務ソフトだとそういう需要はよくありますが。
(他の人がより良い回答をしてくれるかもしれません。)
No.4
- 回答日時:
画像投稿は文字が正確に読めないので止めた方が良いです。
エラーメッセージでない方の分岐は、画像の右も左も(文字が読み取れる範囲では)同じように見えるので、すくなくとも、関数・メソッドにすれば良いかと。
下記※に書いた不明点があるので、想像ですが、その前の「10日以前以降」の分岐も、このように大きく2つに分岐するのではなく、「10日以前以降」と「当月、前月当月」のif文をまとめて1つのif文に出来そうな気もします。
そうできると、「同じ処理か2箇所にある」という状態ではなくなるので、必ずしも関数・メソッドにする必要は無いです。
※:「10日以前・以降」というのが、入力した締め日のことなのか、処理する実際の日付のことなのか不明。「締め日が当月か?」等の分岐が真偽どっちがどっちなのか不明。
No.2
- 回答日時:
条件を整理しなさい。
そのうえで最適解を求めるんだ。
アルゴリズムってそういうもんだぞ。
そして、それができないなら垂れ流しのコードを書けばイイ。
それが最低であっても結果は出る。
場合によってはそういうコードのほうが効率よく演算できるなんてことは、
プログラミングをしていると頻繁に遭遇することになる。
で、「なんでこれで演算速度が速いんだ?」と一瞬悩む。そして次の瞬間に悩んだことを忘れる。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
時間短縮のために、テキストファイルの入出力をメモリを使って出来ないですか?
Visual Basic(VBA)
-
VBAなくなるの?
Visual Basic(VBA)
-
Excel-VBAのmsgBox()の不思議
Visual Basic(VBA)
-
-
4
プログラミング
Visual Basic(VBA)
-
5
VBAコードのインデント表示
Visual Basic(VBA)
-
6
プログラマーは誘惑にさらされる人生?
その他(プログラミング・Web制作)
-
7
10進数からN進数に変換するプログラミング(C言語)
C言語・C++・C#
-
8
サブフォルダに格納されているファイルを、ファイル名ごとに条件分岐させたい
Visual Basic(VBA)
-
9
VBAの間違い教えて下さい
Visual Basic(VBA)
-
10
Vba ファイル書き込み時に書き込みエラーを回避する方法を教えてください
Visual Basic(VBA)
-
11
プログラミング言語についてc++に空白あると同じ文字を再度繰り返して処理しないといけないので2倍動作
C言語・C++・C#
-
12
VBA コードどこがおかしいですか?
Visual Basic(VBA)
-
13
・オブジェクト指向のメリットってなんですか? ・カプセル化だ!とよく叫ぶ人がいますけど、カプセル化が
その他(プログラミング・Web制作)
-
14
Vba 実数および実数タイプの変数について教えてください
Visual Basic(VBA)
-
15
CPUが16bitでも32bitOSでコンパイルしたコード(例えばintが4バイトと定義されている)
C言語・C++・C#
-
16
文系のSE志望です。プログラミングを今から習得したいのですが、初めて学ぶのにオススメの言語があれば教
その他(プログラミング・Web制作)
-
17
このプログラミング言語のfor分の文法構造を教えてください
その他(プログラミング・Web制作)
-
18
pdfファイルの複数添付 引数の型
Visual Basic(VBA)
-
19
Excel VBA 定義されたプロージャ名、関数名の取得
Visual Basic(VBA)
-
20
VBAに詳しい方教えてください。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
JANコードとPOSコードは同じ?
-
JavaScriptの定数名が取り消し...
-
ペンダントライトのコードの色...
-
コンボボックス3つを連動させたい
-
特定行の背景色を変えたいのですが
-
pythonにてseleniumを使うも、...
-
wechatアプリについての質問で...
-
1日に1人がこなせるプログラム...
-
変数名「cur」について
-
access でエラーを回避するには?
-
PreviewKeyDownイベントが2回...
-
Excel VBAについて
-
C# コードビハインドについて
-
VBA リストボックス(複数条件...
-
レポートでグループレベルの変...
-
Nullの使い方が不正です。
-
Accessでの抽出で完全一致。
-
IF文、条件分岐の整理方法
-
VBA For文でチェックボックスの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
JANコードとPOSコードは同じ?
-
access2003 クエリSQL文に...
-
1日に1人がこなせるプログラム...
-
オートフィルタで抽出結果に 罫...
-
変数名「cur」について
-
JavaScriptの定数名が取り消し...
-
ACCESSユニオンクエリでORDER B...
-
Exel VBA 別ブックから該当デ...
-
UWSCでMOUSEORG関数が上手く処...
-
COBOLの文法
-
PreviewKeyDownイベントが2回...
-
1、Rstudioで回帰直線を求める...
-
VBAでファイルオープン後にコー...
-
【VB6】実行ファイルとした後、...
-
Nullの使い方が不正です。
-
特定行の背景色を変えたいのですが
-
◾️Excel VBA 統合について Cons...
-
アルファベットに付いて質問し...
-
Excel VBAでOpenTextのFieldInf...
おすすめ情報