HOWTO · VBA

VBA で配列と配列リストの要素を並べ替える

このチュートリアルでは、VBA で配列と配列リストの要素を並べ替える方法を示します。

このページの内容

VBA または任意のプログラミング言語では、コードの実行に不可欠な値を格納するためのコンピューターの必要性。これを行うための優れた方法は、アレイを利用することです。

配列は、情報を格納する機能を持つオブジェクトです。これらは、コード実行の後半で必要とされたデータを保存するオプションをプログラマーに提供するため、コンピュータープログラミングに不可欠です。

VBA では、アレイのニーズに合わせて Array() と Arraylist() を利用できます。前者は実行時間が速く、後者は柔軟性を約束します。前者は固定長で、後者の長さは可変です。

以下のコードブロックは、Array() と Arraylist() の作成方法と使用方法を示しています。

静的 Array() を作成して使用します。

Sub StatArrayDemo()

Dim namesArr (1 to 4) as String

namesArr(1) = "Glen"
namesArr(2) = "Jose"
namesArr(3) = "Katrina"
namesArr(4) = "Myla"

Debug.print namesArr(3)
End Sub

StatArrayDemo 出力:

Katrina

動的 Array() を作成して使用します。

Sub DynaArrayDemo()

Dim namesArr as Variant

namesArr = Array("Glen", "Jose", "Katrina", "Myla")

Debug.print namesArr(0)
End Sub

DynaArrayDemo 出力:

Glen

Arraylist() を作成して使用します

VBA で Arraylist() を使用するには、Arraylist() が含まれるライブラリを有効にする必要があります。

これをする:

  • Excel ファイルを開きます。
  • 開発者タブから、Visual Basic エディターを開きます。
  • ツールツールバーから、参照をクリックします。
  • mscorlib.dll チェックボックスにチェックマークを付けます。

これですべての設定が完了しました。

以下の例では、ArrayValues という名前の Arraylist オブジェクトが宣言され、初期化されてから、値が追加されました。

Sub ArrayListDemo()

Dim ArrayValues As ArrayList
'Create a new Arraylist Object

'Adding Values to ArrayValues Arraylist
ArrayValues. Add("Glen")
ArrayValues. Add("Jose")
ArrayValues. Add("Kartina")
ArrayValues. Add("Myla")

Debug.Print (ArrayValues(1))

End Sub

ArrayListDemo Ouput:

Jose

VBA で Array() を並べ替える

以下のコードブロックは、サブルーチンに入力された値を番号順またはアルファベット順に並べ替えます。

ArraySort サブルーチンは 3つのパラメーターを受け入れます。vArray ここで、inLow は vArray の下限であり、inHi は vArray の上限です。ArraySort は、2つのテストサブルーチン NumberTest と LetterTest によってテストされました。

Public Sub ArraySort(vArray As Variant, inLow As Long, inHi As Long)

Dim arr1   As Variant
Dim tempO As Variant
Dim tempL  As Long
Dim tempH   As Long

tempL = inLow
tempH = inHi

arr1 = vArray((inLow + inHi) \ 2)

While (tempL <= tempH)
    While (vArray(tempL) < arr1 And tempL < inHi)
        tempL = tempL + 1
    Wend

    While  (arr1 < vArray(tempH) And tempH > inLow)
        tempH = tempH - 1
    Wend

    If (tempL <= tempH) Then
        tempO = vArray(tempL)
        vArray(tempL) = vArray(tempH)
        vArray(tempH) = tempO
        tempL = tempL + 1
        tempH = tempH - 1
    End If
Wend

If (inLow < tempH) Then ArraySort vArray, inLow, tempH
If (tempL < inHi) Then ArraySort vArray, tempL, inHi

End Sub

Sub NumberTest()

Dim myArr As Variant

myArr = Array(5, 7, 3, 8, 5, 3, 4, 1)

Call ArraySort(myArr, 0, UBound(myArr))

Dim i As Integer

For i = LBound(myArr) To UBound(myArr)

Debug.Print (myArr(i))
Next i

End Sub

Sub LetterTest()

Dim myArr As Variant


myArr = Array("A", "T", "O", "D", "B", "Q", "M", "L")
Call ArraySort(myArr, 0, UBound(myArr))

Dim i As Integer

For i = LBound(myArr) To UBound(myArr)

Debug.Print (myArr(i))
Next i

End Sub

NumberTest 出力:

1 
3 
3 
4 
5 
5 
7 
8 

LetterTest 出力:

A
B
D
L
M
O
Q
T

VBA で Arraylist() を並べ替える

Arraylist の場合、Arraylist オブジェクトには Sort メソッドが付属しているため、簡単です。したがって、配列で並べ替える必要がある場合は、Arraylist を使用することをお勧めします。

以下のコードブロックは、Arraylist で値をソートする方法を示しています。Arraylist の Sort 関数は、値と文字をソートできます。

Public Sub ArraylistSortLetters()

Dim myArr As Arraylist
Set myArr = New Arraylist

myArr.Add ("A")
myArr.Add ("T")
myArr.Add ("O")
myArr.Add ("D")
myArr.Add ("B")
myArr.Add ("Q")
myArr.Add ("M")
myArr.Add ("L")

myArr.Sort

Dim i As Integer

For i = 0 To myArr.Count - 1
   Debug.Print (myArr(i))
Next i

End Sub

ArraylistSortLetters 出力:

A
B
D
L
M
O
Q
T
Public Sub ArraylistSortNumbers()

Dim myArr As Arraylist
Set myArr = New Arraylist

myArr.Add (5)
myArr.Add (8)
myArr.Add (2)
myArr.Add (8)
myArr.Add (4)
myArr.Add (7)
myArr.Add (1)
myArr.Add (7)

myArr.Sort

Dim i As Integer

For i = 0 To myArr.Count - 1
    Debug.Print (myArr(i))
Next i

End Sub

ArraylistSortNumbers 出力:

1 
2 
4 
5 
7 
7 
8 
8 

ArraylistSortLetters と ArraylistSortNumbers の上の 2つのコードブロックは、要素を低いものから高いものへと並べ替えます。

配列を最高から最低にソートする場合は、配列を最低から最高にソートしてから、Reverse メソッドを使用して切り替えることができます。

以下のコードブロックは、Reverse メソッドを使用した最高から最低への並べ替えを示しています。

Public Sub SortInHighestToLowest()

Dim myArr As Arraylist
Set myArr = New Arraylist

myArr.Add (5)
myArr.Add (8)
myArr.Add (2)
myArr.Add (8)
myArr.Add (4)
myArr.Add (7)
myArr.Add (1)
myArr.Add (7)

myArr.Sort
myArr.Reverse

Dim i As Integer

For i = 0 To myArr.Count - 1
   Debug.Print (myArr(i))
Next i

End Sub

SortInHighestToLowest 出力:

8 
8 
7 
7 
5 
4 
2 
1