OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 困ってます
  • 質問No.146990
  • 閲覧数8662
  • ありがとう数14
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 58% (18/31)

配列の要素をソートするFunction を作成しようとしているのですが、
ソート対象配列を引数にして、返却値がソートされた配列になるように
したいと思ったのですが、その方法がわかりません。
それとも、引数に配列を入れることは不可能なのでしょうか。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル13

ベストアンサー率 46% (643/1383)

こんな感じです。配列をクイックソートしています。
配列を引数にするには、
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

お礼率 58% (18/31)

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

その他の回答 (全1件)

  • 回答No.1
レベル14

ベストアンサー率 33% (1403/4213)

Functionで無ければならないんですか? subでもできると思います。 「送り」と「受け」を分ける、「送り」と「受け」を同一にする、など パターンはいろいろあるでしょうが。 「送り」と「受け」を分ける場合 Dim nArrey1() As Integer Dim nArrey2() As Integer 'nArrey1()に値のセットを行う Call sub ...続きを読む
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

お礼率 58% (18/31)

御礼が遅くなってすみませんでした。
送りと受けの扱いかたの考え方が、大変勉強になりました。
どうもありがとうございました。
投稿日時 - 2001-10-17 00:09:59


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