利用規約の変更について

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

このQ&Aに関連する最新のQ&A

A 回答 (5件)

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


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

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

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

割り込み失礼します。



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

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

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



たとえば 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

よく分かんない。


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

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

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

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

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

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

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

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

このQ&Aと関連する良く見られている質問

QVBA モジュールで共通に使う変数の宣言方法

VBAにてプログラミングを覚えている者です。

現在、いくつかのモジュールがあり、それぞれDimにて宣言している共通の変数があります。
いくつものプロシージャに毎回宣言せず、どこかでひとまとめにしたいと思い、色々と調べています。

例えば、

Dim pic1 As Picture
Dim cell1 As String
Dim pass1 As String
Dim pic2 As Picture

などです。


Dimのほかに、Publicの宣言などがありますが、いま一つ使い方がピンときません。

共通宣言する変数をひとつのモジュールとして登録し、活用できると、いざ変更となったときに
その内容だけ置き換えればいいと思うのですが、みなさんはどのように宣言をしていますか?
(例えば、Stringなどは各モジュールで変更するのが大変だと思うのですが・・・)

ヒントを教えていただければと思います。よろしくお願いします。

Aベストアンサー

>モジュールで共通に使う変数の宣言方法

モジュールの先頭に書いたdimで宣言すると,そのモジュールの中だけ(に記入されている各プロシジャ)でパブリックになります。
モジュールの先頭に書いたpublicで宣言すると,全モジュール(に記入されている各プロシジャ)に対してパブリックになります。

「変数宣言モジュール」のようにモジュールを越えて参照させたいという事なので,DimではなくPublicで宣言します。


Module1:
public x as variant


Module2:
sub macro1() ’先に実行する
x = "abc"
end sub


Module3:
sub macro1()
msgbox x
end sub

QVBAで別モジュールへの変数の受け渡し方法

初歩的な質問で申し訳ありません、
googleでもどのように検索してよいのかわからないので教えてください。


Userformにて作成したコード内にhogehogeという変数を宣言したとします。
これをPublic Sub CommandButton1_Click()内でhogehogeに文字列abcを代入します。

そしてcall を使ってmodule1の処理を行うのですが、
module1内で変数hogehogeに文字列abcが既に代入されているものとして
hogehogeを使いつつ、処理を続けるにはどのようにすればよいのでしょうか?

callで呼ぶ際に変数hogehogeの受け渡しなどが必要なのでしょうか?
(ちなみに全てPublic Subで書いております)

初心者なので質問がおかしいかもしれませんが
よろしくお願いします。

Aベストアンサー

標準的なコードの書き方があります。
具体的なコードがないので、こちらは想像の範囲なので、行き違いがあるのはご容赦願います。

>Userformにて作成したコード内にhogehogeという変数を宣言したとします。
変数を共有化(厳密にはグローバル化されていない、プロジェクト内のみ共有)するには、通常、「標準モジュール」で、プロシージャ外の変数は、Public変数になります。そして、明示的に、Public ○○と書きます。仮に、それが、UserFormモジュール内で使用されるものでも、標準モジュールに書くことになります。

>これをPublic Sub CommandButton1_Click()内でhogehogeに文字列abcを代入します。
そういう書き方は、本当に特殊な例を除いて書きません。Privateキーワードだけです。

つまり、ローカルモジュール(シートモジュール、ThisWorkbookモジュール、UserFormモジュール)には、Public キーワードは用いません。また、そこへのCallでの、呼び出しもしません。共有化させる場合は、一般的には「標準モジュール」を利用します。

しかし、別途、ユーザー定義関数やサブプロシージャで、引き数を参照渡し/値渡しで、変数の内容を渡すことがあります。この方が安定していますが、多少、コードの可読性が落ちます。

>callで呼ぶ際に変数hogehogeの受け渡しなどが必要なのでしょうか?
具体的にどのようなコードになっているか分かりませんし、Callでどう呼ぶのかは分かりませんが、引き数を設ければ、それはそれで済みます。

例:
'UserForm1 上 CommandButton1とTextBox1 を用意
'UserFormモジュール内
Private Sub CommandButton1_Click()
Dim a As Variant
  a = Val(TextBox1.Value)
 Call Test1Ref(a)
 MsgBox a
