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

このQ&Aのポイント
  • VBAマクロを作成する際、Functionで作成される理由について説明します。Functionは戻り値(返り値)を返すためのプロシージャであり、呼び出し元に結果を返すことができます。一方、Subは戻り値を返さないプロシージャであり、単に処理を実行するために使用されます。
  • 上記のコードでは、DoCmd.OpenQuery関数を使ってクエリを開いています。この関数はクエリを実行し、その結果を返すため、Functionとして定義することが適切です。戻り値を受け取る必要がない場合でも、Functionを使うことでより柔軟な処理が可能となります。
  • また、Functionは他のプロシージャから呼び出すことができるため、再利用性を高めることができます。特定の処理を複数の場所で使用する場合には、Functionを使うことで効率的にコードを書くことができます。ただし、戻り値を受け取らない場合にはSubを使用することもできます。
回答を見る
  • ベストアンサー

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に書き換えて実行したら問題なくクエリが開きました。

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

推測の域を出ませんが、 マクロから直接呼び出せるプロシージャはFunctionだけです。 Subの場合はFunctionモジュールで包んであげる必要があります。 この辺りの都合上でFunctionになってしまっているのかな?と。

bvewasdf8
質問者

お礼

>マクロから直接呼び出せるプロシージャはFunctionだけ そうなのですか、知りませんでした。 ありがとうございました。大変参考になりました。

