• ベストアンサー

プロシージャ内のコーディングについて

VB6のプロシージャ内のコーディングについてですが、一般的にどちらのコーディンク方法を使用されていますか。 それとも全く違う方法を使用されてますでしょうか。 御意見をお願いいたします。 方法1 Function A() as Integer if 例外判定 then 例外処理 Exit Function End If 通常処理 End Function 説明 例外が発生したら例外処理をしてすぐにプロシージャを抜ける。 例外処理が多くなると途中でプロシージャを抜ける部分が多くなってしまう。 方法2 Function A() as Integer if 例外判定 then 例外処理 Else 通常処理 End If End Function 説明 例外が発生しても最後までプロシージャを抜けない。 必ず同じ場所でプロシージャを終了する。

  • pansy
  • お礼率40% (60/150)

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

私は方法1ですね。 正常系の流れが読みやすい。 例外の処理の範囲が明確。 インテンドが浅い。 方法2は インテンド深かい。 正常系の流れが読みにくい。 例外の場合も最後まで読まなければならないので読みにくい。(Goto文で飛ばした方がまし)

pansy
質問者

お礼

ありがとうございます。 たしかにおっしゃるとおりです。 後の作業性を考えるとどちらがよいかよくわかりました。

その他の回答 (2)

  • ctrlzr
  • ベストアンサー率29% (18/62)
回答No.2

1か2かといえば2です。 私はgotoを普通に使います。gotoを使うのはよくない!とか初めてのVBのような本に書いてあるかもしれませんが、使い方次第だと思います。 Function A() as Integer if 例外判定 then goto ErrExit end if if 例外判定2 then goto ErrExit end if Exit function ErrExit: 例外処理 End Function

pansy
質問者

お礼

ありがとうございました。 例外処理をまとめて記述するという方法もあるんですね。

  • umejas
  • ベストアンサー率28% (9/32)
回答No.1

個人的には、なるべく方法2を使うようにしています。 また、例外処理、通常処理は別のプロシージャにします(数行程度で済むものならそうしない時もありますが)。 一つのプロシージャ内に、複数抜けるところがあるというのが、あまり好きではないので(見栄えの問題かも知れませんけど)。

pansy
質問者

お礼

ありがとうございました。 最近、この方が美しいのかな…。 なんて思いつつありました。

