■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#17734-0
プロシージャへの引数と戻り値について教えて下さい。
もしかして凄い初歩的な質問かも知れません。いろいろ調べたのですが解らないので教えて下さい。

あるフォームに strYY1,strMM1,strDD1,dtDate1 という4つの項目があります。
(strはstring型 dtはdate型です)
strYY1,strMM1,strDD1はそれぞれ年、月、日の項目で、dtDate1を振り分けて表示します。
その際に call か何かでプロシージャを呼び出したいのですが、一般的には
引数は複数指定出来るが、戻り値は1つしか指定が出来ないと有りました。(callでは戻り値もNG)
今回、知りたいのは下記のプログラムで引数で値を渡し、呼び出し先で引数を変更した場合、
呼び出し元の引数に戻り値を代入したいのです(意味解るでしょうか ^^;)
dtDate1 を変更した場合、それを strYY1,strMM1,strDD1 に反映したいのです。
グローバル関数を使用するとexampleのように複数パターンの呼び出しには対応出来ません。
現状では別の手段でこの問題を解決出来る方法を発見したのですが、プログラムの知識として
しりたいのでどなたか解る方、教えて下さい。

Private sub main()
	dtHuriwake(dtDate1,strYY1,strMM1,strDD1)
	dtHuriwake(dtDate2,strYY2,strMM2,strDD2) 'example
	dtHuriwake(dtDate3,strYY3,strMM3,strDD3) 'example
End sub

Private sub dtHuriwake(dtDate,YY,MM,DD)
	YY = Year(dtDate)
	MM = Month(dtDate)
	DD = Day(dtDate)
End sub

ちなみに私はかなり我流な偏った学習してきてしまったので、
どうか先輩の方々、わかりやすく教えて下さい。
よろしく御教授お願いします!  m(_ _)m
#17736-0
RE#17734:プロシージャへの引数と戻り値について教えて下さい。
ご自分で試してみていないのでしょうか?
試していれば、わかると思うのですが
提示された手続きを実行すれば、引数が変更されているはずです。
VBでは、引数の渡し方がデフォルトで参照渡しになっているからです。
参照渡しされた引数は、関数内での変更が呼び出し元にも反映されます。
(参照渡しとは別に、値渡しという渡し方もあります。こちらは、関数内での変更が
 呼出元に反映されません。)



> もしかして凄い初歩的な質問かも知れません。いろいろ調べたのですが解らないので教えて下さい。
> 
> あるフォームに strYY1,strMM1,strDD1,dtDate1 という4つの項目があります。
> (strはstring型 dtはdate型です)
> strYY1,strMM1,strDD1はそれぞれ年、月、日の項目で、dtDate1を振り分けて表示します。
> その際に call か何かでプロシージャを呼び出したいのですが、一般的には
> 引数は複数指定出来るが、戻り値は1つしか指定が出来ないと有りました。(callでは戻り値もNG)
> 今回、知りたいのは下記のプログラムで引数で値を渡し、呼び出し先で引数を変更した場合、
> 呼び出し元の引数に戻り値を代入したいのです(意味解るでしょうか ^^;)
> dtDate1 を変更した場合、それを strYY1,strMM1,strDD1 に反映したいのです。
> グローバル関数を使用するとexampleのように複数パターンの呼び出しには対応出来ません。
> 現状では別の手段でこの問題を解決出来る方法を発見したのですが、プログラムの知識として
> しりたいのでどなたか解る方、教えて下さい。
> 
> Private sub main()
> 	dtHuriwake(dtDate1,strYY1,strMM1,strDD1)
> 	dtHuriwake(dtDate2,strYY2,strMM2,strDD2) 'example
> 	dtHuriwake(dtDate3,strYY3,strMM3,strDD3) 'example
> End sub
> 
> Private sub dtHuriwake(dtDate,YY,MM,DD)
> 	YY = Year(dtDate)
> 	MM = Month(dtDate)
> 	DD = Day(dtDate)
> End sub
> 
> ちなみに私はかなり我流な偏った学習してきてしまったので、
> どうか先輩の方々、わかりやすく教えて下さい。
> よろしく御教授お願いします!  m(_ _)m
#17738-0
RE#17736:プロシージャへの引数と戻り値について教えて下さい。
すみません、関係ないかも知れませんが、使用しているのはAccess2000を使用しています。
で、実際今やってみたのですが
Private sub dtHuriwake(dtDate,YY,MM,DD)
の中では YY,MM,DD に値が入っていたのですが
Private sub main()
に戻ったときにはnull値に戻ってしまいます。

> デフォルトで参照渡しになっているからです。
参照渡しの設定を明示的に教えて下さい。
(デフォルトになってない場合どう設定するかってことです)

> ご自分で試してみていないのでしょうか?
> 試していれば、わかると思うのですが
> 提示された手続きを実行すれば、引数が変更されているはずです。
> VBでは、引数の渡し方がデフォルトで参照渡しになっているからです。
> 参照渡しされた引数は、関数内での変更が呼び出し元にも反映されます。
> (参照渡しとは別に、値渡しという渡し方もあります。こちらは、関数内での変更が
>  呼出元に反映されません。)
> 
#17739-0
RE#17738:プロシージャへの引数と戻り値について教えて下さい。
> すみません、関係ないかも知れませんが、使用しているのはAccess2000を使用しています。
> で、実際今やってみたのですが
> Private sub dtHuriwake(dtDate,YY,MM,DD)
> の中では YY,MM,DD に値が入っていたのですが
> Private sub main()
> に戻ったときにはnull値に戻ってしまいます。

