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

このQ&Aのポイント
  • EXCELVBAでのFunctionプロシージャの戻り値についての質問です。処理が正常にされたとき(エラーがなかったとき)は、戻り値には0が入らないのでは?
  • EXCELVBAでのFunctionプロシージャの戻り値について、本による解説は「プロシージャの戻り値を設定します。Errオブジェクトの「Number」プロパティにはエラーの番号が設定されているので、そのまま戻り値とします。処理が正常に行われたときには、Errオブジェクトの「Number」プロパティは「0(ゼロ)」になるので、戻り値も「0(ゼロ)」になります。」とあります。
  • EXCELVBAの本を見てわからないことがあるので、教えて欲しいです。EXCELVBAでのFunctionプロシージャの戻り値について、処理が正常にされたとき(エラーがなかったとき)は、戻り値には0が入らないのですか?
回答を見る
  • ベストアンサー

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が入らないのでは?と思ってしまうのですが。。 どうなんですかね?わかる方は教えてください。よろしくお願いします。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

Cn.Open が成功した時点で、Err.Numberは0になっていると思います。 Err_proc: は単なるラベルなので、エラーが起きても起きなくても実行されます。 IF~End Ifの部分は、0で無い時だけ実行されるので、問題ないです。

kamkamkam3
質問者

お礼

