アプリ版:「スタンプのみでお礼する」機能のリリースについて

プロシージャー間の変数の受け渡しの方法は3種類?:
No_1. Functionプロシージャーを使う方法
No_2. Call文を使う方法
No_3. 参照するSub名_半角スペース_渡す変数名
' --- ??? ---
No_1とNo_2の手法は、慣れ親しんでいるつもりです。
最近、No_3の手法をWEBで目にして混乱しています。
この用法は、手持ちのエクセルやVBAの参考書をめくっても見つけられません。
No_3の用例を記述した参考書・ファンクションKEYで探す手法や、
オブジェクトブラウザーで調べる手法を教えてください。

A 回答 (5件)

よく分かんない。


変数の受け渡し?
引数でなくて?

関数の呼び出しは2種類あって、callで呼び出すのと関数名を直で書くやり方とあります。

自作のsub関数に関しては極力callを使うようにしています。一目で関数だと分かるように。

で、このcallですが、引数を()カッコで囲まないといけない、というルールがあります。
callを使わない場合は、function関数でない限り()カッコは使ってはいけません。

さて、いくらか疑問は解決しました?
    • good
    • 0
この回答へのお礼

くんこばさん、こんばんは。早速、コメント、有難う御座いました。
用語は変数でなく、引数の受け渡しが正しいのですね。
私もCall文やFunction 文を使ってきました。
>callを使わない場合は、function関数でない限り()カッコは使ってはいけません。
この記述は、MSのどこのマニュアルなどのどこに記載されているのでしょうか?

お礼日時:2017/02/23 00:29

もしかしたらこんな事でしょうか?



たとえば B2セル削除して左にシフトの場合、どちらの書き方もOKみたいです。
① Cells(2, 2).Delete Shift:=xlToLeft ← マクロの記録の場合など
② Cells(2, 2).Delete (xlToLeft)

私の場合の使い分けは以下のように勝手に思っています
① は内部の変数に代入するように見えるので何をしているか判りやすい。引数が複数で一部の引数を省いたときは圧倒的にわかりやすくなります。
② は引数の位置と順番を覚えていればコードを短くする事が出来る。引数が複数で一部省く時は良く判らなくなる事が多くなります。

この書き方の違いを仰っているのではないでしょうか?
    • good
    • 0
この回答へのお礼

GooUserラックさま、コメント、有難う御座いました。
お尋ねの要領が悪く、申し分けありません。書いて頂いたヒントは?
Call文 : call 参照Sub名(引数) と、
簡略文?: 参照Sub名 引数 とが同じ結果になるのは、
どこかに明記されたマニュアルがあるのでしょうか?
どうるれば根拠を調べられますか?

お礼日時:2017/02/23 02:18

msdnはよくお世話になってます


https://msdn.microsoft.com/ja-jp/library/office/ …
やっと見つけたよ。
呼び出しのとこ。
    • good
    • 0
この回答へのお礼

くんこばさん、こんばんは。早速、URLを貼って頂き、有難う御座いました。
まさに、私が探していた、マニュアルの様なものでした!!!
(「参照Sub名 引数」 と 「Call 参照Sub名(引数)が、呼び出し元のメインSubに併記されていました)
例題のCodeの4例をコピペし、動作を確認しながら、引数の使い方を再確認しました。

お礼日時:2017/02/23 18:01

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
「VBAのプロシージャー間で、変数の受」の回答画像4
    • good
    • 0
この回答へのお礼

GooUserラックさま、追加のコメント、有難う御座いました。
名前付き引数を使ったことがなかったので、
貼っていただいたCodeを自分のPCにコピペして、動作を確認の後、
自分の言葉でCodingしたサンプルを動かしたりして、
引数の使い方を頭に叩き込みました。

お礼日時:2017/02/23 16:47

割り込み失礼します。



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の書籍はお持ちなのでしょうか?
    • good
    • 0
この回答へのお礼

WindFallerさん、コメントを頂き、有難う御座いました。
1.用語で変数と書きましたが、ご指摘の通り、パラメータ(Argument -引数)でした。
2.貼って頂いた、三例(①、②、③)をPCにコピペし、
msgboxに動作結果を書き出し、引数の渡し方の違いがよくわかりました。
3. >「MSのどこのマニュアル」
ご回答No.3の、くんこばさん、に貼って頂いた、
msdn(? Micro Soft Developer Network)のCode例を、マニュアルのようなものと思っていました。

お礼日時:2017/02/23 17:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています