Function‘まずはシート全体を2次元配列にするプログラムである。標準モジュールに下記Sheet2Arrayを記入する。“Sheet1”)‘使い方としてはメインフローのデータを読み込みたいところで↑のようにして使う。1行目で大きさ未定のDataBase配列(Variant型)を定義し、2行目でSheet2Array関数を呼び出してDataBase配列に値が入るようになっている。-これを使って2次元配列内をループさせてみる。処理内容のところにIF文や出力内容を入れれば必要なデータのみを抜き出すことが出来る。Nextを使ってインデックスループさせると処理速度が急激に遅くなるので注意しよう。“Sheet4”)ように呼び出す。これでSheet4にDataBase配列の内容が出力されているはずである。引数としては1つ目が出力する2次元配列、2つ目がブック名、3つ目がシート名である。-ちなみに2次元配列であればArray2Sheet関数でデバッグのようにSheetに出力できるのでプログラム作成中にも役立つはずだ。注意する点としては通常配列は(0,0)から始まるため、このままシートに出力すると余分な空白の1行、1列が出来てしまう。1000)と言う風に範囲を指定してやると良い。1000)という感じで範囲を指定して定義しよう。配列を使うと便利という記事を書いたが、もう少し踏み込んで紹介したいと思う。サンプルプログラムも載せていくので参考にしていただければと思う。筆者は趣味でプログラムを組むぐらいなので細かい間違いがあるかもしれない。そこは読み解きながら理解していただけるとありがたい。(御連絡いただければ修正します)まず、大量のデータ処理を行うにはメモリにデータを格納する必要がある。配列、コレクション、構造体などあるが、シンプルに配列を使うと処理速度も速く、プログラムもわかりやすくなるだろう。増やして使うことが出来る。ここではエクセルで使うことが多いであろう、2次元配列をメインで紹介していく。エクセルは表計算ソフトであるためセルを1つ1つのデータ格納領域とみることができ、非常に2次元配列に近いものがあるからだ。‘動的配列と、書くことが出来る。型」で書くのが基本だ。括弧の中は要素数で1次元配列で言うとData1(1)~Data(10)までの10個のデータを入れる箱ができる。同様にData2(1,1)~Data2(10,10)という2次元配列、Data3(1,1,1)~Data(10,10,10)という3次元配列が出来る。動的配列は要素数が未定のときに宣言するというものである。型は何でも入れれるようにバリアント型を今回は使用している。Variant」という書き方でもよいが、この場合、配列はData1(0)~Data1(10)の11個の要素ができてしまう。このゼロから始まるとループするときなどややこしくなるので、1から始まるように指定している。エクセルのセルは左上が1,1(A1)から始まっているので1から始まるようにしたほうが、処理していくにはわかりやすい。これを実際に配列を使って一連のことをやってみようと思う。エクセルとの親和性を生かすためにシートのデータを読み取って、シートに結果を出力すると言うものを作成する。始めに入力であるが、データをエクセルのセルから1つずつ読み取って配列に入れていては時間がかかる。これはエクセルのセルの操作が入るためで、できるだけセルやシートの操作をしないほうが高速なVBAプログラムを組むことができる。最初(入力)と最後(出力)のときだけセルを操作すると言うのがベストなプログラムの組み方である。途中の計算はすべてメモリ上で行うのが高速化のコツである。やって配列に入力するかというと、セルを範囲で選んで一気に2次元配列化するというのが一番速い。汎用的な操作なので2つの関数を作成する。シート全体を2次元配列に入れる関数である。モジュールなどに下記コードを入力する。Function次に指定した範囲を2次元配列化する関数である。こちらは関数化する必要はないくらい短いので、毎回書いても問題ないレベルだろう。“Sheet1”)と書くと、DataにSheet1のデータが2次元配列として格納される。Dataの大きさは不確定なので動的配列として宣言している。次にSheet2Arrayで先ほどの関数を呼び出して、引数にブック名、シート名を指定している。ThisWorkbook.nameはプログラムを走らせているブック名になる。他のブックを開いてそこから読み取る場合はこの引数を変更して対応可能である。この場合はSheet1のC列の4行目からC列の25行目までを2次元配列として読み込んでいる。1列しかないから1次元配列ではないかと思われるかもしれないが、Data(行数,1)の2次元配列になっている。これでループ等使わず、まとめて一気に2次元配列化できるので、ひとつずつセルを読み込む場合に比べて非常に高速化できると思う。この2つの関数があればシートにあるデータを比較的簡単に配列に入れることが出来ると思う。入力については以上である。配列を使っているときに不便だと思うのが、本当にデータの入っている要素数がどれだけあるかというのがわかりにくいところだ。コレクションであればAddされた数だけデータが入っているので要素数=データ数になっている。配列の場合は先に固定要素数(大きめに格納領域)を指定してからデータを入れていくので、どこまでがデータが入っていてどこからが空なのかわからないというのがある。そこで次元数と有効な要素数を取得する関数を作成した。取得と言う感じで使う。GetArrayInfo(調べたい配列、有効要素数を入れる配列)を実行すると次元数が戻り値になる。次元数が1次元であればAItem(1)に有効要素数が入っている。2次元であればAItem(1)に1次元目の有効要素数、AItem(2)に2次元目の有効要素数が入っている。今回は指定するData配列が1次元と2次元配列の場合のみ有効要素数と次元数を返すような関数にしている。これで配列が何次元なのか、有効な要素はいくつあるかを簡単に調べることができる。ループする前に有効要素数を求めておけばループする回数を少なく出来るので高速化する場合もあるだろう。最後にデータ処理した配列をシートに書き込む関数を作成する。本来であれば2次元配列しかシートに貼り付けできないが、今作成したGetArrayInfoの戻り値の次元数で1次元配列、2次元配列を判断し、シートにどちらでも書き込めるようにプログラムしている。“Sheet2”)のように呼び出す。Data配列をThisWorkBook.NameのSheet2に書き出している。これも読み込みと同様に範囲を一括で書き出しているので、セルを操作する方法に比べると高速だ。1次元配列、2次元配列を気軽にシートに書き出すことが出来るので最終データの書き出し以外にも計算途中の配列にどのような値が入っているかの確認、デバッグにも使うことができるだろう。ここまでの関数を使って簡単なメインプログラムを作ってみようと思う。Sheet1のA列,B列の数字を読み取って足した数字が1000を超えていれば出力するというプログラムである。条件式を変えれば必要な行のみの出力が可能である。基本的にこれがわかれば大体のデータ処理に対応できるだろう。“件が1000を超えました。Subこのプログラムを実行すると、Sheet1のデータを読み取ってSheet2に結果を書き出すという動作になる。↓↓excelvbaarraypra002A,B列は読み取った数字をそのまま出力、C列はAとBを足した値が入っている。(条件で1000を超えるものを出力としているで該当しない行は消えている)配列を理解して使うことが出来れば、高速で読みやすいプログラムになると思われる。他の言語ではコレクションや構造体でもよいかもしれないが、VBAに限っては配列を使うことをおすすめしたい。実践!エクセルVBAでクイックソートを使うを読んでいただけると大体のデータ処理が出来るようになるだろう。ブラウザだけでラーメンタイマーを作る(完成まで3分目安)pythonがインストールしてなくてもラーメンタイマーのプログラムが出来る。勝手に6800円課金されていました。同様の報告が山ほどあります。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。