• ベストアンサー

VBのFunctionで、配列を引数や返却値にできますか?

配列の要素をソートするFunction を作成しようとしているのですが、 ソート対象配列を引数にして、返却値がソートされた配列になるように したいと思ったのですが、その方法がわかりません。 それとも、引数に配列を入れることは不可能なのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

こんな感じです。配列をクイックソートしています。 配列を引数にするには、 Function hoge( Array()) As Long End Function のようにします VBでは通常は「参照渡し」で引数を渡しますので、hoge()中でArray()の内容を書き換えると、呼び出しもとの関数中でも書き換え後の値を使用することが出来ます。 下記で、「ByRef Values()」としているのは、明示的に参照渡しである事を指定することにより、これを読むプログラマに対して「呼び出すとココの値を変更するねんで」ってことを伝えているわけです。 Option Explicit Sub Main()   Dim i As Long   Dim Values() As Long      '配列を初期化する   ReDim Values(255) As Long   For i = 0 To 255     Values(i) = Rnd * 256   Next i      '配列をソートする   Call QuickSortLong(Values()) End Sub Public Sub QuickSortLong(ByRef Values() As Long, Optional StPos As Long, Optional EdPos As Long)   Dim Ct As Long    'カウンタ   Dim LastPos As Long  '配列最終番号   Dim Buffer As Long   'バッファ      '引数省略時の初期値   If IsMissing(StPos) Then     StPos = LBound(Values, 1)   End If   If IsMissing(EdPos) Then     StPos = UBound(Values, 1)   End If   '終了番号が開始番号以下のときは処理を行わない   If StPos >= EdPos Then     Exit Sub   End If   '最初の値をバッファに格納   Buffer = Values(StPos)   '各バッファの値をスワップする   '真ん中にある配列の値を最初の配列に代入する   Values(StPos) = Values((StPos + EdPos) / 2)   'バッファに格納された値を真ん中の配列に代入する   Values((StPos + EdPos) / 2) = Buffer   LastPos = StPos   For Ct = StPos + 1 To EdPos     If Values(Ct) < Values(StPos) Then       LastPos = LastPos + 1       '各バッファの値をスワップ       Buffer = Values(LastPos)       Values(LastPos) = Values(Ct)       Values(Ct) = Buffer     End If   Next Ct   '各バッファの値をスワップ   Buffer = Values(StPos)   Values(StPos) = Values(LastPos)   Values(LastPos) = Buffer      '再起呼び出し   Call QuickSortLong(Values, StPos, LastPos - 1)   Call QuickSortLong(Values, LastPos + 1, EdPos) End Sub

accessdb_user
質問者

お礼

お返事送れてすみませんでした。 御陰で問題が完全に解決しました。ありがとうございました。 ソートまで作っていただいてありがとうございます。 ソースを勉強させていただきます。 クイックソートは難しくて、ちょっと理解していないところがあるのですが、 しばらく頑張ってみようと思います。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

Functionで無ければならないんですか? subでもできると思います。 「送り」と「受け」を分ける、「送り」と「受け」を同一にする、など パターンはいろいろあるでしょうが。 「送り」と「受け」を分ける場合 Dim nArrey1() As Integer Dim nArrey2() As Integer 'nArrey1()に値のセットを行う Call sub配列のソート(nArrey1(),nArrey2()) 'nArrey1()は元のまま 'nArrey2()はソートされている End Sub Sub sub配列のソート(nArrey1() As Integer,nArrey2() As Integer) '配列をソートする処理を記述 'ソート結果はArrey2()とします End Sub 「送り」と「受け」を同一にする場合 Dim nArrey() As Integer '値のセットを行う Call sub配列のソート(nArrey()) 'nArrey()はソートされている End Sub Sub sub配列のソート(nArrey() As Integer) '配列をソートする処理を記述 End Sub

accessdb_user
質問者

お礼

御礼が遅くなってすみませんでした。 送りと受けの扱いかたの考え方が、大変勉強になりました。 どうもありがとうございました。

