Excelの列とVBA配列の相互変換

Micro$oft世代な僕らは、当然Excelでプログラムを書く機会が多かったりする。そんな時、
Excelワークシートの列を、まるごと配列としてVBAで処理したい
あるいは逆に、
VBAの配列を、丸ごとワークシートの列に出力したい
と思う事が少なくない。
そこで、VBAで相互変換する関数を作ってみた。列をdouble型の配列に格納する関数と、配列を列として返す関数。

Function Col2Arr(Col As Range) As Double()
 
Dim ret() As Double
Dim r As Long
Dim i As Long
 
r = Col.Rows.Count - 1
ReDim ret(r) As Double
 
For i = 0 To r
ret(i) = Col.Cells(i + 1, 1)
Next
 
Col2Arr = ret()
End Function
 
Function Arr2Col(Arr() As Double) As Variant
 
Dim ret() As Double
Dim i As Long
ReDim ret(UBound(Arr()), 0) As Double
 
For i = 0 To UBound(Arr())
ret(i, 0) = Arr(i)
Next
 
Arr2Col = ret
End Function

使うときはこんな感じ。

Function mul2(data As Range) As Variant
 
Dim ret() As Double
Dim i As Long
 
'ワークシート列を配列に変換
ret() = Col2Arr(data)
 
'全要素を2倍
For i = 0 To UBound(ret())
ret(i) = ret(i) * 2
Next
 
'配列をワークシート列に変換して返す
mul2 = Arr2Col(ret())
End Function

ワークシートでA1からA10に適当に数字を書いて、B1:B10範囲を選択して
=mul2(A1:A10)
と書いてCtrl+Shift+Enterを押すと、2倍になった列が作れる。ワークシート関数で間に合わない処理をするときや、セル1つずつで計算するとめっちゃ重くなるときに便利、だと思う。
↑のときはExcel使うなよ!とは言えない状況は多々ある。。


コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>