FC2ブログ

はっしーのデジタルワーク

コンピュータ利用からデジタルに関わる様々なことを書き記します。

Excel2013のVBA(マクロ)は遅い

Posted by はしかわ on   0  0

Microsoft EXCELが多くの方に使われる理由の一つに、VBA(Visual Basic Application:マクロもこれに含まれると考えて良いです)があります。

例えば、
・ エクセルの中にフォームを作ってセルへのデータ入力を簡単にする。
・ ユーザーのある操作をイベントとして、プログラムを実行させる。
なんてことができるのですが、これを作るには、それなりにプログラミングの知識が必要です。

また、以前からマクロウイルスなんて厄介なものまで登場しています。
最近の標的型ウイルスで添付文書に仕掛けられていたのも、このマクロウイルスです。
当然気をつけて作って、また、利用しなければなりません。
最近、また猛威を振るっているとIBMが警告しています。

ところで、今日の話題ですが、これまで、Excelの2007や2010では、快適に動いていたものが、
Excel2013で利用すると、めっちゃ遅くなってしまった。こんな、話がネット上を賑わして(私の興味の中だけですが)おり、
そして私も巻き込まれてしまった。

私の場合は、なんとか解決できたので以下の「続きに」に記録しておきます。




根本的な原因は明らかではないのですが、

アメリカや日本での検証例、解決法作から想像すると、
「Excel 2013からセキュリティ強化のために、シートの保護・解除のための処理が遅くなってしまった模様」
とのことです。

今回のような場合の解決策ですが、私の場合、
・ コピー元とコピー先のセルを一つづつ指定して実行していた処理
   例えば、
Cells(1, 10).Value Copy
     Cells(5, 10).Paste
これは、非常に簡単な例ですが、1行目の10列目のセルのデータを5行目の10列目のセルにコピーするという命令です。
・ このような処理をまとめて沢山同時に実行する場合は、書き込み処理(ペースト)の回数を可能な限り減らして一度に実行する
 なるべく、範囲を指定してコピペする Range(A1:D1)のように範囲を示すRangeオブジェクトを使ってコピペします。
※ 先人の例では、例えばコピーした行をあるところに挿入したい場合
 ・ 行をコピーして、挿入貼り付けは行わない
 ・ 先に空の行を挿入し、その後にRangeオブジェクトを使ってコピペしましょうと言っています。
  (この方法は、検証していませんが有効と思われます)

最後に、Excelのバージョンに関係なく、VBAやマクロの実行を早くする方法を示します。
まとまったデータ処理を行う場合は、
⑴ 画面の更新処理をいったん停止する
   スタート前に、Application.ScreenUpdating = False として画面の更新処理を止めます。
   実行処理が終わった段階で、
          Application.ScreenUpdating = True で戻すと、実行結果が表示されています。
⑵ 計算処理を自動からいったん手動にしておく
   スタート前に、Application.Calculation = xlCalculationManual で手動にしておき
   実行処理が終わったら
          Application.Calculation = xlCalculationAutomatic で自動に戻します。
   自動に戻しておかないと、データを変えても計算結果が変わらないということになりますよ(昔はまりました)

だいたいの場合、これで劇的に早くなるはずです。

関連記事
はしかわ

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation.

Leave a reply






管理者にだけ表示を許可する

Trackbacks

trackbackURL:http://yhashii.blog.fc2.com/tb.php/678-9de4ce36
該当の記事は見つかりませんでした。