皆様いかがお過ごしでしょうか?僕はイカが釣れません。
で、
今日は、
じゃなくて、EXCELマクロを書く時にハマりがちな「Me」の取り扱いについてです。
これ。
「Me」英語で「私」。
プログラムをやっている人にはMeだのThisだのSelfだのでお馴染みだと思うのですが、
VBAで自動記録マクロから入るとあまり使う機会はありません。
あまり馴染みが無い割に、ちょっと込み入ったマクロを書こうとするととても大事な概念なのです。
「Me」とは、自分自身を示す修飾語です。
画像の例でいくと、Sheet1モジュールに対しての「Me(私)」ですから、Sheet1そのものを示します。
要するに、WorksheetObjectです。
ということは、標準モジュールでこうやって書くのと一緒です。
Sub selectSheet1A1() ThisWorkbook.Worksheets("Sheet1").Range("A1").Select End Sub
同様に、ThisWorkBookモジュールでMeであればそれは自身のWorkBookオブジェクトを示します。
なんでコレが大事なのよ?当たり前じゃないよ?と思われるかも知れません。
下は、自動保存したマクロです。
Sub Macro1() ' ' Macro1 Macro ' ' ActiveCell.FormulaR1C1 = "1" Range("B4").Select ActiveCell.FormulaR1C1 = "2" Range("B5").Select ActiveCell.FormulaR1C1 = "3" Range("B6").Select ActiveCell.FormulaR1C1 = "4" Range("B7").Select ActiveCell.FormulaR1C1 = "5" Range("B3").Select Range(Selection, Selection.End(xlDown)).Select Range("B3:B8").Select Range("B8").Activate ActiveCell.FormulaR1C1 = "=SUM(R[-5]C:R[-1]C)" Range("B3:B8").Select End Sub自動保存だけに要らんコードが満載・・・
マクロの内容は、B2~B7に1,2,3,4,5と入れて、B8でSUMしています。結果15ですよ的な。
Range("B4").Select ActiveCell.FormulaR1C1 = "2"
これで、B4を選んで、アクティブなB4に2って入れろという記述がしてありますが、
Rangeの頭には何もついていません。
実は、「ActiveWorkbook.ActiveSheet.」が省略されているのです。
これの何が恐ろしいかって、
例えば1行目から100行目までぐ~るぐ~る回しながら各列のセルを更新するような時間の掛かる処理を流している最中に、
「あ、時間かかるから別の作業しよう」
なんて別のワークシートをアクティブにした途端、
「ActiveWorkbook.ActiveSheet.」は切り替えた後のシートが対象となります。
そして、恐ろしいことにマクロでの実行結果はUNDO(Ctrl+Z)が効きません。
結果として、元のシートでは期待した結果が得られず、切り替えたシートでは最悪マクロによりデータが書き換えられてしまうのです・・・
そこで、「誰」に対してその処理を行うのか?を意識する事が大切なのです。
「Me」は自分自身に処理をしますよ、という修飾語です。
別のシートに対して処理をするのであれば、そのシートですよ!という修飾語が必要です。
Sub selectSheet1A1() ThisWorkbook.Worksheets("Sheet2").Range("A1").Select End Subこんな。
「ThisWorkBook」を他のブックで指定すれば、別のブックを操作する事も可能です。
ちょっと込み入ったマクロを作る時は、意識してみて下さいね。
じゃ、イカ釣り行ってきます。
0 件のコメント:
コメントを投稿