VBAでも配列が使えますが、今一つ使いにくいです。配列関係の関数が少ないからでしょうか。
そこでVBAの配列について勉強を兼ねてJavaScriptの配列関連メソッドと同様の処理をするユーザー定義関数を考えてみました。
変数 a, b, c は配列です。
変数 x, y は数値です。
エラー処理は全く考慮していません。配列の宣言も省略しています。Excel2007で確認しました。
Function shift(a)
'最初の要素を返す。/最初の要素が削除される。
ReDim b(UBound(a) - 1)
For i = 1 To UBound(a)
b(i - 1) = a(i)
Next i
shift = a(0)
a = b
End Function
Function pop(a)
'最後の要素を返す。/最後の要素が削除される。
ReDim b(UBound(a) - 1)
For i = 0 To UBound(a) - 1
b(i) = a(i)
Next i
pop = a(UBound(a))
a = b
End Function
Function unshift(a, ParamArray element())
'挿入後の配列の長さを返す。/先頭に要素が挿入される。
ReDim b(UBound(a) + UBound(element) + 1)
For i = 0 To UBound(element)
b(i) = element(i)
Next i
For i = 0 To UBound(a)
b(i + UBound(element) + 1) = a(i)
Next i
a = b
unshift = UBound(a) + UBound(element)
End Function
Function push(a, ParamArray element())
'挿入後の配列の長さを返す。/最後に要素が挿入される。
ReDim b(UBound(a) + UBound(element) + 1)
For i = 0 To UBound(a)
b(i) = a(i)
Next i
For i = 0 To UBound(element)
b(i + UBound(a) + 1) = element(i)
Next i
a = b
push = UBound(a) + UBound(element)
End Function
Function slice(a, x, Optional y)
'0から数えてx番目からy-1番目までの要素を配列として返す。yを省略すると最後までを返す。/なし。
If IsMissing(y) Then
y = UBound(a) + 1
End If
ReDim b(y - i)
For i = 0 To y - x - 1
b(i) = a(i + x)
Next i
slice = b
End Function
Function splice(a, x, y)
'0から数えてx番目からy個の要素を配列として返す。/該当する要素が削除される。
ReDim b(y - 1)
ReDim c(UBound(a) - y)
For i = 0 To y - 1
b(i) = a(i + x)
Next i
j = 0
For i = 0 To UBound(a)
If i < x Or x + y <= i Then
c(j) = a(i)
j = j + 1
End If
Next i
a = c
splice = b
End Function
Function concat(a, b)
'aの後に配列を追加し、追加後の配列を返す。/なし。
ReDim c(UBound(a) + UBound(b) + 1)
For i = 0 To UBound(a)
c(i) = a(i)
Next i
For i = 0 To UBound(b)
c(i + UBound(a) + 1) = b(i)
Next i
concat = c
End Function
'最初の要素を返す。/最初の要素が削除される。
ReDim b(UBound(a) - 1)
For i = 1 To UBound(a)
b(i - 1) = a(i)
Next i
shift = a(0)
a = b
End Function
Function pop(a)
'最後の要素を返す。/最後の要素が削除される。
ReDim b(UBound(a) - 1)
For i = 0 To UBound(a) - 1
b(i) = a(i)
Next i
pop = a(UBound(a))
a = b
End Function
Function unshift(a, ParamArray element())
'挿入後の配列の長さを返す。/先頭に要素が挿入される。
ReDim b(UBound(a) + UBound(element) + 1)
For i = 0 To UBound(element)
b(i) = element(i)
Next i
For i = 0 To UBound(a)
b(i + UBound(element) + 1) = a(i)
Next i
a = b
unshift = UBound(a) + UBound(element)
End Function
Function push(a, ParamArray element())
'挿入後の配列の長さを返す。/最後に要素が挿入される。
ReDim b(UBound(a) + UBound(element) + 1)
For i = 0 To UBound(a)
b(i) = a(i)
Next i
For i = 0 To UBound(element)
b(i + UBound(a) + 1) = element(i)
Next i
a = b
push = UBound(a) + UBound(element)
End Function
Function slice(a, x, Optional y)
'0から数えてx番目からy-1番目までの要素を配列として返す。yを省略すると最後までを返す。/なし。
If IsMissing(y) Then
y = UBound(a) + 1
End If
ReDim b(y - i)
For i = 0 To y - x - 1
b(i) = a(i + x)
Next i
slice = b
End Function
Function splice(a, x, y)
'0から数えてx番目からy個の要素を配列として返す。/該当する要素が削除される。
ReDim b(y - 1)
ReDim c(UBound(a) - y)
For i = 0 To y - 1
b(i) = a(i + x)
Next i
j = 0
For i = 0 To UBound(a)
If i < x Or x + y <= i Then
c(j) = a(i)
j = j + 1
End If
Next i
a = c
splice = b
End Function
Function concat(a, b)
'aの後に配列を追加し、追加後の配列を返す。/なし。
ReDim c(UBound(a) + UBound(b) + 1)
For i = 0 To UBound(a)
c(i) = a(i)
Next i
For i = 0 To UBound(b)
c(i + UBound(a) + 1) = b(i)
Next i
concat = c
End Function
コメント