配列の使い方
固定配列
動的配列
コレクションの使い方
今日の目的
プロシージャレベル
Dim aryBuf(0 To 5) As Long
モジュールレベル
Private aryBuf(0 To 5) As Long
Public aryBuf(0 To 5) As Long
プロシージャレベル
Dim aryBuf(0 To 5) As Long
モジュールレベル
Private aryBuf(0 To 5) As Long
Public aryBuf(0 To 5) As Long
固定配列の宣言例
配列の最小範囲と最大範囲を指定
この場合は下記のような要素
aryBuf(0), aryBuf(1), aryBuf(2)
aryBuf(3), aryBuf(4), aryBuf(5)
固定配列の宣言例
最小範囲を省略することもできる
固定配列の宣言例
最小範囲を省略することもできる
Option Base 1
Dim aryBuf(5) As Long
→1~5になる
Option Base 0
‘* 省略した場合と同じ動き
Dim aryBuf(5) As Long
プロシージャレベル
Dim aryBuf(0 To 5) As Long
モジュールレベル
Private aryBuf(0 To 5) As Long
Public aryBuf(0 To 5) As Long
固定配列の宣言例
固定配列の宣言例
Const lMax As Long = 5
Dim aryBuf(0 To lMax) As Long
範囲には定数をしていできる
(変数はダメ)
固定配列の使用例
Const lMax As Long = 5
Dim aryBuf(0 To lMax) As Long
Dim i As Long
For i = LBound(aryBuf) To UBound(aryBuf)
Debug.Print i & ":" & aryBuf(i)
固定配列の使用例
Const lMax As Long = 5
Dim aryBuf(0 To lMax) As Long
Dim i As Long
For i = LBound(aryBuf) To UBound(aryBuf)
Debug.Print i & ":" & aryBuf(i)
Next i
LBound()は配列の下限を取得する
この場合は0がかえる
固定配列の使用例
Const lMax As Long = 5
Dim aryBuf(0 To lMax) As Long
Dim i As Long
For i = LBound(aryBuf) To UBound(aryBuf)
Debug.Print i & ":" & aryBuf(i)
Next i
UBound()は配列の上限を取得する
この場合は
5がかえる
固定配列の使用例
Const lMax As Long = 5
Dim aryBuf(0 To lMax) As Long
Dim i As Long
For i = LBound(aryBuf) To UBound(aryBuf)
Debug.Print i & ":" & aryBuf(i)
多次元配列の宣言例
Dim aryBuf(0 To 5, 0 To 1) As String
次元をコンマで区切って宣言できる
最高で60次元までできる
多次元配列の使用例
Dim aryBuf(0 To 5, 0 To 1) As String
Dim i As Long
Dim j As Long
For i = LBound(aryBuf, 1) To UBound(aryBuf, 1)
For j = LBound(aryBuf, 2) To UBound(aryBuf, 2)
Debug.Print i & “,” & j & ":" & aryBuf(i, j)
Next j
Next i
多次元配列の使用例
Dim aryBuf(0 To 5, 0 To 1) As String
Dim i As Long
Dim j As Long
For i = LBound(aryBuf, 1) To UBound(aryBuf, 1)
For j = LBound(aryBuf, 2) To UBound(aryBuf, 2)
Debug.Print i & “,” & j & ":" & aryBuf(i, j)
Next j
Next i
LBound,UBoundの第二引数に
次元を指定することで、その次元の
下限、上限を取得できる
多次元配列の使用例
Dim aryBuf(0 To 5, 0 To 1) As String
Dim i As Long
Dim j As Long
For i = LBound(aryBuf, 1) To UBound(aryBuf, 1)
For j = LBound(aryBuf, 2) To UBound(aryBuf, 2)
Debug.Print i & ",“ & j & ":" & aryBuf(i, j)
Next j
Next i
1次元目の下限を求める
→0になる
多次元配列の使用例
Dim aryBuf(0 To 5, 0 To 1) As String
Dim i As Long
Dim j As Long
For i = LBound(aryBuf, 1) To UBound(aryBuf, 1)
For j = LBound(aryBuf, 2) To UBound(aryBuf, 2)
Debug.Print i & ",“ & j & ":" & aryBuf(i, j)
Next j
Next i
1次元目の上限を求める
→5になる
多次元配列の使用例
Dim aryBuf(0 To 5, 0 To 1) As String
Dim i As Long
Dim j As Long
For i = LBound(aryBuf, 1) To UBound(aryBuf, 1)
For j = LBound(aryBuf, 2) To UBound(aryBuf, 2)
Debug.Print i & ",“ & j & ":" & aryBuf(i, j)
Next j
Next i
2次元目の下限を求める
→0になる
多次元配列の使用例
Dim aryBuf(0 To 5, 0 To 1) As String
Dim i As Long
Dim j As Long
For i = LBound(aryBuf, 1) To UBound(aryBuf, 1)
For j = LBound(aryBuf, 2) To UBound(aryBuf, 2)
Debug.Print i & ",“ & j & ":" & aryBuf(i, j)
Next j
Next i
2次元目の上限を求める
→1になる
多次元配列の使用例
Dim aryBuf(0 To 5, 0 To 1) As String
Dim i As Long
Dim j As Long
For i = LBound(aryBuf, 1) To UBound(aryBuf, 1)
For j = LBound(aryBuf, 2) To UBound(aryBuf, 2)
Debug.Print i & ","; j & ":" & aryBuf(i, j)
Next j
Next i
動的配列
動的配列を宣言すると、コードの実行中に配列の
動的配列の例
Dim arybuf() As String
lMax = 5
' 動的配列では変数での範囲指定が可能
ReDim arybuf(0 To lMax) As String
動的配列の例
Dim arybuf() As String
lMax = 5
' 動的配列では変数での範囲指定が可能
ReDim arybuf(0 To lMax) As String
動的配列の例
Dim arybuf() As String
lMax = 5
' 動的配列では変数での範囲指定が可能
ReDim arybuf(0 To lMax) As String
動的配列の例
Dim arybuf() As String
lMax = 5
' 動的配列では変数での範囲指定が可能
ReDim arybuf(0 To 0) As String
aryBuf(0) = “ゆっくりしていってね”
動的配列の例
Dim arybuf() As String
lMax = 5
' 動的配列では変数での範囲指定が可能
ReDim arybuf(0 To 0) As String
aryBuf(0) = “ゆっくりしていってね”
動的配列の例
Dim arybuf() As String
lMax = 5
' 動的配列では変数での範囲指定が可能
ReDim arybuf(0 To 0) As String
aryBuf(0) = “ゆっくりしていってね”
動的配列の例
Dim arybuf() As String
lMax = 5
' 動的配列では変数での範囲指定が可能
ReDim arybuf(0 To 0) As String
aryBuf(0) = “ゆっくりしていってね”
動的配列の例
Dim arybuf() As String
ReDim aryBuf(0 To 5, 0 To 1) As String
aryBuf(0, 0) = "オプーナ・ザ・ワゴン“
動的配列の例
Dim arybuf() As String
ReDim aryBuf(0 To 5, 0 To 1) As String
aryBuf(0, 0) = "オプーナ・ザ・ワゴン“
動的配列の例
Dim arybuf() As String
ReDim aryBuf(0 To 5, 0 To 1) As String
aryBuf(0, 0) = "オプーナ・ザ・ワゴン“
動的配列の解放
Erase
ステートメントを使用する
Erase
動的配列
→メモリの解放。
配列を再度しようするには
ReDimが必要
Erase
固定配列
→要素の再初期化
Const lMax As Long = 5
Dim aryDyn() As String
Dim aryFix(0 To lMax) As String
ReDim aryDyn(0 To lMax) As String
aryDyn(0) = "オプーナ“
aryFix(0) = aryDyn(0)
‘ ~ 略 (要素を埋めます) ~
Debug.Assert false
Erase
aryFix
Erase
aryDyn
Debug.Assert false
Const lMax As Long = 5
Dim aryDyn() As String
Dim aryFix(0 To lMax) As String
ReDim aryDyn(0 To lMax) As String
aryDyn(0) = "オプーナ“
aryFix(0) = aryDyn(0)
‘ ~ 略 (要素を埋めます) ~
Debug.Assert false
Erase
aryFix
Erase
aryDyn
Debug.Assert false
Const lMax As Long = 5
Dim aryDyn() As String
Dim aryFix(0 To lMax) As String
ReDim aryDyn(0 To lMax) As String
aryDyn(0) = "オプーナ“
aryFix(0) = aryDyn(0)
‘ ~ 略 (要素を埋めます) ~
Debug.Assert false
Erase
aryFix
Erase
aryDyn
Debug.Assert false
Const lMax As Long = 5
Dim aryDyn() As String
Dim aryFix(0 To lMax) As String
ReDim aryDyn(0 To lMax) As String
aryDyn(0) = "オプーナ“
aryFix(0) = aryDyn(0)
‘ ~ 略 (要素を埋めます) ~
Debug.Assert false
Erase
aryFix
Erase
aryDyn
Debug.Assert false
Const lMax As Long = 5
Dim aryDyn() As String
Dim aryFix(0 To lMax) As String
ReDim aryDyn(0 To lMax) As String
aryDyn(0) = "オプーナ“
aryFix(0) = aryDyn(0)
‘ ~ 略 (要素を埋めます) ~
Debug.Assert false
Erase
aryFix
Erase
aryDyn
Debug.Assert false
Const lMax As Long = 5
Dim aryDyn() As String
ReDim aryDyn(0 To lMax) As String
Debug.Print LBound(aryDyn)
‘ ~ 略 (要素を埋めます) ~
Erase
aryDyn
Debug.Print LBound(aryDyn)
Const lMax As Long = 5
Dim aryDyn() As String
ReDim aryDyn(0 To lMax) As String
Debug.Print LBound(aryDyn)
‘ ~ 略 (要素を埋めます) ~
Erase
aryDyn
Debug.Print LBound(aryDyn)
Const lMax As Long = 5
Dim aryDyn() As String
ReDim aryDyn(0 To lMax) As String
Debug.Print LBound(aryDyn)
‘ ~ 略 (要素を埋めます) ~
Erase
aryDyn
Debug.Print LBound(aryDyn)
Const lMax As Long = 5
Dim aryDyn() As String
ReDim aryDyn(0 To lMax) As String
‘ ~ 略 (要素を埋めます) ~
Erase
aryDyn
Debug.Print Lbound(aryDyn)
Private Function IsAllocatedArray (ByRef ary() As String) On Error GoTo ErrCatch:
Dim i As Long i = LBound(ary) IsAllocatedArray = True Exit Function ErrCatch: If err.Number <> 9 Then
err.Raise err.Number, err.Source, err.Description, err.HelpFile, err.HelpContext
End If
IsAllocatedArray= False End Function
Private Function IsArrocatedArray(ByRef ary() As String) On Error GoTo ErrCatch:
Dim i As Long i = LBound(ary) IsArrocatedArray = True Exit Function ErrCatch: If err.Number <> 9 Then
err.Raise err.Number, err.Source, err.Description, err.HelpFile, err.HelpContext
End If
IsArrocatedArray = False End Function
Private Function IsAllocatedArray (ByRef ary() As String) On Error GoTo ErrCatch:
Dim i As Long i = LBound(ary) IsAllocatedArray= True Exit Function ErrCatch: If err.Number <> 9 Then
err.Raise err.Number, err.Source, err.Description, err.HelpFile, err.HelpContext End If IsAllocatedArray = False End Function
LBoundがエラーではない
=配列として使用できる
Private Function IsAllocatedArray (ByRef ary() As String) On Error GoTo ErrCatch:
Dim i As Long i = LBound(ary) IsAllocatedArray= True Exit Function ErrCatch: If err.Number <> 9 Then
err.Raise err.Number, err.Source, err.Description, err.HelpFile, err.HelpContext End If IsAllocatedArray= False End Function
LBoundがエラー
ErrCatchラベルへ飛ぶ
Private Function IsAllocatedArray (ByRef ary() As String) On Error GoTo ErrCatch:
Dim i As Long i = LBound(ary) IsArrocatedArray = True Exit Function ErrCatch: If err.Number <> 9 Then
err.Raise err.Number, err.Source, err.Description, err.HelpFile, err.HelpContext End If IsAllocatedArray = False End Function
インデックス範囲外の
エラーじゃなければ
そのエラーを再度発生させ
る
Const lMax As Long = 5
Dim aryDyn() As String
ReDim aryDyn(0 To lMax) As String
‘ ~ 略 (要素を埋めます) ~
Debug.Print IsAllocatedArray (aryDyn)
Erase
aryDyn
Debug.Print IsAllocatedArray (aryDyn)
Const lMax As Long = 5
Dim aryDyn() As String
ReDim aryDyn(0 To lMax) As String
‘ ~ 略 (要素を埋めます) ~
Debug.Print IsAllocatedArray (aryDyn)
Erase
aryDyn
Debug.Print IsAllocatedArray (aryDyn)
Const lMax As Long = 5
Dim aryDyn() As String
ReDim aryDyn(0 To lMax) As String
‘ ~ 略 (要素を埋めます) ~
Debug.Print IsArrocatedArray(aryDyn)
Erase
aryDyn
Debug.Print IsArrocatedArray(aryDyn)
Const lMax As Long = 5
Dim aryDynLng() As Long
ReDim aryDynLng(0 To lMax) As Long
‘ ~ 略 (要素を埋めます) ~
Debug.Print IsAllocatedArray (aryDynLng)
Erase
aryDynLng
Debug.Print IsAllocatedArray (aryDynLng)
動的配列の型を変えると
型の不一致エラーになる
Private Function IsAllocatedArray (ByRef ary As Variant) On Error GoTo ErrCatch:
Dim i As Long i = LBound(ary) IsAllocatedArray= True Exit Function ErrCatch: If err.Number <> 9 Then
err.Raise err.Number, err.Source, err.Description, err.HelpFile, err.HelpContext End If IsAllocatedArray= False End Function
引数の変更
ary() As String
→ary As Variant
Const lMax As Long = 5
Dim aryDynLng() As Long
ReDim aryDynLng(0 To lMax) As Long
‘ ~ 略 (要素を埋めます) ~
Debug.Print IsAllocatedArray (aryDynLng)
Erase
aryDynLng
Debug.Print IsAllocatedArray (aryDynLng)
引数を
Variantにすると
予定通り動作する
Variant型に配列を格納
Dim aryBuf(0 To 5) As String
aryBuf(0) = "オプーナ・ザ・ワゴン“
Dim v As Variant
v = aryBuf
For i = LBound(v) To UBound(v)
Debug.Print i & ":" & v(i)
Next i
Variant型の変数に配列を代入すると、
配列として普通に使えるようになり
ます
配列の使い方
固定配列
動的配列
コレクションの使い方
今日の目的
異なる型やオブジェクトを格納できる
各要素の追加、削除が容易
連想配列としても使用できる
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim vData As Variant For Each vData In cll
Debug.Print TypeName(vData) & ":" & vData Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim vData As Variant For Each vData In cll
Debug.Print TypeName(vData) & ":" & vData Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim vData As Variant For Each vData In cll
Debug.Print TypeName(vData) & ":" & vData Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim vData As Variant For Each vData In cll
Debug.Print TypeName(vData) & ":" & vData Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim vData As Variant For Each vData In cll
Debug.Print TypeName(vData) & ":" & vData Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim vData As Variant For Each vData In cll
Debug.Print TypeName(vData) & ":" & vData Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim vData As Variant For Each vData In cll
Debug.Print TypeName(vData) & ":" & vData Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim vData As Variant For Each vData In cll
Debug.Print TypeName(vData) & ":" & vData Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim vData As Variant For Each vData In cll
Debug.Print TypeName(vData) & ":" & vData Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim vData As Variant For Each vData In cll
Debug.Print TypeName(vData) & ":" & vData Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim i As Long
For i = 1 To cll.Count
Debug.Print TypeName(cll.Item(i)) & ":" & cll.Item(i) Next
Set cll = Nothing
バリアント型に一端格納しない
パターンの例
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim i As Long
For i = 1 To cll.Count
Debug.Print TypeName(cll.Item(i)) & ":" & cll.Item(i) Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Dim i As Long
For i = 1 To cll.Count
Debug.Print TypeName(cll.Item(i)) & ":" & cll.Item(i) Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Call cll.add(“ゆっくりしていってね”, Before:=1 ) Dim i As Long
For i = 1 To cll.Count
Debug.Print TypeName(cll.Item(i)) & ":" & cll.Item(i) Next
Set cll = Nothing
Before:=x
とすることで要素xの前に新しい要
素を追加する
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Call cll.add(“ゆっくりしていってね”, Before:=1 ) Dim i As Long
For i = 1 To cll.Count
Debug.Print TypeName(cll.Item(i)) & ":" & cll.Item(i) Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Call cll.add(“ゆっくりしていってね”, After:=1 ) Dim i As Long
For i = 1 To cll.Count
Debug.Print TypeName(cll.Item(i)) & ":" & cll.Item(i) Next
Set cll = Nothing
After:=x
とすることで要素xの後に新しい要
素を追加する
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1))
Call cll.add(“ゆっくりしていってね”, After:=1 ) Dim i As Long
For i = 1 To cll.Count
Debug.Print TypeName(cll.Item(i)) & ":" & cll.Item(i) Next
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1)) Call cll.Remove( 1 )
Dim i As Long
For i = 1 To cll.Count
Debug.Print TypeName(cll.Item(i)) & ":" & cll.Item(i) Next
Set cll = Nothing
Removeメソッドを使用することで
指定の要素を削除できる
Dim cll As New Collection
Call cll.add("オプーナ")
Call cll.add(#1/3/2008 3:32:00 AM#) Call cll.add(23432&)
Call cll.add(Sheet1.Cells(1, 1)) Call cll.Remove( 1 )
Dim i As Long
For i = 1 To cll.Count
Debug.Print TypeName(cll.Item(i)) & ":" & cll.Item(i) Next
String型の一意のキーを指定して効果発動
プログラマはキーを元にデータの取得、削除ができ
る
Dim cll As New Collection Call cll.add("カイジ", "顎") Debug.Print cll.Item("顎") Set cll = Nothing
Dim cll As New Collection Call cll.add("カイジ", "顎")
Call cll.add(“アカギ”, “倍プッシュ", before:="顎") Set cll = Nothing
Dim cll As New Collection Call cll.add("カイジ", "顎")
Call cll.add(“アカギ”, “倍プッシュ", before:="顎") Call cll.add(“黒沢”, “最強”, after:=“倍プッシュ") Set cll = Nothing
Dim cll As New Collection Call cll.add("カイジ", "顎")
Call cll.add(“アカギ”, “倍プッシュ", before:="顎") Call cll.add(“黒沢”, “最強”, after:=“倍プッシュ")
Call cll.Remove("最強") Set cll = Nothing
String型の一意のキーを指定して効果発動
プログラマはキーを元にデータの取得、削除ができ
る
Private Function HasCollectionKey(ByRef cll As Collection, _ ByVal keyName As String) As Boolean
On Error GoTo ErrCatch Dim lRet As Long
lRet = VarType(cll.Item(keyName)) HasCollectionKey = True Exit Function ErrCatch: If err.Number <> 5 Then
err.Raise err.Number, err.Source, err.Description, _ err.HelpFile,err.HelpContext Exit Function End If HasCollectionKey = False End Function
キーの存在チェック
Private Function HasCollectionKey(ByRef cll As Collection, _ ByVal keyName As String) As Boolean
On Error GoTo ErrCatch Dim lRet As Long
lRet = VarType(cll.Item(keyName)) HasCollectionKey = True Exit Function ErrCatch: If err.Number <> 5 Then
err.Raise err.Number, err.Source, err.Description, _ err.HelpFile,err.HelpContext Exit Function End If HasCollectionKey = False End Function
キーの存在チェック
Public Sub TestHasCollectionKey() Dim cll As New Collection
' キーのチェック
Call cll.add("アカギ", "倍プッシュ")
Debug.Print "Trueのはず;" & HasCollectionKey(cll, "倍プッ シュ")
Debug.Print "Falseのはず;" & HasCollectionKey(cll, "最強")
' オブジェクトも検索可能
Call cll.add(Sheet1, "シート1")
Debug.Print "Trueのはず;" & HasCollectionKey(cll, "シート1 ")
Debug.Print "Falseのはず;" & HasCollectionKey(cll, "シート2 ")
Set cll = Nothing End Sub