
プロシージャー間の変数の受け渡しの方法は3種類?:
No_1. Functionプロシージャーを使う方法
No_2. Call文を使う方法
No_3. 参照するSub名_半角スペース_渡す変数名
' --- ??? ---
No_1とNo_2の手法は、慣れ親しんでいるつもりです。
最近、No_3の手法をWEBで目にして混乱しています。
この用法は、手持ちのエクセルやVBAの参考書をめくっても見つけられません。
No_3の用例を記述した参考書・ファンクションKEYで探す手法や、
オブジェクトブラウザーで調べる手法を教えてください。
No.3ベストアンサー
- 回答日時:
くんこばさん、こんばんは。早速、URLを貼って頂き、有難う御座いました。
まさに、私が探していた、マニュアルの様なものでした!!!
(「参照Sub名 引数」 と 「Call 参照Sub名(引数)が、呼び出し元のメインSubに併記されていました)
例題のCodeの4例をコピペし、動作を確認しながら、引数の使い方を再確認しました。
No.5
- 回答日時:
割り込み失礼します。
No.1
>プロシージャー間の変数の受け渡しの方法は3種類?:
これって、何かの問題でしょうか?
まず、変数ではなく、パラメータ(Argument -引数)として)渡す方法は:
2種類-Sub プロシージャと Function プロシージャの「呼び出し」
渡す方法:2種類
「値渡し」と「参照渡し」
そして、変数の受け渡し方法としては、大別すると2つ。
パラメータ(引数)として渡す方法と、モジュール・スコープ型変数・定数で拾い上げるもの。
No.2
Call は、Function プロシージャもSubプロシージャも、基本的には、パラメータとして送るのは同じです。
Call で プロジェクト内かモジュール内なら、Sub プロシージャ・Function プロシージャを呼び出しますが、通常のFunction 関数は使えません。戻り値が取れないからです。
プロジェクト外の時は、Run メソッドを使います。
Call ステートメントを多く使う理由は、暗黙的に「参照し」になるからです。
No.3 は、以下のサンプルで参考にしてください。
実務上の問題なのです。
「"Call"ステートメントを使用しない場合は引数をカッコで括ってはいけません。 」とあるかもしれませんが、「いけない」のではなくて、わかっていないとミスをするからです。
サンプルをみればわかりますでしょう。
> 参照するSub名_半角スペース_渡す変数名
Sub Test2()
Dim arg
'①
arg = 100
ProcedureName arg '参照渡し ②と混同しやすい
'②
arg = 100
ProcedureName (arg) '値渡し '*
'③
arg = 100
Call ProcedureName(arg) '参照渡し
End Sub
Private Sub ProcedureName(arg)
arg = arg ^ 2
End Sub
*Call の時は、() を必ず入れないといないので、Call を使います。
当然、ミスが減ります。
(この話は、大村あつしさんの『簡単プログラミング 応用編』で読んだことがあります。)
なお、Sub プロシージャというものは、戻り値を返さないメソッドのことを指します。Function プロシージャは、戻り値を返すメソッドという定義になります。
私の持っているVB6系の本には、Sub関数は見当たりません。VB.Net にはあります。
それと、「MSのどこのマニュアル」という言葉からすると、そういうMSの書籍はお持ちなのでしょうか?
WindFallerさん、コメントを頂き、有難う御座いました。
1.用語で変数と書きましたが、ご指摘の通り、パラメータ(Argument -引数)でした。
2.貼って頂いた、三例(①、②、③)をPCにコピペし、
msgboxに動作結果を書き出し、引数の渡し方の違いがよくわかりました。
3. >「MSのどこのマニュアル」
ご回答No.3の、くんこばさん、に貼って頂いた、
msdn(? Micro Soft Developer Network)のCode例を、マニュアルのようなものと思っていました。
No.4
- 回答日時:
No.2 の追記です。
Excel2013 も持っているのですがヘルプがオンラインになっていて見つけられなかったのですが Excel2003 のヘルプには載っていました。
以下参考にどうぞ!
----------------------------------------------------------------------------
名前付き引数と省略可能な引数の概要
Sub プロシージャまたは Function プロシージャを呼び出すときは、引数をプロシージャの構文で指定されている定義位置に正しい順序で指定するか、構文上の順序とは無関係に、引数の名前を記述して指定します。
たとえば、次の Sub プロシージャは、3 つの引数を受け取ります。
Sub PassArgs(strName As String, intAge As Integer, dteBirth As Date)
Debug.Print strName, intAge, dteBirth
End Sub
次の例のように、各引数をカンマで区切り、構文どおりの正しい位置に指定して、このプロシージャを呼び出すことができます。
PassArgs "Mary", 26, #69-2-21#
また、名前付き引数をそれぞれカンマで区切って、このプロシージャを呼び出すこともできます。
PassArgs intAge:=26, dteBirth:=#69-2-21#, strName:="Mary"
名前付き引数に値を代入するには、引数名、コロンと等号 (:=)、引数に代入する値の順で記述します。
名前付き引数は、省略可能な引数を持つプロシージャを呼び出すときに便利です。名前付き引数を使用すると、省略する引数を示すためにカンマを入れる必要がなくなります。名前付き引数を使用すると、どの引数を渡し、どの引数を省略したかを簡単に知ることができます。
プロシージャの定義では、省略可能な引数の前にキーワード Optional を付けます。プロシージャを定義するときに、省略可能な引数に既定値を指定することもできます。次にコード例を示します。
Sub OptionalArgs(strState As String, Optional strCountry As String = "USA")
. . .
End Sub
省略可能な引数を使ってプロシージャを呼び出す場合、省略可能な引数を指定するかどうかを選択できます。省略可能な引数を指定しない場合、その引数が既定値を持っていれば、その値が適用されます。既定値を持たない省略可能な引数を指定した場合は、指定したとおりの変数となります。
次のプロシージャには、省略可能な引数 varCountry 変数が含まれています。IsMissing 関数は、省略可能な引数がプロシージャに渡されたかどうかを調べます。
Sub OptionalArgs(strState As String, Optional intRegion As Integer, _
Optional strCountry As String = "USA")
If IsMissing(intRegion) And IsMissing(strCountry) Then
Debug.Print strState
ElseIf IsMissing(strCountry) Then
Debug.Print strState, intRegion
ElseIf IsMissing(intRegion) Then
Debug.Print strState, strCountry
Else
Debug.Print strState, intRegion, strCountry
End If
End Sub
次の例のように、名前付き引数を使って、このプロシージャを呼び出すことができます。
OptionalArgs strCountry:="USA", strState:="MD"
OptionalArgs strState:= "MD", intRegion:=5