関連するQ&A

  • セルから呼び出したプロシージャ内でセルの塗りつぶし

    初めて質問させていただきます 宜しくお願い致します セルから呼び出したプロシージャ内からセルの塗りつぶしを 実行しても塗りつぶしが有効になりません たとえば A1のセルに10を入力 B1のセルに=TEST(A1) と入力 マクロのモジュール内に Public Function TEST(tmp_No As Integer) As Integer TEST = tmp_No * 25 '(1)ここから If TEST = 250 Then    'Msgbox "チェック用MSG"    Cells(1, 1).Interior.ColorIndex = 38 End If '(2)ここまで End Function というファンクションプロシージャがあるとします 引数で10を持って行ってるので10×25で TESTが250になりB1には計算結果として 250と問題なく表示されています しかし (1)~(2)のセルの塗りつぶしは実行されません 仮にチェック用のメッセージボックスのコメント を外すとキチンとメッセージボックスは 表示されます また、塗りつぶしダケのマクロを作成し Public Sub cell_paint()    Cells(1, 1).Interior.ColorIndex = 38 End Sub 実行すると、これも問題なく動作しますので EXCELの設定ではないと判断しています セルから呼び出したプロシージャの時 だけ、動作しないようなのですが なぜでしょうか? 他の方法で回避可能でしょうか? ※実際には塗りつぶしの判定方法が  20個あり、条件付書式では対応出来ないので  マクロで処理を試みてます 宜しくお願い致します

  • Functionプロシージャの便利さがわかりません

    私はVBAコードを作る時は、もっぱらsubプロシージャーを使ってしまうのですが、 http://excelvba.pc-users.net/fol5/5_4.html を参考に、 Functionプロシージャとsubプロシージャの違いを確認してみたのですが、 Functionプロシージャの便利さがわかりません。 *********************************** Sub Test() SubプロシージャとFunctionプロシージャのテスト i = 1 Call Subプロシージャ(i) i = Functionプロシージャ(i) MsgBox "Functionプロシージャ結果:" + CStr(i) End Sub Sub Subプロシージャ(ByVal i As Integer) MsgBox "Subプロシージャ結果:" + CStr(i) End Sub Function Functionプロシージャ(ByVal i As Integer) As Integer i = i + 1 Functionプロシージャ = i End Function *********************************** Functionプロシージャは、 (ByVal i As Integer) As Integer のように、、二回もデータ型(Integer)の指定をしなくてはいけないのでしょうか? リンク先の説明には、 「SubプロシージャとFunctionプロシージャの違いは Subプロシージャが引数を受け取るのみに対して Functionプロシージャは引数を受け取り、 戻り値を返すという関数としての役割を果たすことができる点です。」 と記載されてますが、 それはSubプロシージャでも出来てますよね? サンプルコードにおいてのFunctionプロシージャの便利さを教えてください。

  • PL/SQL-プロシージャ

    プロシージャBはテスト実行のため、プロシージャAを真似て作成しています。 --最後のIF文で、プロシージャAかBのどちらかに走らせたいと思っています。 DECLARE --プロシージャA--------------------------------------- PROCEDURE A IS fno1 utl_file.file_type; dnm1 varchar(200) :='XXX'; fnm1 varchar2(200) :='BBB.txt'; CURSOR cu1 is select XYZ as ABC from CCC; BEGIN fno1 := utl_file.fopen(dnm1,fnm1,'w'); FOR CU1_REC1 in CU1 loop utl_file_put_line(fno1,' '|| CU1_REC1.XYZ END LOOP; utl_file.fclose(fno1); end; --プロシージャB------------------------------------- プロシージャAと似たような処理 --プロシージャAかBかを判定するIF文------------------------------ BEGIN IF CCC.ABC = '0'; THEN A; ELSE B; ENDIF; END; /

  • 引数付のFuncitonプロシージャと引数付のSUBプロシージャの違い

    親プロシージャに数値を渡すときに、引数付のFuncitonプロシージャと引数付のSUBプロシージャは、結果を見ると同じ動きをするように思います。 このような場合、両者には、どのような違いがあるのでしょうか? Sub 親プロシージャ() Cells(1,MyNOend)=123 end Sub ・子プロシージャ Function FMyRowCnt(MyNOend As Integer) MyNOend = TMYKanriBkWs1.Range("D1").CurrentRegion.Rows.Count End Function Sub FMyRowCnt(MyNOend As Integer) MyNOend = TMYKanriBkWs1.Range("D1").CurrentRegion.Rows.Count End Sub 以上 よろしくお願い致します。

  • ACCESS 引数をとるプロシージャの記述方法

    計算した結果を返すFancionプロシージャを作成したいのですが、幾つかの参考書を見ても戻り値が一つの説明しかありません。戻り値が二つほしいのですが無理なんでしょうか? 文字データAと数値データBを引数で取得し、それぞれの処理結果(A-DT及びB-DT)を返したいのですが、Calc_1には一つの処理結果しか指定できないと思いますが、戻り値を二つ返す記述方法を教えて頂けないでしょうか。よろしくお願いいたします。 Public Function Calc_1(A AS String,B AS Integer) AS String   ※Aを元に文字編集を行い編集結果をA-DTへ登録   ※Bを元に計算処理を行い処理結果をB-DTへ登録 End Function

  • ストアドプロシージャの引数にフィールド名を指定したい

    以下のようにストアドプロシージャを作成し、 ------------------------------------------------------------ CREATE FUNCTION test(integer) RETURNS integer AS'  DECLARE   aaa ALIAS FOR $1;  BEGIN   IF aaa BETWEEN 1 AND 5 THEN    RETURN 5;   ELSIF aaa BETWEEN 6 AND 10 THEN    RETURN 10;   ELSIF aaa BETWEEN 11 AND 15 THEN    RETURN 15;   END IF;  END;' LANGUAGE 'plpgsql'; ------------------------------------------------------------ 以下のようなSQL構文でこのプロシージャを使用したいと思っています。 ------------------------------------------------------------ select test(フィールド名) from テーブル名; ※「フィールド名」のフィールドにはinteger型のデータが入っています。 ------------------------------------------------------------ が、このSQLを実行すると以下のようなエラーが出ます。(CSE使用) ------------------------------------------------------------ WARNING: Error occurred while executing PL/pgSQL function test WARNING: at END of toplevel PL block WARNING: Error occurred while executing PL/pgSQL function test WARNING: at END of toplevel PL block SQL実行中に以下のエラーが発生しました。 WARNING: at END of toplevel PL block ------------------------------------------------------------ このように、ストアドプロシージャの引数にフィールド名を指定することはできないのでしょうか。 どなたかご教示ください。

  • エクセルVBAのFunctionプロシージャの質問

    エクセルのFunctionプロシージャを使って以下のユーザー定義関数を作りたいのですが上手くいきません。 アドバイスお願いしますm(__)m やりたいこと エクセルのA列とB列に複数の(たとえば10行の)数字が並んでいます。 各行ごとに 0.5×[A列の値]×[B列の値の二乗] を算出し、その合計を求めたいです。 別の列(例えばC列)を使って上記の計算式を入力し、その合計を求めればよいのですが どうしてもFunctionプロシージャを使って1セルだけを使って求めたいのです。 自分はVBA(エクセルマクロ)はあまり詳しくないのですが 色々ネットで調べた結果、以下のようなプロシージャを書いてみたのですが 上手く計算できません。 Function KE(element As Range) Dim e As Range Dim m() As Variant Dim v() As Variant Dim ans As Integer i = 0 j = 0 For Each e In element If i = j Then m(i) = e.Value i = i + 1 Else m(j) = e.Value j = j + 1 End If Next e k = i i = 0 j = 0 While i < k + 1 ans = ans + 0.5 * m(i) * v(i) * v(i) i = i + 1 Wend KE = ans End Function もちろん、この形に拘りません Functionプロシージャを使ってうまく計算できる方法ありましたらご教示お願いします。

  • VBAでのシート選択について

    いつもお世話になります。 VBA初心者で、基本的な質問をしているかもしれませんが、 どうかお付き合いください;; たとえば、以下のようなコードがあったとします。 例) Function Sample() dim x As Integer dim y As Integer x=10 y=100 If x > sheets("シート2").Range("A1") AND y < sheets("シート2").Range("A1") Then 処理 End If End Function 例えば上記のコードのようなものがあったとして、 シート名を省いて文字数を減らす方法はあるでしょうか? 1つのFunction内では「このシート」しか参照しないというような指定が出来ると、 If x > Range("A1") AND y < Range("A1") Then というように簡単にできますよね? 他のFunctionでは、シートの指定はさせたくないので、 End Functionの手前で、「シート指定終了」というのを 記述できればベストなのですが…。 どうかよろしくお願いいたします。

  • EXCELVBAでのFunctionプロシージャの戻り値について

    こんにちは。EXCELVBAの本を見てわからないことがあったので、教えてください。 まず、ソースコードは↓です Function P_OpenDatabase() As Integer On Error GoTo Err_Proc   Cn.ConnectionString=P_CnString()   Cn.Open Err_Proc:   If (Err.Number <> 0) Then     Call MsgBox(Err.Description)     Call MsgBox("データベースに接続できません")   End If   P_OpenDatabase = Err.Number…★ End Function で、わからないところは★の部分です 本の解説は↓です。 「プロシージャの戻り値を設定します。Errオブジェクトの「Number」プロパティにはエラーの番号が設定されているので、そのまま戻り値とします。処理が正常に行われたときには、Errオブジェクトの「Number」プロパティは「0(ゼロ)」になるので、戻り値も「0(ゼロ)」になります。」 僕が疑問に思っているのは処理が正常にされたとき(エラーがなかったとき)は、Err_Procの中の処理はされないので、戻り値には0が入らないのでは?と思ってしまうのですが。。 どうなんですかね?わかる方は教えてください。よろしくお願いします。

  • PL/SQLの例外

    PL/SQLの例外処理で、 プロシージャからファンクションをコールしてデータを取得しています。 ファンクションでデータを取得できたのか、NO_DATA_FOUNDだったのか、WHEN OTHERS THENブロックに入ったのか、呼び出し元に通知したいのです。 ・データが取得できた場合、RETURN TRUE ・NO_DATA_FOUND、またはWHEN OTHERS THENブロックに入ってきた場合にRETURN FALSE とすると、呼び出し元のプロシージャで区別が付かないのです。 ファンクションでWHEN OTHERS THENブロックに入った場合、プロシージャのWHEN OTHERS THENブロックに飛ばしたいと思います。 この場合の方法ですが、ファンクションのWHEN OTHERS THENでRAISE 独自例外Aとし、プロシージャのEXCEPTIONでWHEN 独自例外A THENとすると、 プロシージャのファンクション呼び出し以降の処理は行なわれず、処理は終了しますか? この方法ができるかどうかと、他に方法があれば教えてください。

専門家に質問してみよう