配列を使った応用

下のような感じで,セルに○が入っていると,します。未記入欄に・を記入するマクロを考えてみましょう。
※ここでは,速度計測結果を載せているので,変数の宣言をInteger型のままにしてあります。

 左は,ワークシートの一部しかでてませんが,
実際は,100行×100列で,ランダムに○が記入されています。
Sub 一個ずつ()

  Dim R As Integer
  Dim C As Integer

  For R = 1 To 100
    For C = 1 To 100
      If Cells(R, C) = "" Then Cells(R, C) = "・"  ←@
    Next C
  Next R

End Sub
いわゆる,普通のやり方です。

@で,「セルの値が空なら,・を書き込む」 という処理をしています。
Sub 配列で()

  Dim R As Integer
  Dim C As Integer
  Dim tmp As Variant

  tmp = Range(Cells(1, 1), Cells(100, 100)) ←@

  For R = 1 To 100
    For C = 1 To 100
      If tmp(R, C) = "" Then tmp(R, C) = "・" ←A
    Next C
  Next R

  Range(Cells(1, 1), Cells(100, 100)) = tmp ←B

End Sub
配列を使ったやり方です。
配列を使うには,少し工夫が必要になります。

考え方としては,扱う範囲のデータをまず配列に格納し,変数上で処理を行った後,ワークシートに1回で書き込みます。


@範囲のデータを配列に格納します。
A配列の中で,空ならば・を入れていきます。
B最後に,1回でセルに書き込みます。
 

これを10回繰り返して,平均を出したのが,以下の表です。
また,文字列を数値に置き換える,つまり,○を1に,・を0に置き換えて実行すると,速度が向上することも見逃せません。

一個ずつ 配列で 一個ずつ 配列で 【考察】


@ ○と・で実行した場合,配列にすると,17.6%の時間で処理できた。

A 1と0で実行した場合,配列にすると,5.9%の時間で処理できた。

B ○を1に,・を0に置き換えて実行した場合,「1つ1つで処理する方法」同士を比較すると,数値処理は文字処理のおよそ1/2の時間で処理できた。

C 同じように数値に置き換えて実行した場合,「配列で処理する方法」同士を比較すると,数値処理は文字処理のおよそ1/16の時間で処理できた。
1回目 0.90625 0.15625 0.390625 0.015625
2回目 0.88671875 0.15625 0.375 0.03125
3回目 0.890625 0.15625 0.38671875 0.01171875
4回目 0.890625 0.15625 0.375 0.03125
5回目 0.88671875 0.15234375 0.390625 0.03125
6回目 0.890625 0.15625 0.38671875 0.015625
7回目 0.90625 0.15625 0.390625 0.03125
8回目 0.88671875 0.171875 0.390625 0.015625
9回目 0.90234375 0.15625 0.37109375 0.02734375
10回目 0.88671875 0.15234375 0.390625 0.015625
平均 0.893359375 0.15703125 0.384765625 0.02265625
倍率 17.6% 5.9%
データ 文字 文字 数値 数値


≪番外編≫ 空セルだけにデータを入力


ここではいろいろな場合に応用できる方法として配列を使いましたが,空白セルにデータを書き込むことだけに限れば,Rangeオブジェクトの中のSpecialCellsメソッドを使う方法もあります。

Range("a1:cv100").SpecialCells(xlCellTypeBlanks).Value = "・"

この場合,気を付けないといけないのは,Rangeを使うことです。Cells(○,○)を使うとエラーになり,動作しません。



以下に,SpecialCellsメソッドの他の引数を紹介しておきます。(一部)

 定数  解説  定数  解説
 xlCellTypeAllFormatConditions  表示形式が設定されているセル  xlCellTypeFormulas  数式が含まれているセル
 xlCellTypeBlanks  空のセル  xlCellTypeSameFormatConditions  同じ表示形式が設定されているセル
 xlCellTypeComments  コメントが含まれているセル  xlCellTypeVisible  可視セル。フィルタなどで非表示になっていないセル。
 xlCellTypeConstants  定数が含まれているセル  xlCellTypeLastCell  使用されているセル範囲の最後のセル