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
お返事送れてすみませんでした。
御陰で問題が完全に解決しました。ありがとうございました。
ソートまで作っていただいてありがとうございます。
ソースを勉強させていただきます。
クイックソートは難しくて、ちょっと理解していないところがあるのですが、
しばらく頑張ってみようと思います。
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ちょっと先の未来クイズ第2問
9月9日(月)に発表される「第3回子どもマネー川柳」に入賞する川柳を考えてこちらに投稿してください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
VB.net 引数で配列変数を渡す際の要素数
Visual Basic(VBA)
-
Functionの戻り値を配列にしたいのですが
Visual Basic(VBA)
-
配列の参照渡しで型が一致しません。
Visual Basic(VBA)
-
-
4
コマンドプロンプトによるフォルダ内のファイル存在有無
UNIX・Linux
-
5
外部モニターを接続するとデスクトップのアイコンの位置が変わる
モニター・ディスプレイ
-
6
VBScriptで数値にコンマを付けたいです
Visual Basic(VBA)
-
7
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
8
【sendkeysメソッドが動かずに苦慮しております】
Visual Basic(VBA)
-
9
VBSの処理中一旦処理を止めて再開させたい。
Visual Basic(VBA)
-
10
ReadLineでの読み出し行を指定する
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
VB6 配列を初期化したい
-
for each の現在の配列ポインタ...
-
ListViewで、非表示列って作れ...
-
subの配列引数をoptionalで使う...
-
VBのFunctionで、配列を引数...
-
配列変数の添字が範囲外ですと...
-
エクセルで最小値から0を除く方法
-
特定のセル範囲で4文字以上入力...
-
2次元動的配列の第一引数のみを...
-
VBA 1次元配列を2次元に追加する
-
Excel-VBAで内臓のMINVERSE,MM...
-
VBAで近似曲線の係数取得
-
Excel-VBAの配列「Public Const...
-
シューティングゲームのタスク...
-
FORTRANのCOMMON文
-
Array配列の末尾に追加したい。
-
配列を任意の数値で埋める方法
-
OutlookVBAでサブフォルダ一括作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
特定のセル範囲で4文字以上入力...
-
VB6 配列を初期化したい
-
subの配列引数をoptionalで使う...
-
VBA 1次元配列を2次元に追加する
-
ListViewで、非表示列って作れ...
-
for each の現在の配列ポインタ...
-
配列変数の添字が範囲外ですと...
-
エクセルで最小値から0を除く方法
-
2次元動的配列の第一引数のみを...
-
VBのFunctionで、配列を引数...
-
配列を任意の数値で埋める方法
-
《エクセル2000》A列・B列の商...
-
Excel VBA配列をFunctionに渡す
-
AES暗号にて、AES_set_encrypt_...
-
VBA Match関数の限界
-
Array配列の末尾に追加したい。
-
VBAで近似曲線の係数取得
-
配列内の内容を全て表示する方法
おすすめ情報