配列の要素を入れ換えるFunction
配列の要素を入れ換えるFunction
配列の要素を入れ換えるFunctionを作ってみた。
仕様
とりあえず、引数として当該の配列、入れ換え対象のインデックス番号二つを受け取り、入れ換え済みの配列を返すようにする。今回は、Long
型の配列に対応する。
コーディング
リスト1 標準モジュール
Private Function swapElements( _ ByRef targetArray() As Long, _ ByVal targetIndexA As Long, _ ByVal targetIndexB As Long) As Long() '……(1)' Dim tmp As Long tmp = targetArray(targetIndexA) '……(2)' targetArray(targetIndexA) = targetArray(targetIndexB) targetArray(targetIndexB) = tmp swapElements = targetArray '……(3)' End Function
(1)の
Private Function swapElements( _ ByRef targetArray() As Long, _ ByVal targetIndexA As Long, _ ByVal targetIndexB As Long) As Long()
は、メソッド名と引数、返り値の設定。
今後、モジュール内での呼び出しでのみ使う予定なので、Private
指定にしているが、これはあくまでも私の個人的な事情なので、Public
にしてもらっても何の問題もない。
第一引数のtargetArray()
は、要素入れ換えをしたい配列。
第二引数、第三引数のtargetIndexA
、targetIndexB
は、それぞれ入れ換えたい要素のインデックス番号を指定する。
(2)からの3行、
tmp = targetArray(targetIndexA) targetArray(targetIndexA) = targetArray(targetIndexB) targetArray(targetIndexB) = tmp
は、要素を交換する際の常套句のようなコード。
一方の値を一旦変数tmp
に入れておく、というやり方。
たとえば、X
の値(10
とする。)とY
の値(100
とする。)を入れ換えたければ、
- 一旦
X
の値(10
)をtmp
に保存。
(X = 10, Y = 100, tmp = 10
) X
にY
の値(100
)を代入。
(X = 100, Y = 100, tmp = 10
)Y
にtmp
の値(10
)を代入。
(X = 100, Y = 10, tmp = 10
)
これで、めでたくX
とY
の値が入れ換わる、という仕掛け。
あとは、(3)の
swapElements = targetArray
で要素入れ換え済みの配列を返しておしまい。
使ってみる
次のコードで実験。
リスト2 標準モジュール
Public Sub testSwap() Dim ar(4) As Long ar(0) = 1 ar(1) = 3 ar(2) = 5 ar(3) = 7 ar(4) = 9 ar = swapElements(ar, 2, 3) Dim i As Long For i = LBound(ar) To UBound(ar) Debug.Print ar(i) Next End Sub
要素が{1, 3, 5, 7, 9}
である配列を用意。で、今回作成したswapElements
メソッドを用いて、その配列のインデックス2と3の要素を入れ換えた配列を作成。最後に全要素をイミディエイト・ウインドウに表示する、というテスト用コード。
ところが、こいつを実行すると、
こんなエラーが出る。
「配列には割り当てられません」なのだそうだ。
気を取り直して、コードを修正する。
リスト3 標準モジュール
Public Sub testSwap() Dim ar() As Long '……(*)' ReDim ar(4) ar(0) = 1 ar(1) = 3 ar(2) = 5 ar(3) = 7 ar(4) = 9 ar = swapElements(ar, 2, 3) Dim i As Long For i = LBound(ar) To UBound(ar) Debug.Print ar(i) Next End Sub
修正したのは(*)からの2行。
動的配列にしただけ。
実行結果
今度は、無事に意図どおりの結果が得られた。
おわりに
今回作成したswapElements
メソッドは、引数チェックがなかったり、Long
型にしか対応していなかったり、とまことにもって不十分なシロモノではある。ただ、そのあたりの追加はさほど面倒なことではないと思う。