Private Function SetDic(dic As Scripting.Dictionary, sN As String) As Scripting.Dictionary
If Not dic.Exists(sN) Then
dic.Add sN, 16
Worksheets("main1").Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = sN
Else
dic.Item(sN) = dic.Item(sN) + 1
End If
Set SetDic = dic
End Function
Sub zenbu()
hoge 'データ型の場合
fuga 'オブジェクト型の場合
End Sub
Sub hoge()
Dim c As Long
c = 1
c = func_num(c)
Debug.Print c
func_num c
Debug.Print c
sub_num c
Debug.Print c
End Sub
Function func_num(num As Long) As Long
num = num + 1
func_num = num
End Function
Sub sub_num(num As Long)
num = num + 1
End Sub
Sub fuga()
Dim r As Range
Set r = Range("A1")
Set r = func_rg(r)
Debug.Print r.Address
func_rg r
Debug.Print r.Address
sub_rg r
Debug.Print r.Address
End Sub
Function func_rg(r As Range) As Range
Set r = r.Offset(, 1)
Set func_rg = r
End Function
Sub sub_rg(r As Range)
Set r = r.Offset(, 1)
End Sub
Private Function SetDic(dic As Scripting.Dictionary, sN As String) As Scripting.Dictionary
> If Not dic.Exists(sN) Then
> dic.Add sN, 16
> Worksheets("main1").Copy After:=Worksheets(Worksheets.Count)
> ActiveSheet.Name = sN
> Else
> dic.Item(sN) = dic.Item(sN) + 1
> End If
> Set SetDic = dic
> End Function
田中 宏明さんの投稿
(投稿ID: 3949)
参照循環ではまりそうで、頭がおかしくなりそうですが、ウォッチ式で正常に動いていることを確認できました。
小川 慶一さんのコメント
(コメントID: 5502)
実は、このプログラムでは、ファンクションプロシージャに渡した引数を戻り値として受け取る必要はありません。
以下のプログラムを実行しても分る通り、呼び出されたサブプロシージャまたはファンクションプロシージャ内で呼び出し元から受け取った引数の値が変わると、呼び出し元のプロシージャの中での当該引数も影響を受けるからです。
試しに、以下のプログラム「zenbu」を実行しみてください。
「zenbu」を実行すると、以下のような出力を得ます。
この性質については発展編2の本編では解説しませんでした。
なので、本動画では、冗長ではありますが、あえて、引数として渡したオブジェクトを戻り値として受け取るようにしています。
呼び出し先のプロシージャ内で呼び出し元から受け取った引数の値を変更したときに呼び出し元のプロシージャ内の変数も影響を受けるか?ということは、プログラミング言語によって変わります。
言語によっては、受け取った引数がデータ型か?オブジェクト型か?によって変わる場合もあります。
それぞれを称して、「実体参照」、「値参照」と呼ぶことがあります。
実体参照:
呼び出し先のプロシージャ内で受け取った引数の値を変えたとき、呼び出し元のプロシージャ内の変数も影響を受ける
値参照:
呼び出し先のプロシージャ内で受けだった引数の値を変えても、呼び出し元のプロシージャ内の変数は影響を受けない
エクセルVBAで現在サポートされているVisual Basicでは実体参照になっています。
ただ、「プログラミング言語はそういう挙動をするもの」と思うのはちょっとまずいです。
また、Excel VBAでも、将来のバージョンアップによって、値参照するような言語仕様になるかもしれません。
> この関数の使い方(参照渡しの引数を書き換えて戻り値に入れる)は、すごいです。
>
> 参照循環ではまりそうで、頭がおかしくなりそうですが、ウォッチ式で正常に動いていることを確認できました。
>
>