End Sub

'標準モジュール、そのままで参照渡しになっている
Public Sub Test1Ref(arg1 As Variant)
 arg1 = arg1 * 10
End Sub

ただし、この程度ならば、UserFormモジュール内で、Test1Refを置いても同じです。その時は、Publicキーワードは不要です。

標準的なコードの書き方があります。
具体的なコードがないので、こちらは想像の範囲なので、行き違いがあるのはご容赦願います。

>Userformにて作成したコード内にhogehogeという変数を宣言したとします。
変数を共有化(厳密にはグローバル化されていない、プロジェクト内のみ共有)するには、通常、「標準モジュール」で、プロシージャ外の変数は、Public変数になります。そして、明示的に、Public ○○と書きます。仮に、それが、UserFormモジュール内で使用されるものでも、標準モジュールに書くことになりま...続きを読む

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Qvbsでは漢字の変数は使えないのでしょうか。

下記はエラーになります。
Option Explicit
Dim 氏名

氏名=InputBox("氏名を入力して下さい")
MsgBox(氏名)

ここで、氏名をnameに変更すると正しく実行します。
Option Explicit
Dim name

name=InputBox("氏名を入力して下さい")
MsgBox(name)

漢字の変数を使う方法は無いのでしょうか。

Aベストアンサー

もうお答えは出ているようですが、私からも回答します。

2byte 文字を変数にすると、

\kanjitest.vbs(2, 5)
「Microsoft VBScript コンパイル エラー: 文字が正しくありません。」

のエラーが出ます。
Unicode VBSにしても、やはりエラーが出ます。

もともと、String 型で認められる所以外では、2byte 文字は、ハングしますから、仕方がありません。VBAとは違いますから。
これを、HTA にして、Charset を、UTF-8 にしても、エラーは出ます。諦めることでしょうね。

Q〖エクセル〗MOD関数で、小さな数字を大きな数字で割り算した場合が理解できません

GOOの皆様いつもありがとうございます。
例えば1を2で割り算した場合は、0.5ですが、
MODした場合、余りの数はなぜ1になるのですか?
簡単に説明して頂ける方はいらっしゃいますか・・・

Aベストアンサー

>補足
そのとおりですね。
その例で言えば、10を3で割った余りは1です。
では、余った1を3で割るとどうなりますか?
3で割れないから1余ったのですよね?
なら、余りは1のままです。
割られる数が割る数より小さい正の値であれば、商は0、余りは割られる数そのままです。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Q再計算の負担度低い関数式

お世話になります。

例題から説明しますと、

J列に「数値、文字列」を入力し、
それがE列からG列の間にある数値、文字列に含まれているかどうかを検索するには、
COUNTIF関数を用いています。

=COUNTIF($E:$G,$J2)

しかし、再計算する上で負担の大きいCOUNTIF関数を用いず、他の関数を用いるとすれば
どんな関数(式)が考えらるでしょうか?

Aベストアンサー

返事ありがとうございます。

#6の補足:
msdnのリンク先
>私のような入門レベルの者にとって、とても難しく、理解するには一苦労ですが、

私もです。合計で5回ぐらい読んで、答えなくてはならなくて、やっと意味が通るようになりました。非常に、わかりにくいです。揮発性とか不揮発性という言葉すら、変な言葉ですからね。不揮発というのは、セルの関数の中に検索データが残るタイプの検索値です。それであれば、負担は大きくないし、COUNTIFも、こちらのタイプです。

別のカテゴリのリンク先の話も同様ですが、かなり難しい内容だと思います。

Qエクセル。1から12が循環。

お世話になります。
下記内容をエクセルの計算式で可能ですか?

A1に1と入力→B1,C1に2 3と反映

6と入力→7 8と反映

12と入力→1 2と反映

言葉足らずな点は補足いたします。
よろしくお願いいたします。

Aベストアンサー

同じ解答があるのかな?重複がありましたら、ごめんなさい。

これって、月数の計算ですよね。
B1:
=MOD(A1,12)+1
C1:
=MOD(B1,12)+1


人気Q&Aランキング

おすすめ情報