関連するQ&A

  • PL/SQLのFUNCTIONにおける引数について

    PL/SQLで、FUNCTIONを作成しています。 そのFUNCTIONの引数に StringList型の配列を受け取りたいのですが、 どのように書いたらよろしいのでしょうか? 申し訳ありませんが、教えて下さい。

  • 【エクセルVBA】Functionの引数として、配列は使えるのでしょうか?

    VBA初心者です。 Function で関数を定義するとき、その引数に配列を使う方法はあるのでしょうか? たとえば Function Test (C as double,n as integer) というFunctionの C に3×3の行列を入れたいのですが…。

  • VB6で配列を引数にするときの2通りの方法について

    VB6で引数に配列を渡す方法が2通りあるよう?ですが以下のような配列があり、渡し方によって引数の定義の仕方が異なると思うのですが、(2)番目の関数の書き方が知りたいです。 dim ary_dat(10) as integer (1)test_A( ary_dat ) は、sub test_A( byref ary() as integer)という関数を作れば動作することはわかりましたが、 (2)test_B( ary_dat(0) ) は、関すでどのような引数を定義すればできるのでしょうか?

  • 配列のソート

    Ruby初心者です。 例えば [12,38,121,273,13] [23,47,478,112,98] [56,73,227,556,12] [22,43,668,223,74] [33,13,393,763,91] を [12,38,121,273,13] [22,43,668,223,74] [23,47,478,112,98] [33,13,393,763,91] [56,73,227,556,12] のように第1列目の要素で配列ごとソートしたいのですが、私がやると、 [12,13,38,121,273] [22,43,74,223,668] [23,47,98,112,478] [13,33,91,393,763] [12,56,73,227,556] のように第一列の要素は一応ソートは出来ているのですが、 配列の中身まで並べ変わってしまいます。 配列ごとにソートするにはどうすれば良いのでしょうか?

  • .NET VB の引数についてお伺いさせて下さい。

    最近、VBのコーティングを始めました。 ビルドを実行しても、エラーが出る訳ではないのですが、理解を深めたいので一つご教授していただければ、幸いです。^^ ファンクションの構文なんですが、 アクセス修飾子 Function 任意のファンクション名(第一引数,第二引数)… Private Function Func_Name (Byval sender As System.object, _ Byval e As System.EventArgs ) と記述している方はよくいらっしゃると思います。疑問なのは、第2引数の e です。この小文字には、意味があるのでしょうか? 引数名は自由であると思いますが、参考書などによくこの小文字が入っているのが、気になります。  どなたか、ご存知の方いらっしゃいましたら、お手数ですがご教授いただけませんでしょうか?^^;

  • Excel VBA配列をFunctionに渡す

    こんばんは、引数について教えてください。 Excel VBAの関数を作っていましたが、 1.Function ColumnArrayの部分でコンパイルエラーが発生し、  「配列がありません」と表示されます。  引数を配列のみで渡した場合、問題なく渡せるようですが、  他の引数と、CriteriaArrsの配列と一緒に渡せないのでしょうか。  すべて配列として1つにまとめて渡さなければならないのでしょうか。 2.CriteriaArrs = Array("田中", "鈴木")の部分は、文字列の増減が発生しますので  配列はParamArray  CriteriaArrs()とした方がよいのでしょうか 説明が不足している点があるかもしれませんが宜しくお願いいたします。 Function ColumnArray(SheetName As Worksheet, _ StartCell As Range, _ FieldColumn As Long, _ CountColumn As Long, _ CriteriaArrs As Variant _ ) As Long ・・・ End Function ------------------------------------- sub test() Dim CriteriaArrs() As Variant Dim SheetA As WorkSheet DIm RangeA range CriteriaArrs = Array("田中", "鈴木") set SheetA =Worksheet(1) set RangeA=Range("B3") FilterCount = ColumnArray(SheetA, RangeA, 3, 2, CriteriaArrs) end sub

  • 動的配列に値を返す関数

    Split関数のように動的配列に値を返す関数を作成しようとしているのですが、 作り方が全くわからず途方に暮れています。 Function 関数名()(引数1,引数2) などと関数名の後に()を付けたりしてみたのですが、 コーディング時にエラーとなってしまいます。 何か良い方法はないでしょうか?

  • VB.net 引数で配列変数を渡す際の要素数

    VB.net 2010 の質問です。 配列変数を他のプロシージャに引数で渡す際の、配列変数の要素数をあらかじめ宣言していないとエラーになります。 Dim Hairetsu() As String ' ←エラー Dim Hairetsu(100) As String ' ←正常 Public Sub aaa(ByRef Hairetsu() As String) Hairetsu(0) = "Test" '←正常の場合と、エラーの場合 End Sub Hairetsu(100) のように、要素数を宣言していると、エラーにならないのですが、 プログラム中、要素数がどこまで増加するか、分かりません。 Hairetsu()のように、要素数未確定の配列変数を渡すことは出来ないのでしょうか。 ご存知の方がいらっしゃいましたら、なにとぞアドバイスの程、よろしくお願いいたします。

  • 配列をfunctionに渡す方法

    画像プレロードのjQueryを書いているのですが、うまく動いてくれません。 最後の行の、preloadImg(preloadImgList);の箇所での渡し方が失敗しているのですが、 変数に入れた配列を、関数に渡すことはできないでしょうか。 preloadImg("a","b","c")というかたちにして、直接引数の部分を記述すると動作するのですが、配列の格納された変数にすると、1つの文字列として渡されるようなのです。 ====================================== function preloadImg(){ for(var i = 0; i<arguments.length; i++){ $("<img>").attr("src", arguments[i]); } } $('a.modal').each(function(){ preloadImgList.push($(this).attr('href')); }); preloadImg(preloadImgList); ======================================

  • 連想配列を丸ごと引数にとるのはアリ?

    プログラミングの作法的な質問ですが、 たとえばdoSomething($param)メソッドを自分で作るとして、 そのときに渡す引数がたとえば顧客情報だとしまして、このとき、 doSomething($aryCustomerInfo["name"], $aryCustomerInfo["address"], ...) と要素をひとつずつ渡すべきか、もしくは doSomething($aryCustomerInfo) と丸ごと渡した方がいいでしょうか? 1つずつ渡せば何を渡しているのか分かりやすいですが、引数がやたら多くなるときがあります。 doSomething($aryCustomerInfo)は、引数の配列の要素数が減ったり増えたりしても呼び出し元を変更しないでいいですが、実際何を渡しているのかはメソッド内を見てみないと分からない問題がありますよね? どちらがよろしい、あるいは美しいのでしょうか?

    • ベストアンサー
    • PHP