あ、どうも。早速ご返事いただいてありがとうございます。 大変わかりやすく、疑問点が全部とけました。Err_Proc:は、エラーが起きても起きなくても実行されるんですか。。それは、全然知りませんでした。大変勉強になりました。これを知らないでプログラムを組んでいたら、この先、えらいことになっていました(;^^ 本当にどうもありがとうございました。ずっと一人で悩んでいました。ようやく、疑問がとけて、すごくほっとしました。ありがとうございました。

kamkamkam3
質問者

補足

長々と長文を読んでいただいて、ありがとうございました。

関連するQ&A

  • Function プロシージャの戻り値にバグ?

    いつも拝見させていただいてます。 今回Excel VBAでタイムスケジュールを作成したところ、まったくわけのわからないエラーが発生してしまい途方に暮れており、皆様のお力をお借りしたく投稿させていただきます。 エラーの内容は簡単に言うと Function プロシージャの戻り値がなくなってしまう(0になっている)ことです。 ESC = ESColumn(EventStart) ---------------------------------- Function ESColumn(TimecoluConv As Date) As Integer Select Case TimecoluConv Case "8:00:00" ESColumn = 2 Case "8:10:00" ESColumn = 3 Case "8:20:00" ESColumn = 4 ・・・ End Select End Function と、このようなコードで入力された時間を数値に変換しているのですが、 繰り返し処理をしているといきなり戻り値が0になってしまいます。 今回は8:00を6回取得した後、8:10を変換しようとしたら戻り値が0になっていました。 戻り値を使用して、セルを選択するため、そのタイミングでエラーになります。 なぜ繰り返し処理の途中で発生するのでしょうか。 解説と対策をご教示していただけると大変助かります。 よろしくお願いします。

  • プロシージャの戻り値を取得する方法

    perlからSQLPLUS->プロシージャを実行してその戻り値を取得。 戻り値が0なら次の処理へ、0以外ならエラー処理へというようなことをやりたいと思っています。 perlの実行コマンドは以下。 $sqlcmd = "sqlplus$DBUSER$PASS\@DB_ALIAS\@$SQLFILE $OUTFILE"; $sql_ret = system("$sqlcmd") >>8; この$sql_retにプロシージャの戻り値が入るようにしたいのです。 プロシージャを実行する$SQLFILEは以下のようなSQLです。 --------------------------------------------------- set serveroutput on WHENEVER SQLERROR EXIT 1 spool &1; DECLARE RetVal NUMBER; BEGIN RetVal := 実行ストアドファンクション; END; / spool off; EXIT SQL.SQLCODE; ---------------------------------------------- エラーが起きたときにファンクションは1を返すようにしているのですが、 それがSQLPLUSの実行結果の戻り値に反映されません。 どうしたらいいのでしょうか? よろしくお願いします。

  • Functionでの戻り値のとり方

    こんばんわ。 以下のように、Functionで引数に配列を指定して、戻り値も配列で取得したいのですが、方法としては以下のようにしかできないのでしょうか? ------------------------- '配列を宣言 dim Ary() as string dim AryRet() as string '戻り値の配列 Call Get_Ary(Ary(),AryRet()) ------------------------- Function Get_Ary(Ary() as string , AryRet() as string) 'Ary()を参照して、AryRet()を取得する End Function という風に書いているのですが、Functionのところを以下のように 書くのは無理でしょうか? うまく取れないというのはやっぱ無理なのかな・・ ------------------------- '配列を宣言 dim Ary() as string dim AryRet() as string '戻り値の配列 AryRet() = Get_Ary(Ary()) Function Get_Ary(Ary() as string) As string 'Ary()を参照して、AryRet()を取得する 'それを関数の戻り値とする Get_Ary = AryRet(index) End Function このように書くと、配列の最後のインデックスの値だけ取れてしまう ようなんですが、、やっぱ配列で返すというのは上記のやり方でないと 無理なのでしょうか? 詳しい方ご教示願います。

  • Functionで戻り値を複数返す方法

    Functionで戻り値を複数取得したいのですが うまくいきません。(NULLの使い方が不正ですとエラー) 戻り値に配列を使う場合 呼び出し側はどのように記述すればいいでしょうか? <呼び出し側> Private Sub a() wkkekka1 = 処理結果(Kensu, Houhou)(0) ⇒ ここでエラー wkkekka2 = 処理結果(Kensu, Houhou)(1) wkkekka3 = 処理結果(Kensu, Houhou)(2) End Sub <関数> Public Function 処理結果(ByRef lngKensu As Long, ByRef strHouhou As String) Dim kekka(3) As Double If lngKensu = 1000 and strHouhou = aaaaaa then kekka(0) =  0.1 kekka(1) =  2   kekka(2) =  300 Else ↓ (省略)     ↓ End If 処理結果 = kekka End Function

  • oracleのfunctionで戻り値複数個

    oracleのストアドプロシージャのファンクションについてですが、 ファンクションは、戻り値を返すことができますが、 それを、複数個返すことはできるのでしょうか。 CREATE [OR REPLACE] FUNCTION ファンクション名(引数 IN データ型[, ...]) RETURN 戻り値の型 IS 宣言部 BEGIN 処理部 END ; お願いします。

  • 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プロシージャの便利さを教えてください。

  • SubではなくFunctionで作られる理由

    access2007を使っています。 素朴な疑問なのですがマクロを変換した時はなぜ Subプロシージャーではなく、Functionなのでしょうか? 「クエリを開く」と言うマクロを、VBAに変換したところ ******************************************************* Function マクロ1() On Error GoTo マクロ1_Err DoCmd.OpenQuery "クエリ1", acViewNormal, acEdit マクロ1_Exit: Exit Function マクロ1_Err: MsgBox Error$ Resume マクロ1_Exit End Function ******************************************************* となりました。 戻り値や返り値はないものは、FunctionプロシージャーではなくSubプロシージャーで作るものと思っていたのですが なぜ上記のコードはFunctionなのでしょうか? Functionで作る理由を教えてください。 特に意味はないのでしょうか? ちなみにFunctionをSubに書き換えて実行したら問題なくクエリが開きました。

  • Functionとsub どちらを使った方がいいで

    Functionとsub どちらを使った方がいいですか? VBA初心者です。 ------------------------ Sub test1() MsgBox "testです" End Sub Function test2() MsgBox "testです" End Function ------------------------ どちらのコードも結果は同じです。 基本的に、マクロを組む時は、Functionとsubとどちらを使った方が良いのでしょうか? ------------------------ Sub tset3() MsgBox test4 End Sub Function test4() test4 = "testです" End Function ------------------------ のように戻り値・返り値がある場合のみFunctionを使うべきなのでしょうか? ご回答よろしくお願いします。

  • 別ブックのFunctionを呼び出し戻り値を取得

    こちらの識者の方々にはいつもお世話になっています。 関数の質問です。 タイトルが分かりづらくて申し訳ありませんが、詳細は下記ご参照ください。 環境は下記になります。 OS=windows7 pro 64bit Office=Excel2010(14.0.7128.5000) ・やりたいこと 別のBookのFunctionを呼び出し、戻り値を取得したい。 同一Book内であれば Module1: Sub aaa()  MsgBox bbb End Sub Module2: Function bbb() As String  If Date Mod 2 = 0 Then   bbb = "余り0"  Else   bbb = "余り1"  End If End Function というような書き方で、"余り0"か"余り1"のメッセージボックスが表示されますが、 Function bbbを別のブックに書き、同じく"余り0"か"余り1"のメッセージボックスが表示させるには、どのようなコードが適していますでしょうか? 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

  • ExcelVBAで他のファイル(project)のプロシージャから配列の戻り値を取得したい

    自作アドインに、byref型で配列を引数にしたプロシージャを作り、別のファイルのプロシージャからそのアドインを呼び出して、アドインのプロシージャで配列に処理をして、その結果を呼び出し元のファイルのプロシージャで使用したいのですが、処理できないようです。 例えば、 アドイン側 myAddin.xla sub test(byref strAry() as string) strAry(0)="a":strary(1)="b" end sub 呼び出し元 sub execute() dim myAry() as string redim myAry(1) application.run macro:="myAddin.xla!test",arg1:=myAry() msgbox myAry(0) & "-" & myAry(1) end sub 上記のコーディングをしても、表示されるメッセージは "-" のみです。 アドインの処理はまったく反映されていません。 変数であればアドイン側をFunctionにして戻り値を取得できたのですが、配列ですとうまくいきません。 別のプロジェクトから、配列を返す方法はありませんか?

専門家に質問してみよう