2012年10月26日金曜日

【VBA】Meってなんだ

今月2本目のUP、良いペースです。 おはよう御座います。部長です。
 皆様いかがお過ごしでしょうか?僕はイカが釣れません。






 で、

 今日は、アオリイカ用の新しいエギを25本買ったのでそのレビュー
じゃなくて、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 件のコメント:

コメントを投稿

とある規格化されたコード

世の中こんなもんまで規格化されていますよ、というお話 https://ja.wikipedia.org/wiki/ISO_5218 この辺が大変良くできた、ためになる(?)解説記事です。(長い https://qiita.com/aoshirobo/items/32deb...