Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Excel 2007)
参照渡しした配列の値が変更されない
投稿日時: 17/06/02 00:51:33
投稿者: benfica

VBAにてソートを行う関数を、以下のページを参考に作成しました。
http://beatdjam.hatenablog.com/entry/2016/11/29/205445
 
 
モジュール変数として宣言したString型もしくはVariant型の配列変数を追加した関数に渡して昇順にソートするという処理を行います。 ソートの関数内では参照渡しで受け取った関数の値をソートし、呼び出し側では戻り値の受け取りが必要ないようにしたいと考えています。
 
しかしながら、呼び出し元ではソート関数の呼び出し後も配列の要素の順番は変更されません。明示的に戻り値を返却した場合はソートされた後の値が取得できます。
 
「配列を参照渡しし、ソートする」場合には、元の配列の順序は変更されないのでしょうか?ご教示お願いいたします。
 

Dim stockSheetList() As String

Private Sub 呼び出し側関数()
    quicksort (sheetList)
End Sub


Public Function quicksort(ByRef aryVal As Variant, Optional ByVal left As Long = -1, Optional ByVal right As Long = -1)
    ソート処理

End Function

回答
投稿日時: 17/06/02 04:46:52
投稿者: simple

 quicksort (sheetList)
と書いているのが間違いです。
 quicksort sheetList
が正しい。
かっこをつけることによって、元のsheetListとは別のコピーが作られ、
それが引数として quicksortに渡されている。
更新されている引数は、あくまでもsheetListのコピーであって、sheetListではない。
 
正確性を欠いた記述かもしれないが、素人としては上のように理解している。
 
なお、よく
       MsgBox("OKです")
などと書く人が多いが、これも上記と同じ理屈から、
本来は
       MsgBox "OKです"
と書くのが正しい。副作用が表面化していないので、問題にはならないが。

回答
投稿日時: 17/06/02 04:51:22
投稿者: mokutachi

この場合は
 
× quicksort (sheetList)
 
○ quicksort sheetList
 
もしくは
 
○ Call quicksort(sheetList)
 
 
VBAでの引数のカッコの使い方には注意を。

回答
投稿日時: 17/06/10 06:17:30
投稿者: simple

こんにちは。
 
上記で、コピーが作られると書きましたが、
カッコをつけることによって行われる演算の結果が引数に渡される、
と書いたほうが理解しやすかったかも知れません。
 
プロシージャに渡す引数にカッコがあるかないかが影響する例として、
例えば以下のようなものが考えられます。
 

Sub proc(v As Variant)
    Debug.Print TypeName(v)
End Sub

Sub test()
    Dim r As Range
    Set r = Range("A1")
    r.Value = "sss"
    proc r      '=> Rangeと出力される
    proc (r)    '=> Stringと出力される
End Sub

 
質問のあった例に戻りますと、
元の引数とは別のものが引数に渡されると考えれば、
参照渡しの例外と考える必要はなく、
整合的な理解ができるはずです。
参考にして下さい。
 
 
とても貴重な視点からの質問であり、有益なスレッドと思っています。
ただ、質問のしっぱなしは良くないですよね。
なんらかの返事くらいされたほうがお互いに気持ちいいはずです。
もし疑問点があるなら、続けて議論しましょう。
 
# 実社会でもそうでしょ?
# 他人に質問して回答があっって、
# それに返事もしなかったら、あいつなんだよ、となるでしょ?
# 基本的にそれと同じことですよ。

トピックに返信