各変数、関数の引数はきちんと型を宣言しましょう。

> > デフォルトで参照渡しになっているからです。
> 参照渡しの設定を明示的に教えて下さい。
> (デフォルトになってない場合どう設定するかってことです)

引数の頭にByRefキーワードを付ければ、参照渡しです。
省略した場合も同様に参照渡しとして宣言されたものとみなされます。

例えば、以下のような感じ。
Private sub dtHuriwake(ByVal dtDate As Date,ByRef YY As String,ByRef MM As String,ByRef DD As String)
 
引数YY、MM、DDに渡す変数はすべてString型で宣言しておいて下さい。
#17782-0
RE#17739:プロシージャへの引数と戻り値について教えて下さい。
レス遅れてすみません。自宅マシンがウィルスに蝕されてんやわんやしてました。
原因がわかりました。どうも引数を渡すところがYY,MM,DDをフォームのテキストボックスに
していたのですがそれが問題だったようです。代替の変数を作成して実施したらできました。
ところで、引数などの型宣言が必要なのは、後で見てわかりやすいかったり、多人数で作成したとき
わかりやすいから必要なのでしょうか?
どうも、ありがとうございました。

> > すみません、関係ないかも知れませんが、使用しているのはAccess2000を使用しています。
> > で、実際今やってみたのですが
> > Private sub dtHuriwake(dtDate,YY,MM,DD)
> > の中では YY,MM,DD に値が入っていたのですが
> > Private sub main()
> > に戻ったときにはnull値に戻ってしまいます。
> 
> 各変数、関数の引数はきちんと型を宣言しましょう。
> 
> > > デフォルトで参照渡しになっているからです。
> > 参照渡しの設定を明示的に教えて下さい。
> > (デフォルトになってない場合どう設定するかってことです)
> 
> 引数の頭にByRefキーワードを付ければ、参照渡しです。
> 省略した場合も同様に参照渡しとして宣言されたものとみなされます。
> 
> 例えば、以下のような感じ。
> Private sub dtHuriwake(ByVal dtDate As Date,ByRef YY As String,ByRef MM As String,ByRef DD As String)
>  
> 引数YY、MM、DDに渡す変数はすべてString型で宣言しておいて下さい。
#17785-0
RE#17782:プロシージャへの引数と戻り値について教えて下さい。
> 原因がわかりました。どうも引数を渡すところがYY,MM,DDをフォームのテキストボックスに
> していたのですがそれが問題だったようです。代替の変数を作成して実施したらできました。
> ところで、引数などの型宣言が必要なのは、後で見てわかりやすいかったり、多人数で作成したとき
> わかりやすいから必要なのでしょうか?

単にわかりやすいからではありません。

参照渡しでは、渡す変数の型とプロシージャ側の引数の型が一致していないとエラーになりますので、
YY, MM, DDではなく、きちんと型指定することをお勧めしました。

型指定の省略時はVariant型で、関数の引数側がVariant型の場合は、
ユーザ定義型を渡さない限り、プロシージャの呼び出し部では例外的に
エラーにはならないですが。

以下、値渡しと参照渡しの違い。

<値渡し>
値渡しの場合は、引数に指定した変数等の値のコピーを作ります。
そのときに引数の型がLong型で、渡した変数がInteger型だった場合、
値のコピーをつくるときにその値はInteger型からLong型へ変換を暗黙に行ってコピーを作ります。
なので、型が違っても変換可能な値ならエラーにはなりません。

<参照渡し>
参照渡しはコピーを作るのではなく、その変数自身を渡すイメージです。
そのため、渡す側と受け側との型が一致している必要があります。
型が違えば基本的にはエラーになります。
また、式などのような参照渡しのできないものをByRefのついた引数に渡しても
値渡しとみなされます。

#17790-0
RE#17785:プロシージャへの引数と戻り値について教えて下さい。
よねKENさん、いろいろ親切に有り難うございました。
とてもわかりやすくて勉強になりました!!m(_ _)m
このページと関連する記事:
#16813-0ByValとByRefについて2000-12-04(月) 16:11
#11311-0変数の宣言2000-09-12(火) 10:35
#290-2文字列操作について2003-11-22(土) 20:43
#17346-0byref引数の型が一致しません2000-12-25(月) 09:49
#2262-0Recordsetオブジェクトを参照渡ししたいのですが・・・2002-05-24(金) 05:00
#278-2DocuWorksのAPIをVBで使えるように変換したい2003-11-21(金) 15:02
#291-2配列変数を省略可能なの引数にする方法2003-05-14(水) 11:41
#2603-2引数の渡し方が原因?2002-08-29(木) 08:55
#18131-0別のプロシージャに変数の値を渡す方法2001-01-26(金) 00:15
#21757-0配列の値を渡すにはどうすればいいの?2001-07-09(月) 19:28
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)