Microsoft MVP for Wordの新田順也さんが、「Wordマクロつくる実践会」を明日2013年7月13日(土)に開催されます。
私は、Excelマクロの入門者向けの、座学的な講座を何度も開催させていただく中で、座学的な場ではなく、ワークショップ的な場を設けることの必要性を感じています。
マクロを作る(作らなければならない)強いモチベーションがある場合、座学のあと自力でもマクロを作成するフェーズに入れるのですが、それほど強いモチベーションがない場合には、基本的な文法を学んでからマクロを作るフェーズに入るには障壁があると感じています。
その障壁を突破するためには、自分の手を動かして簡単なマクロを作る機会が大切だと考えており、ワークショップ的な場を設けることの必要性を実感しています。
この意味で、新田さんの「Wordマクロつくる実践会」にはとても興味を覚え、私も一受講性として参加させていただきます。
この会では、事前にいくつかの課題が出されていて、課題に取り組むのに参考となる新田さんの作ったWordマクロが紹介されています。
課題に向き合う中で、新田さんのマクロを読んでいると、自分自身がこういうところに戸惑うのだな、という発見があったので、まとめておきます。
同じロジックで、マクロ初心者の方を対象にして3種類のコードが掲載されていますが、私は、以下の二つ目のマクロが一番理解しやすいと感じました。
Sub 貼り付け時に半角2()ロジックはまったく同じですが、私の場合このマクロを、以下のように書いておくほうが理解しやすいと感じました。Dim SS As Long
With Selection
SS = .Start
.PasteAndFormat (wdPasteDefault)
.SetRange Start:=SS, End:=Selection.End
.Range.CharacterWidth = wdWidthHalfWidth
.Collapse Direction:=wdCollapseEnd
End With
End Sub
Dim pos_paste As Long
With Selection
''貼り付けるカーソルの位置を変数に格納
pos_paste = .Start
.PasteAndFormat wdFormatPlainText
''PasteメソッドでもOKだと思われるが
''新田さんのコードと比較のためPasteAndFormatを利用
''Selectionオブジェクトを貼り付けた文字列に変更
.SetRange _
Start:=pos_paste, _
End:=.End
''Start:=.Startとすると上手く動作しない
''事前に変数に格納した貼り付け位置を利用すること
.Range.CharacterWidth = wdWidthHalfWidth
.Collapse wdCollapseEnd
End WithEnd Sub
新田さんのマクロを見たとき、最初に気になったのは、文字列を貼り付けたあとのSelection.SetRangeメソッドでした。
SS = .StartこういったWordマクロに慣れていない私は、引数Startの部分に変数を使わないで、
.PasteAndFormat (wdPasteDefault)
.SetRange Start:=SS, End:=Selection.End
.SetRange Start:=Selection.Start, End:=Selection.End
でもいいのではないのか、と感じてしまいました。
試してみるとすぐわかることですが、変数に事前にスタート位置を格納しておかないと上手く動きません。
こういったWordマクロをよく作っている方の場合、この動きは身についているのでしょうが、私の場合は要注意ということでこういう箇所にはコメント必須だと感じました。
このマクロに限らず新田さんはカーソルのスタート位置を格納しておくときにSSという名前の変数をよく使ってらっしゃるようですが、こういうタイプのWordマクロをあまり作っていない私は、SSだと何の変数だったのかよくわからなくなってしまうので、pos_pasteという貼り付ける場所ということが推測しやすい名前にしました。
今回の課題に取り組む中で、Wordのマクロ記録機能は、文法的に正しくないコードを作ってしまうことがあることを認識しました。
例えば、貼り付け操作をWordでマクロ記録すると、
Selection.PasteAndFormat (wdPasteDefault)
というコードが作られます。
PasteAndFormatメソッドの引数wdPasteDefaultが括弧で括られていますが、ここではオブジェクトを変数に格納したり、同じ行ですぐに利用したりしているわけではないので、括弧で括らないほうがオブジェクト式の文法的には正解です。
マクロ初心者の場合、こういう括弧のある・なしが混乱の元になるので、新田さんはマクロ記録機能で作られるコードをそのまま利用してらっしゃいますが、VBAの文法に慣れてしまうと、こういうところが思考を阻害するので文法的に正しい括弧なしにして、またデフォルトの貼り付けwdPasteDefaultだと、何がおきるかよくわからなくて気持ち悪いので文字列だけの貼り付けwdFormatPlainTextにして、
.PasteAndFormat wdFormatPlainText
としました。
ただし、Wordマクロ特有の動きがあってwdPasteDefaultのほうが無難なのかもしれませんので、つくる実践会での新田さんの解説を楽しみにしています。
また、ここまでマクロ記録機能のコードを修正してしまうのであれば、そもそもSelection.PasetAndFormatメソッドではなく、Selection.Pasteメソッドを使うほうがシンプルでいいかもしれません。
最後の選択を解除する、
.Collapse Direction:=wdCollapseEndの部分は、Selectionオブジェクトを使ったときの定番処理ですが、Selection.Collapseメソッドの引数は一つだけで、メソッド名と定数wdCollapseEndから、引数の意味も推測可能なので、名前付き引数ではなくてもいいかなと感じ、私は
.Collapse wdCollapseEnd
としました。
つくる実践会には、さまざまなスキルの方が参加されるようで、とても楽しみにしています!
Home » ワードマクロ・Word VBAの使い方 » Selection » 貼り付け時に半角にするマクロ-Wordマクロつくる実践会に向けて