配列をセルに書き込む時、途中に空白行が欲しい場合
前々回の記事で、創成図をエクセルのグラフで描画するためにデータとデータの間に空白行を入れたXY座標のデータを作成する必要があるとお話ししました。
結論からお話しすると、この空白行を入れたデータを格納する配列の型はVariant型を指定する必要があります。
今回はVariant型を使う必要がある理由を、サンプルのグラフを作成しながら説明したいと思います。
サンプルのグラフ
今回は下の図のように、円周上に半径50から半径70の長さの線分を10度毎に配置したグラフを描くためのデータをVBAで作成してみます。
失敗事例
サンプルコード
以下のサンプルコードでデータを作成してグラフを描画してみます。
Sub test() Const pi = 3.14159265358979 '円周率 Const div = 10 '角度の分割(度) Const nRepeat = 35 'データの点数 Const startR = 50 '線分の始点径 Const endR = 70 '線分の終点径 Dim i As Long Dim theta As Double '角度(度) Dim rtheta As Double '角度(rad) Dim circularLine(3 * nRepeat + 1, 1) As Double For i = 0 To nRepeat theta = div * i rtheta = theta * pi / 180 circularLine(3 * i, 0) = startR * Cos(rtheta) '線分の始点X座標 circularLine(3 * i, 1) = startR * Sin(rtheta) '線分の始点Y座標 circularLine(3 * i + 1, 0) = endR * Cos(rtheta) '線分の終点X座標 circularLine(3 * i + 1, 1) = endR * Sin(rtheta) '線分の終点Y座標 Next With Sheet1 .Range(.Cells(2, 2), .Cells(3 * nRepeat + 3, 3)) = circularLine End With End Sub
For~Nextのループ内で、配列 "circularLine" の(3*i)行 と (3*i+1)行 には値を代入していますが、(3*i+2)行には値を代入しておらず、ここを空白行にしたいと考えています。
実行結果
このコードの実行結果は下の図のようになります。
上図の4行目、7行目、10行目、・・・の3行おきの行は配列に値を代入していないにもかかわらず、.Range(.Cells(2, 2), .Cells(3 * nRepeat + 3, 3))で配列全体を書き込むと、空白行にしたい部分に "0" の値が代入されています。
これにより、グラフも全てが繋がってしまい、想定した形状の描画が出来ていません。
原因と対応方法
値をセルに書き込む前に配列 "circularLine()” の中に、どのような値が入っているか、VBEのローカルウィンドウでチェックしたのが下図になります。
ここで既に、値を代入していない部分の値が "0" になっています。
これは、実は以下の行で配列が宣言された時点で "0" の値が入ってしまいます。
Dim circularLine(3 * nRepeat + 1, 1) As Double
下表にVBAに関するデータ型の一覧を示しており、配列を宣言した時点で最初から配列に入っている値を、”未初期化状態の値"に記載しています
創成図等を描く時の座標のデータ型は通常は数値型から選びますが、数値型を選んでしまうと配列に空欄を入れることが出来なくなります。
表の中で、空欄を扱えるのは文字列型とバリアント型となります。
文字列型を選んでしまうと、セルに書き込まれた値は一見問題なさそうに見えますが、グラフを描画させようとすると、数値ではないので正しく描画されません。
よって、配列をセルに書き込む時、途中に空白行が欲しい場合の配列のデータ型はバリアント型が正解なのです。
Dim circularLine(3 * nRepeat + 1, 1) As Variant
バリアント型を使用すると正しく描画することが出来ました!
次回
次回の記事は、今回使用したコードを改良して、配列数が事前に分からない場合の2次元配列の扱い方について説明したいと思います
⇒次回記事、2次元配列での要素数の調整(ReDim)についてへ