English

Macro実行とイミディエイト記述

Visual Basic Application(VBA) のマクロプログラムは駆使すれば、ほとんどの難題が一挙解決する勝れものです。 しかし、これに取り組むには相当なハードルの高さや煩雑さがネックになります。 他人が作ったものを利用できれば簡便ですが、他人のなかには悪意を持つものもいます。 事実、悪意の第三者にとって、VBA ほど簡単な手段は他にありません。言い換えれば VBA はそれほど難しくないのです。

悪意のないmacroなら、敬遠する手はないです。積極的に利用したいものです。 「悪意がある」との見定め方を末尾に、思いつく順に随時追加記入していきます。 悪意がなくても、プログラムが稚拙なため「無限ループ」に陥ったり、通常なら「削除」など実行前に発せられる メッセージが出なくなったりして不本意な結果になったりすることもあります。

Macro の実行

マクロを含む Excel や Word の文書を有効にするには面倒な設定が必要です。設定をしなければ容易には実行できません。

そこで簡便に扱う方法を作成します。 Macroを使う場合は、Excel、Word とも共通で Alt + F11 で Visual Basic Editor ( VBE ) 画面に移り、「 挿入 」→ 「 標準モジュール 」 ()で編集画面が表示されます。 このウインドウは全画面でなく縮小しておくと文書画面を見ながら操作できるのでわかりやすいです。信頼できると判断したプロシージャ(プログラム)の書式の貼り付けをします。()

自己責任でOKと思えば、貼り付けたプロシージャ内にカーソルを置いて「 Macroの実行 」をクリックします()。 ステップごとに実行するには F8 キーをその都度押します。文書場面から実行するには Alt + F8 です。

プログラムが [ Sub  …  〜 End Sub ] まで記述されていたら問題ありませんが、プロシージャの内容だけの場合は、まず、sub とタイプし次に 適切な名前 ( 何でもよいが内容が分かるのがベター、仮に temp とします ) をタイプ入力して Enter を押すと自動的に [ Sub temp() … End Sub ] が作られるので、… の部分に貼り付けをします。複数のプロシージャを構成するモジュールなど Sub から始まっていない場合もあります。

関連ページ マクロ作成のヒント 数独の解法 タイ語等タイプ入力

下にイミディエイト欄がありますがここは、 プロシージャの記載内容を確かめるため一時的に Debug.Print で出力させる場所に使われます。実はここでは Print 3*5 ( または ?3*5 あるいは Debug.Print 3*5 … いずれも、3 × 5 の結果の出力要求 ) 等の簡単なベーシック*なデマンドを記載して結果を求めたり、次項のように簡易なマクロを実行する場所として利用出来ます。

*この ”ベーシック” という言葉は”根本的な” の意味で使用しています。 VBA の Basic とは本来 Beginner's All-purpose Symbolic Instruction Code のことで 1960年代に開発された プログラミング言語です。

「 イミディエイト 」 欄が表示されていない場合は、 「 挿入 」 の左の 「 表示 」 から 「 イミディエイト ウィンドウ 」 をクリックします。


イミディエイトへの記述

Macro を簡単に試してみるためのヒントを示します。図の 「 イミディエイト 」 欄に記述をして 「 Enter 」 を押します。基本的にはプロシージャ形式であっても問題ありませんが分岐するような形態はできません。 エラーが出てもあまり驚く事はないです。

x=3: y=5: Msgbox x*y

上をコピーして 「 イミディエイト 」 欄に貼り付け、この記述上にカーソルを置いて 「 Enter 」 を押します。メッセージボックスに 「 15 」 と表示されます。

ActiveCell.Range("a1:c4").Select

上の場合アクティブセルの a1 〜 c4 セルレンジが選べます。… アクティブセルが b4 にある場合は b4 〜 d7 がハイライト表示されているはずです。

Word だと、文書の構成が分かります。次の例では第2段落目の1番目のセンテンスが選ばれます。

ActiveDocument.Paragraphs(2).Range.Sentences(1).Select
応用例…掛け算の九九表

 For i=1 To 9:For j=1 To 9:ActiveCell.Cells(i,j)=i*j:Next:Next

上をコピーして 「 イミディエイト 」 欄に貼り付け実行すればアクティブセルの 9 × 9 の範囲に掛け算の九九表が出来ます。実行後は元に戻せないので新しいシートなどで試みてください

応用例…1行おきに行削除、挿入

Set c=[a4]:For i=6 To 1000 Step 2:Set c=Union(c,Cells(i,1)):Next:c.EntireRow.Delete

上の記述は Excel の 4行目以下1000行までの偶数行が削除されます。元に戻せませんので重要なデータはバックアップが必要です。


For i=4 To 100 Step 2:Cells(i,1).EntireRow.Insert:Next
一方、上の記述では4行目以下100行までに1行おきに行が挿入されます。
応用例…新しいシートを追加しシート名を1月、2月…とする

for i=12 to 1 step -1: worksheets.add.name=i & "月": next

上の記述では左から右に"1月","2月",…"12月"のシートが作成されます。同じ名や無名(ヌル)のシートを作るとエラーになります。これらのシートを削除するには最初のシートを選び Shift キーを押したままで最後のシートをクリックし当該シート全てを選択したうえで、右クリックで 『 シートの削除 』 をします。複数シートの選択を取り消すには右クリックで 『 作業グループ解除(U) 』をクリックします。

悪意(要注意)のmacroと考えられる事例集

単純にファイルを開くだけで自動的に Macro を実行させることが可能なので、訳の分からない場合は絶対に開かない。

①"kill"…ファイルを削除しなさいというコマンドがある。

②"*.*"…(すべてのファイルを意味する)の記述がある。

③一見してファイル操作である事が推測できるような記述がある。

④Application.DisplayAlerts (特定の警告やメッセージ表示)を False にしているのにこれを True に復帰させていない。

⑤Do...Loop のステートメントが使われている場合、無限ループに注意します。  中断させるには、Esc キーまたは Ctrl + Break キーを押します。

このサイトで扱った項目