とあるプログラマーの覚書

Visual Basic .NET編:ExcelオートメーションやVBAで、二次元配列を使って値を設定する方法について

スポンサーリンク

先日、「Visual Basic .NET編:Excelオートメーションのパフォーマンスアップ方法」という記事を作成しました。

Excelオートメーションのパフォーマンスアップ方法という事で、手法の一つとして、1セルずつ値を設定するのではなく、二次元配列を使って値を設定するという方法を紹介しました。
その記事に掲載しているサンプルコードで言うと、「arr」という名前の変数です。

この二次元配列ですが、この前掲載していたサンプルコードでは、宣言部分を割愛させて頂いていました。
常識的な範囲だと思ったので。
ですが、宣言の仕方が原因で、とある現象にぶつかったので、今回の記事を書く事にしました。

私が前回のサンプルコードのようなコードを実際に実装に使ったとき、以下のように二次元配列を宣言しました。


‘以下の「counter」は、あらかじめ求めていた必要な要素数です
Dim arr(counter, 0) As String


上記のように、「String」型で宣言していました。
私が実装したExcel出力処理で出力したかったExcelは、人数とか点数等、数値(文字列ではなく)として扱われて欲しい情報も出力するExcelでした。

ですが、String型二次元配列をExcelのRangeオブジェクトのValueに設定した後、Excelを開くと、数値が出力されているセルに警告が出てしまいました。(Excelをよく使う方ならわかると思いますが、セル左上に緑色の小さいマークが表示される状態です。)
それで、警告の内容を見てみると、「このセルにある数値が、テキスト形式か、またはアポストロフィで始まっています。」「数値が文字列として保存されています。」のようなメッセージが表示されていました。

このプログラム作者であれば、別にこの状態でも、警告が出ている事情がわかるので困りませんが、このプログラムを使うユーザからすると、何か気持ち悪いと思われるという事が懸念されます。
さらに、「文字列」として設定されている以上、Excelの計算式(SUMとか)も使えません。

かと言って、パフォーマンスを考えると、二次元配列で設定する手法を捨てるわけもいかず、さらに後で数値のセルだけ書式設定をプログラム側で設定しなおすというのも面倒です。(厳密に言うと、セルの書式設定を変えるだけではNG。実際に書き込まれた値が文字列型というのが問題なので。)

ここで私が取った手法は、Excelに設定する二次元配列の宣言方法を見直しました。文字列型だけが入るわけではない、という事で、どんな型でも許容できる二次元配列にしてやればいいと思い、以下のような宣言に変えました。


Dim arr(counter, 0) As Object


「String」型ではなく、「Object」型とする事で、今回の問題は解決しました。
型をObjectとする事で、二次元配列処理内部としては、やや処理速度は落ちてしまうかもしれませんが、感覚としては大きくパフォーマンスダウンはしない感じでした。

Excelオートメーションの設定処理を細かくするよりは、明らかによいと思いました。

今回は以上です。この情報がどれだけ需要があるかは謎ですが(笑)


スポンサーリンク

URL :
TRACKBACK URL :

Leave a Reply

*
* (公開されません)

*

*

Return Top