「だるころ」(だぁ~るまさんがこぉ~ろんだ♪)

「だるころ治療院」を開設しようと思って、はてなブログを作りました。 http://yasuo9216.web.fc2.com/

VBA配列

 


 

 



 

 

VBA配列

配列を自分なりに説明してみる。
 
配列を自分なりに説明してみようと思います。
あくまで、僕のイメージです。想像しないと配列は作れません!
だって、存在しない0列0行に架空のゼロを想像する感じなんですから.....。
 
ちょっと想像力が必要になります。
簡単にA列(単価)とB列(数量)を掛け算するだけの表にしますね。
 
 

 

 

f:id:darucoro9216kun:20200324135643p:plain



 
配列で計算できるかどうかやってみます。
’===================================’
Sub Hiretsu()
    Dim i As Long, Table As Variant, n As Long
        n = Cells(Rows.Count, 1).End(xlUp).Row
   
    ReDim Table(n - 2, 0)
   
    For i = 2 To n
   
        Table(i - 2, 0) = Cells(i, 1) * Cells(i, 2)
   
   
    Next i
   
    Range("B2",Cells(Rows.Count,2).End(xlUp)).Offset(0, 1) = Table
    

End Sub
’===================================’
一つ一つ計算してC列(合計)に記入するとすごく時間が掛かります。
配列を使わず、F8で一つ一つ記述させるVBAを作って確認してみると
よくわかると思います。
 
配列を作るとき、僕は「架空の0(ZERO)」と勝手に呼んでます。
配列は0からスタートなので気をつけなくちゃです。
架空の0と先頭行を含めると-2になります。
「Tableに一度格納すると早くなる」この言葉に騙されてはいけません!
Tableに格納するだけじゃ処理は早くなりません。
僕は言葉を信じてTableって変数で、せっせとセル範囲を格納してました(無念)
そしてある時、気づかされました。格納するだけじゃ何の意味もない!!
 
格納したものを最後にお届けしないとダメなんです!
上記の場合A列単価*B列数量→Cells(i,1)*Cells(i,2)をTableに格納
 
Next iの後(その後)
B列の一つ隣→.Offset(0,1)にして格納したものを届けます!
 
一つ一つ計算して記述すると遅くなるので、計算はさせるけど記述はすべての計算が終わってから→「一回で一塊に記述する!」って感じです。
 
 
想像がし難い場合はこんなことも出来ます!
 '====================================================='
sub hairetsu2()
    Dim i As Long
    Dim Table1 As Variant
    Dim Table2 As Variant
   
    Table1 = Range("A2:B10000")     'A1からにしたらインデックス範囲から外れます。
   
    ReDim Table2(1 To 10000, 1 To 1)    '二次元配列で記載
   
For i = LBound(Table1, 1) To UBound(Table1, 1)
   
       
        Table2(i, 1) = Table1(i, 1) * Table1(i, 2)
   
   
    Next i
    Range("C2:C10000") = Table2
End Sub
'=====================================================' 
あまりやりたくないですが、格納したいセル範囲をすべてTable1に入れる。
Table2も作って、予め0は使わない様にReDimで予約
スタートの範囲(LBound)は分かってますが、LBound  to UBoundにしてます。
範囲が分かってるのに分かってない振りをして、最後に格納するんです。
 
「後だしじゃんけん」みたいでオススメでは無いですが、配列っぽく出来ます。
でも、似たようなことを何度も継続して行ってました。
 
VBAをスポーツとして楽しんでいますので、自分なりに理解したことをちょっとご紹介しました。
もっとこうした方がいいよ!ってのは有ると思います。それに、こんな簡単な記述なら
VBAにしなくても、ワークシート上で可能です。

 C列に→{=A2:A100000B2:B100000}

最後までお付き合いいただきありがとうございました。
今後とも暖かく見守ってください・。

友だち追加