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

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

Excel2013のVBA(マクロ)は遅い  

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 で自動に戻します。
   自動に戻しておかないと、データを変えても計算結果が変わらないということになりますよ(昔はまりました)

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

関連記事

Posted on 2015/09/05 Sat. 20:44 [edit]

category: excel

tb: 0   cm: 0

コメント

コメントの投稿

Secret

トラックバック

トラックバックURL
→http://yhashii.blog.fc2.com/tb.php/678-9de4ce36
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

最新記事

最新コメント

FC2ブログランキング

月別アーカイブ

カテゴリ

カウンター

ユーザータグ

メールフォーム

最新トラックバック

リンク

検索フォーム

RSSリンクの表示

ブロとも申請フォーム

QRコード


▲Page top