関連するQ&A

  • 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を使うべきなのでしょうか? ご回答よろしくお願いします。

  • SubとFunctionの使い分け方。(Access VBA)

    Sub:実行するとそのまま処理が終わり、特に次の作業に影響しない。 Function:関数と同じように使い、そこでの戻り値をどこかに代入して利用する。 あるテキストにこの様に書いてありました。 この考え方だと、マクロをVBAに変換すると「モジュールオブジェクト」に出来るFunctionプロシージャは、Subの方が理解にしっくりくるのですど・・・ 例えば、「テーブルを開く」(マクロ)だと、ただテーブルを開いて処理を終了するだけなので、SubでVBAが出来るの方が納得するのですけど。 正直、今の認識では、本を読んでいても何となく分かったような気がするだけで、SubとFunctionの使い分けがイマイチ分かりません。 どなたか、SubとFunctionの使い分けの目安をお教えいただけないでしょうか?。 (Access VBA初心者)

  • ACCESS 開いている表を閉じるには右上のX(バッテン)をクイックしますが、これをVBで操作するには?

    先日、クエリをVBで実行するには こんな風に↓やる、と聞いたのですが DoCmd.OpenQuery "myクエリ1", acViewNormal, acEdit http://oshiete1.goo.ne.jp/qa2661049.html 例えば、myクエリ1、が画面に表示するクエリだったりすると 今度、画面に表示された、表を閉じるには VBで操作するには、どうするのですか よろしくお願いします

  • Access97でのエクスポートエラーメッセージ

    OS WINXP Excel2002 Access97で、下記の操作をやると、 Microsoft Visual Basic 実行時エラー ’1004’:’講習会資料.xls’にアクセスできません。 というメッセージがでます。 再起動してやるとエラーにはならないのですが、もう1回やるとまた エラーメッセージがでます。 EXCELのファイルが何かおかしいのでしょうか? 教えてください。 Private Sub 講習会収支明細_Click() DoCmd.SetWarnings False DoCmd.Maximize If gOnErrorCtl Then On Error GoTo Err_講習会収支明細_Click Dim sh DoCmd.OpenQuery "Q_総会資料用", acViewNormal, acReadOnly DoCmd.OpenQuery "Q_借方仕訳伝票一覧印刷用", acViewNormal, acReadOnly DoCmd.OpenQuery "Q_貸方仕訳伝票一覧印刷用", acViewNormal, acReadOnly DoCmd.OpenQuery "Q_講習会資料残高用", acViewNormal DoCmd.TransferSpreadsheet acExport, 5, "T01_講習会資料残高用", "c:\講習会会計\講習会資料.XLS", True sh = Shell("C:\Program Files\Microsoft Office\Office10\EXCEl c:\講習会会計\講習会資料残高用.XLS", 1) DoCmd.SetWarnings False DoCmd.OpenQuery "Q_講習会収入残高用", acViewNormal DoCmd.TransferSpreadsheet acExport, 5, "T02_講習会資料残高用", "c:\講習会会計\講習会資料.XLS", True Exit_講習会収支明細_Click: Exit Sub Err_講習会収支明細_Click: MsgBox Err.Description Resume Exit_講習会収支明細_Click End Sub

  • ACCESS:97→2002のモジュールの変換エラーについて

    ACCESS97で作成したファイルをACCESS2002に変換したいのですが、 変換中にコンパイルエラー発生しましたとメッセージが表示されてしまいました。 ファイル自体は変換できておりエラーテーブルを見るとモジュールが変換エラーを起こしていました。そのモジュールを実行させるとやはりエラーが出て止まってしまいます。 ~モジュールの内容は~ テーブルを削除するために削除クエリーの実行(これはうまく動いてます。) フォームに入力されたパスのCSVファイルをインポートする。定義名:CSVインポート定義"インポート先:"CSVテーブル" (これがうまく動かないようです。実行させると「このファイルをインポートできません」とメッセージがでます。) 以下のものになります。 Option Compare Database Option Explicit '------------------------------------------------------------ ' CSVインポート ' '------------------------------------------------------------ Function CSVインポート() On Error GoTo CSVインポート_Err Dim parm1 As String parm1 = Forms!報告書作成!インポートパス & " " ' 入力データ削除query DoCmd.OpenQuery "全て削除クエリー", acNormal, acEdit ' インポート実施 DoCmd.TransferText acImportDelim, "CSVインポート定義", "CSVテーブル", parm1, False, "" CSVインポート_Exit: Exit Function CSVインポート_Err: MsgBox Error$ Resume CSVインポート_Exit End Function もし不足な点がありましたら補足させていただきます。 よろしくお願いします。

  • エラー処理について。

    Accessマクロで、VBAに変換する際、「エラー処理コードを追加する。」に チェックを入れると出来る「エラー処理コード」についての質問です。 (1)このエラー処理コードは、プログラムの「異常終了」を防ぐと書いてありましたが、そもそもこの異常終了とはどのようなことを言ってるのでしょうか? (例えば、Accessが何の断りもなく、強制終了するなどといったことでしょうか。) 実際にマクロ(テーブルを開く)で作成されたエラーコードの部分だけを動かしてみて、どんなことになるのか試したいのですが、どうすれば試せるのですか? Function マクロ3() On Error GoTo マクロ3_Err DoCmd.OpenTable "テーブル1", acNormal, acEdit マクロ3_Exit: Exit Function マクロ3_Err: MsgBox Error$ Resume マクロ3_Exit End Function (2)そもそもエラー処理は、Access VBA開発ではかなり重要な要素なのでしょうか? 例えば、テキストボックスに何も入力されてなかったら、「入力してください。」とメッセージボックスを表示させるマクロを作るようなことは、 エラー処理とはまた違うのものなのですか?

  • Access VBAでのフィルタ処理

    アクセス2003を使用しています。 今VBAを使用して、フォームのテキストボックスに記入された文字列を検索条件に、 クエリからデータ抽出したいのですが、 うまくいきません。 解決したい事は、 「abc*」といったように、前方が一致している文字列データを すべて抽出するといった処理です。 今は下記のようなプログラムを組んでいます。 Private Sub コマンド1_Click() On Error GoTo Err_コマンド1_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "クエリ1" DoCmd.OpenQuery stDocName, acNormal, acEdit If IsNull(テキストボックス) Then Else stLinkCriteria = "[クエリデータ]=" & "'" & Me![テキストボックス] & "'" End If DoCmd.ApplyFilter stDocName, stLinkCriteria Exit_コマンド1_Click: Exit Sub Err_コマンド1_Click: MsgBox Err.Description Resume Exit_コマンド1_Click End Sub これだと完全に一致しなければ抽出してくれません。 どの様に変更すればよいでしょうか? よろしくお願いします。

  • Functionプロシージャーで作成する理由は

    いくつかVBAのサンプルを見てるのですが http://www.accessclub.jp/supbeg/063.html のように、戻り値を必要としない(msgboxにしちゃってる)のに、 Functionプロシージャーで作成するのはなぜでしょうか? subプロシージャーで作らない意味はありますか?

  • 【アクセスVBA】テーブルにフィルタをかけたい

    Sub マクロ() DoCmd.OpenTable "Tテーブル", acViewNormal, acEdit DoCmd.ApplyFilter , "番号 = '123'" End Sub Tテーブルを開き、フィルタをかけたいのですが テーブルを開くまではできるのですが、 フィルタをかける行では 『ApplyFilter アクションの実行はキャンセルされました。』 になってしまいます。 DoCmd.OnFilter , "質問番号 = '0'" でもエラーになり、コードの実行すら行えません。 フォームではなくテーブルにフィルタをかけるにはどうすればいいでしょうか? よろしくお願いします。

  • 自作アドインのFunctionプロシージャの戻り値を取得

    ExcelVBAのコード内で、自作アドインのFunctionプロシージャを呼び出して戻り値を取得したいのですが、方法がわかりません。 例えば、AddinTest.xlaにPublic Function FuncTest()があり、その戻り値が"Test"だとして、他のExcelファイルのマクロ内で、Msgboxで戻り値"Test"を表示するなど。。。 アドイン内のSubプロシージャを呼び出すには、Application.Run macro:="AddinTest.xla!~"と記述すれば呼び出せることはわかったんですが、Functionプロシージャの戻り値を取得することができないのです。 よろしくご教授ください。

専門家に質問してみよう