参考書やネットで見かけるサンプルのマクロを目にした人は、それらが記録したマクロと比べると
ずいぶんすっきりしていることに気が付かれるかもしれません。
実は「マクロの記録」によって作成されたコードは多くの場合やりたいこと以外の余分な部分まで
記録しています。
また、記録したマクロではオウム返しの操作しかできない場合が多いので、「もっと融通の効くものに
できないだろうか」という欲も出てきます。
「すっきりした記述にしたい」
「マクロを融通の利くものに」
という希望をかなえるには記録したマクロを編集するしかありません。
いきなり「マクロを編集してみましょう」と言ってもマクロを使い始めたばかりの人にはなかなか
「おっかない」ものですが、編集のコツさえつかめばそれほど難しいものでもありません。
まずは記録したマクロを編集することから始めてみましょう。
実行するマクロに関連するブックはマクロの動作が確実になるまではコピーファイルを作成して
必ずバックアップするようにしましょう。
とくに内容を変更してから上書き保存するようなマクロは、最悪の場合、
もとのデータを復活できなるので、必ず復元できるような対策を採ってください。
記録したマクロを編集する前にまずステップイン機能を利用してどのコードがどんな動作を行っているか 自分の目で確認しておきましょう。 「こんな動作まで記録されちゃってるの?」って言う場合が結構あります。 とくに、操作を行うセルを探すために行ったスクロール操作も律儀に記録してくれますが、 スクロール操作は実行の段階では不要である場合が多いのです。 本当に必要なコードがどれなのかをあらかじめチェックしておきましょう。
▲PAGETOP
マクロの記録では、離れたセルを選択するためにウィンドウをスクロールさせても
その動作も記録してしまいます。
記録する際には必要な操作ですが、実際の作業ではセルが選択されれば済むことが多いので
無駄な動作の記録と言えます。
記録される動作はおおむね次のようなコードが記録されるはずです。
≪例≫スクロール操作の記録 |
---|
ActiveWindow.SmallScroll Down:=17 '方向キーで下方向へ17行スクロールしたとき。 ActiveWindow.LargeScroll Down:=1 'PageDownキーで画面を下方向へスクロールしたとき |
セルの範囲選択をしてそのセル範囲に対して何らかの操作を記録した場合、
セル範囲の選択の記述が多少くどい表現で記録されます。
≪例≫セル範囲"A1:A5"を選択して、コピーする |
---|
Range("A1:A5").Select Selection.Copy「Range("A1:A5")を選択する。選択したセル範囲(=Selection)をコピーする。」 という多少くどい表現になります。 Selectメソッドで取得した「Range("A1:A5")」というセル範囲と Copyメソッドの対象となる「Selection」はまったく同じセル範囲をあらわします。 そこで、マクロの記録で生成された「〜.Select Selection〜」と言う連続した2行のステートメントは 次のように修正しても同じ動作が期待できます。 |
≪修正例≫ |
Range("A1:A5").Copy「〜.Select Selection〜」の部分を省略して 「Range("A1:A5")をコピーする。」という簡潔な表現にすることができます。 |
マクロの記録でオプション設定の必要なコマンドを実行した場合には、
変更していないオプションの部分についても記録されてしまいます。
これが実は記録したマクロを見づらくしてしまう一因なのですが、デフォルト状態のオプションの設定は省略することができます。つまり、変更したい部分のみ残しておけばだいたいのコマンドは動きます。
≪例≫形式を選択して貼付けで「値」を選択した場合 |
---|
Range("B1").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False「PasteSpecial」が「形式を選択して貼り付け」の動作にあたるメソッドですが、 オプション設定は「貼り付け」の「値」しか変更していないのにその他の変更していないオプションも記録されてしまいます。例えば、後で見直したときにこのステートメントでどんな作業をしているのか、逆に読みづらくなってしまいます。 ヘルプなどで調べてみるとそれぞれのオプションの設定は「Paste:=xlValues」以外はデフォルト状態、つまり、まったく変更を加えてない状態なのがわかります。 |
≪修正例≫余計なオプション設定の部分を省略 |
Range("B1").Select Selection.PasteSpecial Paste:=xlValuesこのように不要なオプション設定の部分はごっそり省略することができます。 さらに、前項の「重複したオブジェクトの指定の省略」の部分を適用すれば次のようにさらにコンパクトにすることができます。 |
≪修正例≫重複したオブジェクトの指定の省略 |
Range("B1").PasteSpecial Paste:=xlValuesこのように3行もあったステートメントが1行でまったく同じ動作をするようになります。 |
マクロの記録でセル範囲のコピー(切り取り)、貼り付け作業を何回か繰り返していると、
次のようなステートメントが現れることが多いと思います。
≪例≫CutCopyModeプロパティの設定 |
---|
Application.CutCopyMode = Falseこれは何をしている動作かと言うと、クリップボードの情報をクリアしているコードなのです。 たとえば、セル範囲を選択した状態でコピー動作を行うと、コピーした選択範囲の外周が点滅破線になります。 これはそのセル範囲の情報が貼り付け可能な状態でクリップボードに存在していることを示しています。 |
Applicationオブジェクト | アプリケーションオブジェクト(エクセルプログラム)を表します。 |
---|---|
CutCopyModeプロパティ | アプリケーションの切り取り、コピー(した後のクリップボード)の状態(貼り付け可能な状態かどうか)を返します。 |
= False |
CutCopyModeプロパティにFalseを代入します。クリップボードはリセットされます。(点滅破線ではなくなります) 逆にTrueの場合は点滅破線の状態のままになり、クリップボードの情報は保持されます。 |
つまり、VBAで実行中のアプリケーションであるエクセルの状態を設定するステートメントです。 このステートメントが本当に必要かどうかと言うと、そうでもなくて、例えば貼り付け以外の動作を次に行えば自動的にCutCopyModeは内部的にFalseに設定されます。 何かシートやセルの内容を変更するコマンドを次に実行しているのであれば、このステートメントは削除してしまってもかまいません。 ただし、全て削除してしまうと
そのような場合だけ、このステートメントは必要なので Application.CutCopyMode = False上記コードをクリップボードの情報を終了したあとに挿入しておけば良いでしょう。 |
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||