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も見ています
-
家の中でのこだわりスペースはどこですか?
自分の家で快適に過ごすために工夫しているスペースはありますか? 例)ベランダでお茶を飲むためのカフェテーブル ゲーミングに特化したこだわりのPCスペース
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
メモのコツを教えてください!
メモを取るのが苦手です。 急いでメモすると内容がごちゃごちゃになってしまったり、ひどいときには全く読めない時もあります。
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
時間短縮のために、テキストファイルの入出力をメモリを使って出来ないですか?
Visual Basic(VBA)
-
VBAなくなるの?
Visual Basic(VBA)
-
VBAコードのインデント表示
Visual Basic(VBA)
-
-
4
Excel-VBAのmsgBox()の不思議
Visual Basic(VBA)
-
5
プログラミング
Visual Basic(VBA)
-
6
プログラマーは誘惑にさらされる人生?
その他(プログラミング・Web制作)
-
7
VBA コードどこがおかしいですか?
Visual Basic(VBA)
-
8
10進数からN進数に変換するプログラミング(C言語)
C言語・C++・C#
-
9
サブフォルダに格納されているファイルを、ファイル名ごとに条件分岐させたい
Visual Basic(VBA)
-
10
VBAの間違い教えて下さい
Visual Basic(VBA)
-
11
文系のSE志望です。プログラミングを今から習得したいのですが、初めて学ぶのにオススメの言語があれば教
その他(プログラミング・Web制作)
-
12
Vba ファイル書き込み時に書き込みエラーを回避する方法を教えてください
Visual Basic(VBA)
-
13
プログラミング言語についてc++に空白あると同じ文字を再度繰り返して処理しないといけないので2倍動作
C言語・C++・C#
-
14
・オブジェクト指向のメリットってなんですか? ・カプセル化だ!とよく叫ぶ人がいますけど、カプセル化が
その他(プログラミング・Web制作)
-
15
プログラミング言語について
その他(プログラミング・Web制作)
-
16
【ExcelVBA】5万行以上のデータ比較の効率的な処理方法について
Visual Basic(VBA)
-
17
Vba 実数および実数タイプの変数について教えてください
Visual Basic(VBA)
-
18
VBAに詳しい方教えてください。
Visual Basic(VBA)
-
19
Excel VBA 定義されたプロージャ名、関数名の取得
Visual Basic(VBA)
-
20
VBA 複数条件の分岐処理の上手な方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
JANコードとPOSコードは同じ?
-
1日に1人がこなせるプログラム...
-
ペンダントライトのコードの色...
-
ACCESSユニオンクエリでORDER B...
-
access2003 クエリSQL文に...
-
PreviewKeyDownイベントが2回...
-
Exel VBA 別ブックから該当デ...
-
Nullの使い方が不正です。
-
COBOLの文法
-
SQL
-
HTML電卓で1文字消す方法
-
sinカーブの表示のさせ方
-
Accessの文字列部分一致を合計...
-
ホワイトノイズの生成コードに...
-
VB2005 TextBoxの入力制...
-
Excel VBA 空白をセルを探して...
-
access2021 VBA メソッドまたは...
-
IF文、条件分岐の整理方法
-
VBでシーケンサと通信。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
JANコードとPOSコードは同じ?
-
1日に1人がこなせるプログラム...
-
Nullの使い方が不正です。
-
access2003 クエリSQL文に...
-
JavaScriptの定数名が取り消し...
-
COBOLの文法
-
ACCESSユニオンクエリでORDER B...
-
VBAでファイルオープン後にコー...
-
ペンダントライトのコードの色...
-
Exel VBA 別ブックから該当デ...
-
変数名「cur」について
-
特定行の背景色を変えたいのですが
-
PreviewKeyDownイベントが2回...
-
access2021 VBA メソッドまたは...
-
Accessでの抽出で完全一致。
-
VBA リストボックス(複数条件...
-
オートフィルタで抽出結果に 罫...
-
access でエラーを回避するには?
-
1、Rstudioで回帰直線を求める...
おすすめ情報