ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ホーム > コミュニティ > サークル、ゼミ > プログラム研究会 > トピック一覧 > Excel VBA高速ブログラ...

プログラム研究会コミュのExcel VBA高速ブログラムノウハウ

  • mixiチェック
  • このエントリーをはてなブックマークに追加

コミュ内全体

コメント(6)

1.セルの高速読み書き

セルの値を1セルずつ、Cells(y,x).Valueでy,xをループで変えて読み出すと非常に遅い。
配列変数に一括で読み出してから、その配列変数をループで読み出すと一瞬で済む。
VBAの変数を宣言するときの注意

ループカウンタ用にLong型変数iを以下のように宣言
dim i As Long

ここにもう一つ整数型の変数jを追加したい時、他の言語の記法から類推して書くと
dim i,j As Long

と書くが、実はこれは意味が違う。
すぐにエラーにならないので気付きにくいが、
dim i As Long
dim j As Variant

と宣言したのと等価で、例えば引数に厳密にLong型を要求する関数にjを渡すと、型が違うというエラーになる。正しくjも宣言するには分けて
dim i As Long
dim j As Long

とやるしかない。
VBAの数値型変数の選択で注意

他のブログラム言語になれた人は、整数型のループ変数などと言ったら、integer型を選択してしまいがちだが、VBAのintger型は時代遅れな16bit長、表現可能範囲は僅か-32768〜32767。業務用ブログラムで3万行を超えるcsvファイルを読みこんだり、3万行のセルを読むことは全く当たり前にあるので、全く使い物にならない。integerは何か必要がある時以外は使わず、32bit長のLongに統一するのが良い。
(但し、業務プログラムで大きな金額を扱う場合Longでも入り切らない場合がある。その場合はより大きいCurrenvy型を使う必要がある。)
入力規則を設定すると、セルをクリックして入力するデータの型や値域、最大文字列長を制限できるが、メモ帳などに一旦自由に入力した内容をペースされると入ってしまう。入ったあとチェックや加工はワークシートのworksheet_changeイベントハンドラで処理できるが、上手くフラグ管理してロジックでデータを大量表示する時はハンドラ処理をカットしないと重くなる。
excelに組み込んである起動時実行されるマクロを動かさずにブックを開くには、シフトキーを押しながらダブルクリックすればいい。しかしながら必ずしも上手く無効化出来ず、例えばworksheet_openで前回表示していた大量のデータを消すロジックがあって、他方、そのシートのworksheet_changeでセルの変更をチェックする重い処理があったりすると、起動した途端、無応答になり、もうその版は捨てるしかなくなることも有る。なのでこまめに版管理のバックアップを取ることが必要。
モードレスダイアログを最前面に表示し続けるためにexcelの標準機能だけでは実現できず、win32apiを呼ぶ必要がある。一つはフォームの右上の閉じるボタンのバツマークを消すもの、もう一つはフォームに最前列表示の属性をつけるもの。その他、apiでなくていいがフラグ管理して、そのダイアログ表示中にキャンセルキーを受け付ける仕組みや、逆にセルやボタンなどのイベントは普通に走るので何もせず抜けさせるための関数などがいる。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

プログラム研究会 更新情報

プログラム研究会のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング

mixiチケット決済