![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Excel(エクセル) Excelの50音順ソートを全ての行列に適用するには? 4 2022/12/05 11:28
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- その他(プログラミング・Web制作) sortの優先キーについて(スプレッドシート) 1 2023/01/17 17:59
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
VB.net 引数で配列変数を渡す際の要素数
Visual Basic(VBA)
-
Functionの戻り値を配列にしたいのですが
Visual Basic(VBA)
-
VBscriptが起動しない?
Microsoft ASP
-
-
4
VBScriptである文字列に半角文字が含まれているかどうか調べる方法について
Visual Basic(VBA)
-
5
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
6
VBSで変数の宣言はできないのですか?
Visual Basic(VBA)
-
7
VBScriptでファイルの日時順(降順)で並び替えて一覧を出力したい。
その他(プログラミング・Web制作)
-
8
文字列からタブコードを取り除きたい
Visual Basic(VBA)
-
9
コマンドプロンプトによるフォルダ内のファイル存在有無
UNIX・Linux
-
10
VB.NET2003 テキストボックスに半角英数字以外入力させない
Visual Basic(VBA)
-
11
ステートメントの末尾が不正です
Windows Vista・XP
-
12
VBScript(vbs)での行の取得について
その他(プログラミング・Web制作)
-
13
VBSでをエスケープする文字は?"
その他(プログラミング・Web制作)
-
14
VBSの処理中一旦処理を止めて再開させたい。
Visual Basic(VBA)
-
15
ReadLineでの読み出し行を指定する
Visual Basic(VBA)
-
16
VBS実行時エラー オブジェクトがありません 回避方法について
Visual Basic(VBA)
-
17
特定のファイルを他のプロセスが編集中か確認する方法
Visual Basic(VBA)
-
18
SQLでの変数の扱いについて
その他(データベース)
-
19
VB.NETでのイベントの途中終了
Visual Basic(VBA)
-
20
テキストファイルから最終行の抽出
Windows Me・NT・2000
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列数式の解除
-
VBA 1次元配列を2次元に追加する
-
for each の現在の配列ポインタ...
-
2つ以上の変数を比較して最大数...
-
特定のセル範囲で4文字以上入力...
-
行列の積の計算プログラムを教...
-
verilogで配列の任意の8bitを取...
-
配列変数の添字が範囲外ですと...
-
VB6 配列を初期化したい
-
ビンゴ
-
モンテカルロ法を用いた積分計...
-
VB2008: CSV を二次元配列に読...
-
VBAで配列をまるごとコピー
-
配列内の内容を全て表示する方法
-
C言語を用いた3×3の平方行列と...
-
配列を任意の数値で埋める方法
-
subの配列引数をoptionalで使う...
-
ListViewで、非表示列って作れ...
-
VBAで2次元配列を使ってセル検...
-
【VBA】配列とWorksheetFunctio...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列数式の解除
-
2つ以上の変数を比較して最大数...
-
for each の現在の配列ポインタ...
-
VBA 1次元配列を2次元に追加する
-
特定のセル範囲で4文字以上入力...
-
配列変数の添字が範囲外ですと...
-
subの配列引数をoptionalで使う...
-
えfor文とか使っちゃう時点で時...
-
ListViewで、非表示列って作れ...
-
Excel-VBAの配列「Public Const...
-
VBAで近似曲線の係数取得
-
VB6 配列を初期化したい
-
VBのFunctionで、配列を引数...
-
エクセルで最小値から0を除く方法
-
《エクセル2000》A列・B列の商...
-
Dim は何の略ですか?
-
配列を任意の数値で埋める方法
-
友愛数を探すプログラム
-
verilogで配列の任意の8bitを取...
-
配列内の内容を全て表示する方法
おすすめ情報