GooUserラックさま、追加のコメント、有難う御座いました。
名前付き引数を使ったことがなかったので、
貼っていただいたCodeを自分のPCにコピペして、動作を確認の後、
自分の言葉でCodingしたサンプルを動かしたりして、
引数の使い方を頭に叩き込みました。
No.2
- 回答日時:
もしかしたらこんな事でしょうか?
たとえば B2セル削除して左にシフトの場合、どちらの書き方もOKみたいです。
① Cells(2, 2).Delete Shift:=xlToLeft ← マクロの記録の場合など
② Cells(2, 2).Delete (xlToLeft)
私の場合の使い分けは以下のように勝手に思っています
① は内部の変数に代入するように見えるので何をしているか判りやすい。引数が複数で一部の引数を省いたときは圧倒的にわかりやすくなります。
② は引数の位置と順番を覚えていればコードを短くする事が出来る。引数が複数で一部省く時は良く判らなくなる事が多くなります。
この書き方の違いを仰っているのではないでしょうか?
GooUserラックさま、コメント、有難う御座いました。
お尋ねの要領が悪く、申し分けありません。書いて頂いたヒントは?
Call文 : call 参照Sub名(引数) と、
簡略文?: 参照Sub名 引数 とが同じ結果になるのは、
どこかに明記されたマニュアルがあるのでしょうか?
どうるれば根拠を調べられますか?
No.1
- 回答日時:
よく分かんない。
変数の受け渡し?
引数でなくて?
関数の呼び出しは2種類あって、callで呼び出すのと関数名を直で書くやり方とあります。
自作のsub関数に関しては極力callを使うようにしています。一目で関数だと分かるように。
で、このcallですが、引数を()カッコで囲まないといけない、というルールがあります。
callを使わない場合は、function関数でない限り()カッコは使ってはいけません。
さて、いくらか疑問は解決しました?
くんこばさん、こんばんは。早速、コメント、有難う御座いました。
用語は変数でなく、引数の受け渡しが正しいのですね。
私もCall文やFunction 文を使ってきました。
>callを使わない場合は、function関数でない限り()カッコは使ってはいけません。
この記述は、MSのどこのマニュアルなどのどこに記載されているのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Word(ワード) ワード2023でテキストボックス内の数字が勝手に変わってしまう 1 2023/02/09 14:47
- Excel(エクセル) vba シート名の一覧を2列に分けるには 5 2023/04/24 08:56
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- TOEFL・TOEIC・英語検定 教本と辞書で意味が違いますか? 1 2022/11/18 11:54
- Visual Basic(VBA) マクロで設定時刻の入力がわかりません 2 2022/03/29 02:24
- Excel(エクセル) VBAで、シート間の転記するコードを教えてください。 4 2023/03/26 10:43
- 計算機科学 Pythonに関する質問です。 1 2022/12/04 10:55
- Excel(エクセル) Excelの操作方法を教えてください!頭文字2~8文字で特定の値に返す方法 8 2022/07/14 11:26
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessのマクロでモジュールを...
-
Accessのページヘッターを最初...
-
ExcelVBAのInputBoxメソッドの...
-
エクセルのマクロの止め方
-
RTHDCPL.EXE... が起動時に出て...
-
Access VBAで行ラベルが定義さ...
-
【Excel VBA】 WorksheetやRa...
-
エクセルVBAでUserFormを起動し...
-
アクセス enterで次ページ(レ...
-
Accessのプロシージャ名が勝手...
-
callで順に実行されるプロシー...
-
エクセルVBAが対応できるプログ...
-
VBAにおける Option Explicitの...
-
Excel VBAで「プログラム実行」...
-
このページ、どうなってるので...
-
SQL文(クエリ)をご教授くださ...
-
ACCESSのVBAについて
-
ドメインの取得日を変更する方法
-
クエリー
-
日付の表示について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
エクセルVBAでUserFormを起動し...
-
callで順に実行されるプロシー...
-
Excel VBAで「プログラム実行」...
-
【Excel VBA】 WorksheetやRa...
-
OutlookVBAで作成したマクロに...
-
Accessでグローバル変数を宣言...
-
或るプロシージャの呼び出し元判定
-
VBA プロシージャの名前の取得
-
DBMS_OUTPUT.PUT_LINEを実行し...
-
excel/vba/public変数
-
ACCESS2007インポート時の空白...
-
PL/SQLのエラーについて
-
ACCESS マクロをモジュールに変...
-
エクセルVBAが対応できるプログ...
-
DB2でのストアドプロシージャの...
-
エクセルVBAの次のコードの...
-
Excel:ThisWorkbookオブジェク...
-
アクセスのVBについて
おすすめ情報