配列の要素を入れ換える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()は、要素入れ換えをしたい配列。

第二引数、第三引数のtargetIndexAtargetIndexBは、それぞれ入れ換えたい要素のインデックス番号を指定する。

 

(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
  • XYの値(100)を代入。
    X = 100, Y = 100, tmp = 10
  • Ytmpの値(10)を代入。
    X = 100, Y = 10, tmp = 10

これで、めでたくXYの値が入れ換わる、という仕掛け。

あとは、(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の要素を入れ換えた配列を作成。最後に全要素をイミディエイト・ウインドウに表示する、というテスト用コード。

ところが、こいつを実行すると、

f:id:akashi_keirin:20181124232551j:plain

こんなエラーが出る。

「配列には割り当てられません」なのだそうだ。

気を取り直して、コードを修正する。

リスト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行。

動的配列にしただけ。

実行結果

f:id:akashi_keirin:20181124232559j:plain

今度は、無事に意図どおりの結果が得られた。

おわりに

今回作成したswapElementsメソッドは、引数チェックがなかったり、Long型にしか対応していなかったり、とまことにもって不十分なシロモノではある。ただ、そのあたりの追加はさほど面倒なことではないと思う。