1-1 VBAを利用する前の準備
■
マクロとVBA
アプリケーションの内部的な操作を自動化する機能のことを、マクロといい ます。マクロを利用することで、毎日(あるいは毎週・毎月)のように繰り返し 行われる一連の定型的な作業を、すべてアプリケーション任せで自動的に 実行できるようになります。 ただし、マクロ機能の具体的な仕様は、アプリケーションによっても異なりま す。すべての機能をマクロに登録できるアプリケーションもあれば、一部の機 能しか登録できないアプリケーションもあります。マクロへの機能の登録方法 も、実際に一連の操作を行って記録させる方式や、操作項目を選択して登 録していく方式、一種の専用プログラミング言語を利用して登録していく方式 など、アプリケーションによってさまざまです。 WordやExcelの場合、アプリケーションの中で行った操作の手順をそのま ま記録して、マクロとして登録することができます。記録されたマクロは自動的 にVBAという一種のプログラミング言語の形で記述され、ユーザーは専用の 編集画面である「Visual Basic Editor」(VBE)で、そのプログラムを修正す ることも可能です。また、記録機能を利用することなく、VBEで直接新しいマ クロプログラムを作成することもできます。VBAというのはVisual Basic for Applicationsの略で、文字通り「アプリ ケーション用のVisual Basic」という意味です。プログラミング言語である Visual Basicの基本仕様を踏襲しつつ、アプリケーションの中でマクロ用の言 語として使用できるようにしたものがVBAです。 Wordのマクロは、Wordの文書またはテンプレートのファイル内に保存され ます。特に、複数の作業で共通して使用したいマクロは、Wordの標準テンプ レート(Normal.dotm)に保存します。本書では、個々の文書に、その作業に 関連したマクロを保存するという前提で、以降の解説を行っていきます。
■
Word 2010でVBAを使用する前の準備
Word 2010でVBAの機能を使用する場合、作業を開始する前に設定を 変更しておいたほうがいい点がいくつかあります。VBA関連の操作は[開発] タブで行いますが、Office 2010の初期設定の状態では[開発]タブは表示さ れていないため、これが表示されるように設定を変更します。 記 述 さ れ た プ ロ グ ラ ム の こ と をコ ー ドと も 呼びます。 Wordの場合、実際の 作業では、個々の文 書よりも複数の文書 で使用したいマクロの ほうが多いかもしれま せ ん。標 準 テ ン プ レートの扱いについて は、230 ペ ー ジ を 参 照してください。[ファイル]タブをクリックし、[オプション]をクリックします。 [Wordのオプション]ダイアログボックスが表示されます。[リボンのユー ザー設定]をクリックし、右側の[メインタブ]の一覧の[開発]をクリックして チェックをオンにし、[OK]ボタンをクリックします。 Word 2007 の 場 合 は、[Office]ボタンか ら[Word の オ プ シ ョ ン]を ク リ ッ ク し て [Word のオプション] ダイアログボックスを 表 示 さ せ、[基 本 設 定]の画面で[[開発] タブをリボンに表示す る]の チ ェ ッ ク を オ ン にすると、[開発]タブ が表示されます。
これで、リボンに[開発]タブが表示されます。 ここから、まずマクロのセキュリティに関する設定を確認しましょう。[開発] タブをクリックし、[コード]グループの[マクロのセキュリティ]をクリックします。 [セキュリティセンター]ダイアログボックスの[マクロの設定]の画面が表示 されます。[マクロの設定]が[警告を表示してすべてのマクロを無効にする] になっていることを確認します。 こ れ 以 外 の 設 定 に なっている場合は、こ の通りに変更してくだ さい。
さらに[メッセージバー]をクリックし、[メッセージバーの表示]で[ActiveXコ ントロールやマクロなどのアクティブコンテンツがブロックされた場合、すべて のアプリケーションにメッセージバーを表示する]が選択されていることを確認 します。[OK]ボタンをクリックします。 以上のような設定でマクロが含まれているWord文書を開くと、[セキュリ ティの警告]メッセージバーが表示されます。この文書のマクロを有効にする には、[コンテンツの有効化]ボタンをクリックします。 メッセージバーが消えて、マクロが有効になります。また、この操作を実行 すると、開いたWord文書が信頼済みドキュメントとして記録され、これ以降
Visual Basic Editor (28 ペ ー ジ 参 照)を 開 い て い る 状 態 で、 マク ロを 含む 文 書を 開 こ う と す る と、 [Microsoft Word の セキュリティに関する 通知]ダイアログボッ ク ス が 表 示 さ れ ま す。安全性の確認さ れている文書であれ ば、[マ ク ロ を 有 効 に する]ボタンをクリック して文書を開きます。
は常にマクロが有効な状態で開けるようになります。 なお、一時的にマクロを有効にしたいが、信頼済みドキュメントとしては登 録したくない(以後も[セキュリティの警告]メッセージバーが表示されるように したい)場合は、[ファイル]タブの[情報]の[セキュリティ警告]で、[コンテン ツの有効化]から[詳細オプション]をクリックします。 [Microsoft Officeセキュリティオプション]ダイアログボックスが表示される ので、[このセッションのコンテンツを有効にする]を選択し、[OK]ボタンをク リックします。 ここで 紹介 した手順 はWord 2010の場合 です。Word 2007の 場 合、[セ キ ュ リ テ ィ の 警 告]メ ッ セ ー ジ バーには[コンテンツ の有効化]ボタンでは な く[オ プ ショ ン]ボタ ンが表示され、クリッ ク す る と[Microsoft Officeセキュリティオ プ シ ョ ン]ダ イ ア ロ グ ボ ッ クス が表 示 され ます。[このコンテンツ を 有 効 に す る]を 選 択 し て[OK]ボ タ ン を クリックすると、マクロ が 有 効 に な り ま す。 Word 2010のように 「信頼済みドキュメン ト」と し て 登 録 さ れ る わけではなく、文書を 開くたびにこの操作を 行う必要があります。
■
信頼できる場所を設定する
いくつかのフォルダーは、あらかじめ信頼できる場所として設定されていま す。これらのフォルダーに保管されたVBAを含むファイルは、[セキュリティの 警告]メッセージバーなどが表示されることなく、そのままマクロが有効な状 態で開くことができます。また、ユーザーが指定したフォルダーを「信頼できる 場所」として設定することも可能です。 [開発]タブの[マクロのセキュリティ]をクリックします。 [セキュリティセンター]ダイアログボックスが表示されます。[信頼できる場 所]をクリックすると、信頼できる場所として設定されたフォルダーのパスが一 覧表示されます。これら以外に信頼できる場所を追加するには、[新しい場 所の追加]ボタンをクリックします。[Microsoft Officeの信頼できる場所]ダイアログボックスが表示されたら、 [参照]ボタンをクリックします。 表示される[参照]ダイアログボックスで信頼できる場所に設定したいフォ ルダーを選択します。[OK]ボタンをクリックします。 [Microsoft Officeの信頼できる場所]ダイアログボックスに選択したフォル ダーのパスが入力されるので、[OK]ボタンをクリックします。 [セキュリティセンター]ダイアログボックスに戻ります。[信頼できる場所]に 指定したフォルダーが追加されているのを確認したら、[OK]ボタンをクリック します。これで、そのフォルダーが信頼できる場所として登録されます。
このフォルダーに保管されたマクロを含むWord文書は、常にVBAが有効 な状態で開かれます。また、この信頼できる場所の設定は、Wordだけでなく Excelのブックなどでも共通です。信頼できる場所の設定を解除したい場合 は、この[セキュリティセンター]ダイアログボックスの[信頼できる場所]で、登 録されたパスをクリックして選択し、[削除]ボタンをクリックします。
■
Word 2007以降の文書形式について
Word 2003までは、マクロを含む文書も含まない文書も、すべて「.doc」と いう拡張子の同一形式のファイルとして保存されていました。 Word 2007以降では、通常の文書は「.docx」という拡張子で保存されま すが、このファイル形式ではマクロを含めて保存することはできません。マクロ を含む文書は、以下のような手順で、マクロ有効文書として保存します。 [ファイル]タブをクリックし、[名前を付けて保存]をクリックします。 Word 2007 と Word 2010の文書のファイ ル形式も、まったく同 じというわけではあり ま せ ん。詳 し く は 71 ページを参照してくだ さい。ファイルを保存する場所(フォルダ)とファイル名を指定し、[ファイルの種 類]で[Wordマクロ有効文書]を選択して、[保存]ボタンをクリックします。 これで、マクロが使用可能な「.docm」という拡張子の文書として保存され ます。
■
マクロを記録する
Wordでは、文書上でユーザーが行った一連の操作を記録して、マクロの 「実体」であるVBAのプログラムコードを自動的に生成させることができます。 ここでは、Word 2010で作成した新規文書に、文章を入力してその一部の 書式を変更するマクロを、記録機能を使って登録します。 [開発]タブの[コード]グループの[マクロの記録]をクリックします。[マクロの記録]ダイアログボックスで、[マクロ名]として「InputWords」と入 力します。そして、[マクロの保存先]を[すべての文書(Normal.dotm)]から [文書 1(文書)]に変更し、[OK]ボタンをクリックします。 マクロとして登録したい操作を行います。ここでは、まず「新しいマクロを作 成します。」と入力します。 マクロの記録中は、カーソルの移動や文字列の選択にマウスを使用するこ とはできません。[←]キーを使用してカーソルを左に移動し、さらにShiftキー と[←]キーを同時に押して「マクロ」という文字列を選択します。 「新 し い」「マ ク ロ を」 「作 成 し ま す」「。」の よ う に 1 文 節 ず つ 区 切って入力し、そのつ どEnterキーで確定し ていかないと、正しく 記 録 さ れ な い の で、 注意が必要です。 「文 書 1」の 部 分 は、 実際には作業中の文 書ファイル名になりま す。また、[マクロを割 り当てる対象]につい ては23ページで改め て説明します。
[ホーム]タブの[フォント]グループの[太字]をクリックして、選択した文字 を太字に変更します。 [開発]タブの[コード]グループの[記録終了]をクリックします。これで、マ クロの記録が終了します。 なお、ここでは[マクロの保存先]として現在作業中の文書を選んだため、 作 成 し た マ ク ロ は こ の 文 書 で し か 使 用 で き ま せ ん が、[す べ て の 文 書 (Normal.dotm)]を選択すると、どの文書を開いているときでも作成したマク ロを使用することができます。 Nomal.dotm に つ い て は254ページを参照 してください。 本 書 の Word 2007 版では、ここでフォント の色を変更していま すが、Word 2010で は、文字色を変更す る操作をマクロとして 記録することができな くなっています。
■
マクロを割り当てる
[マクロの記録]ダイアログボックスで、[マクロを割り当てる対象]の[ボタン] をクリックするとクイックアクセスツールバーのボタンから、[キーボード]をク リックするとショートカットキーから、それぞれ登録したマクロを実行できるよう になります。 まず、[ボタン]をクリックした場合について説明します。 [Wordのオプション]ダイアログボックスの[クイックアクセスツールバー]の 画面が表示されます。[クイックアクセスツールバーのユーザー設定]の部分 を「文書1に適用」に変更し、左側のフィールドで新規作成するマクロ名をク リックして選択し、[追加]ボタンをクリックします。 「文 書 1」の 部 分 は、 実際には作業中の文 書ファイル名になりま す。ま た、マ ク ロ の 保 存 先 を[す べ て の 文 書(Normal.dotm)]に した場合、[クイックア クセスツールバーの ユーザー設定]の部 分は「すべてのドキュ メントに適用(既定)」 のままにします。選択したマクロ名が右側のフィールドに追加されます。[OK]ボタンをクリッ クしてこのダイアログボックスを閉じると、マクロの記録が開始されます。 以下、マクロ化したい一連の操作を実行し、マクロの記録を終了します。 クイックアクセスツールバーに表示されているマクロ実行用のボタンをクリッ クすると、記録したマクロを実行することができます。 次に、[マクロの記録]ダイアログボックスで[キーボード]をクリックした場合 について説明します。 このボタンをクイック アクセスツールバー から削除したい場合 は、ボタンを右クリック して[クイックアクセス ツ ー ル バ ー か ら 削 除]をクリックします。
[キーボードのユーザー設定]ダイアログボックスが表示されます。ここで、 マクロの実行に割り当てたいキーを実際に押します。マクロを割り当てることが できるキーとしては、Ctrlキーと文字キーの組み合わせや、一部の機能キー などがあります。 また、[保存先]として「文書1」を選択し、[割り当て]ボタンをクリックしま す。さらに[閉じる]ボタンをクリックすると、マクロの記録が開始されます。 以下、マクロ化したい一連の操作を実行し、マクロの記録を終了します。 Wordでの作業中に、割り当てたキーを押すと、記録したマクロを実行する ことができます。
■
記録後にマクロを割り当てる
作成済みのマクロを、後からボタンやキーボードに登録することも可能で す。マクロの記録時に登録するのを忘れていた場合や、直接コードを記述し て作成したマクロを簡単に実行したい場合などにこの操作を行います。 「文 書 1」の 部 分 は、 実際には作業中の文 書ファイル名になりま す。ま た、マ ク ロ の 保 存 先 を[す べ て の 文 書(Normal.dotm)]に した場合、[保存先] は「Normal」の ま ま に します。ボタンやキーボードに登録したいマクロが含まれている文書で作業している 状態で、クイックアクセスツールバーを右クリックし、[クイックアクセスツール バーのユーザー設定]をクリックします。 [Wordのオプション]ダイアログボックスの[クイックアクセスツールバー]の 画面が表示されます。[コマンドの選択]で「マクロ」を、[クイックアクセスツー ルバーのユーザー設定]で「文書1に適用」を選択します。 そして、左側のフィールドに表示されるマクロをクリックして選択し、[追加] ボタンをクリックします。選択したマクロが右側のフィールドに追加されたら、 [OK]ボタンをクリックします。 これで、マクロ実行ボタンがクイックアクセスツールバーに追加されます。 また、Word 2010では、同様の手順で、マクロをリボンの任意のタブにボタ 「文 書 1」の 部 分 は、 実際には作業中の文 書ファイル名です。ま た、Normal.dotm の マ クロの場合、[クイック アクセスツールバー の ユ ー ザ ー 設 定]の 部 分 は「す べ て の ド キュメントに適用(既 定)」にします。
ンとして追加することができます。 一方、マクロをキーボードに登録したい場合は、[Wordのオプション]ダイア ログボックスの[リボンのユーザー設定]の画面で、ショートカットキーの[ユー ザー設定]ボタンをクリックします。 [キーボードのユーザー設定]ダイアログボックスが表示されます。[保存 先]として「文書1」を、[コマンドの指定]の[分類]で「マクロ」を選択し、[マク ロ]でキーボードを登録したいマクロを選択します。 [割り当てるキーを押してください]というフィールドをクリックして、登録した いキーを実際に押し、[割り当て]ボタンをクリックします。さらに[閉じる]ボタ ンをクリックすると、設定したショートカットキーでマクロを実行できるようになっ ています。
■
マクロを実行する
マクロをクイックアクセスツールバーやショートカットキーから実行できるよう に設定した場合はそれらを使えば簡単ですが、ここでは基本的な手順とし て、リボンの[マクロ]コマンドからマクロを実行する方法を紹介します。 マクロを実行したい位置にカーソルを移動して、[開発]タブの[コード]グ 「文 書 1」の 部 分 は、 実際には作業中の文 書ファイル名です。ま た、Normal.dotm の マ ク ロ の 場 合、[保 存 先]は「Normal」にしま す。なお、マ クロに登 録 し た キ ー ボ ー ド の 設定を解除したい場 合は、ここで「現在の キ ー」の 設 定 を選 択 して、[削除]ボタンを クリックします。 Word 2007 で もリ ボ ン に マ ク ロ 実 行 用 の ボタンを表示させるこ と は 可 能 で す が、手 順がやや複雑になり ます。ループの[マクロ]をクリックします。
[マクロ]ダイアログボックスが表示されます。[マクロ名]欄に表示されるマ クロの一覧から、実行したいマクロをクリックして選択し、[実行]ボタンをクリッ クします。
これで、選択したマクロが実行されます。
■
Visual Basic Editorを開く
マクロの「内容」であるVBAのソースコードを確認するには、Visual Basic Editor(VBE)を表示させます。VBEでは、記録機能で作成されたマクロを確 認・編集するだけでなく、新しいマクロを一から作成することも可能です。 [開発]タブの[コード]グループの[Visual Basic]をクリックします。 AltキーとF8キーを同 時 に 押 し て も、[マ ク ロ]ダイアログボックス が表示されます。
これで、VBEが、Wordのウィンドウとは別のウィンドウで表示されます。
■
Visual Basic Editorの構成
Visual Basic Editor(VBE)を開くまでの操作はWord 2007以降と2003 以前で異なりますが、一度開いてしまえば、ほとんど同様の手順で操作を行 うことができます。VBEの画面は、下のような構成になっています。 ・プロジェクトエクスプローラー 「プロジェクト」とはVBAのプログラムを記録する単位で、Wordの場合はほ ぼ1つの文書に相当します。プロジェクトには、実際にVBAのプログラムを書く ことができる場所である「モジュール」が含まれており、プロジェクトエクスプ ローラーでは各モジュールをアイコンで表しています。同じ種類のモジュール は、通常、フォルダーでグループ化されて表示されます。 ・プロパティウィンドウ 選択されている「オブジェクト」の「プロパティ」の値を表示するものです。こ こでプロパティの値を変更することも可能です。 ・コードウィンドウ プロジェクトエクスプローラーで選択されたモジュールの内容を表すウィンド ウです。テキストエディターと同様の感覚で、コードを入力・編集できます。 コードウィンドウ プロジェクトエクスプローラー プロパティウィンドウ 「オブジェクト」と「プロ パ テ ィ」に つ い て は、 いずれも37ページを 参照してください。 AltキーとF11キーを 同 時 に 押 し て も、 Visual Basic Editor が表示されます。
1-2 VBAの基本構造
■
プロジェクトとモジュール
Visual Basicの用語で、1つのまとまった処理を行うためのプログラムの集 合体をプロジェクト(Project)といいます。Word VBAの場合は、とりあえず、 Wordの文書ファイルやテンプレートをVBAの側から見たものをプロジェクトと 呼ぶ、と理解しておけばいいでしょう。 プロジェクトの中で、実際にVBAのコードを記述する場所のことをモジュー ルといい、Visual Basic Editor(VBE)のプロジェクトエクスプローラーで確認 することができます。モジュールにもいくつか種類がありますが、Wordのマク ロ記録機能などで作成されるマクロ、つまりVBAのプログラムは、標準モ ジュールに記述します。 標準モジュールは、初期状態ではWordのプロジェクト(文書ファイル/テ ンプレート)には含まれていません。マクロ記録機能でマクロを作成した場合 は自動的に標準モジュールも作成されますが、一からVBAのプログラムを記 述する場合は、まず新しい標準モジュールを作成する必要があります。 複数の文書(プロジェクト)が開かれている場合は、プロジェクトエクスプロー ラーで目的の文書、またはその文書の中のいずれかのモジュールをクリック して選択し、VBEの[挿入]メニューから[標準モジュール]をクリックします。 選択されたプロジェクトの中に新しい標準モジュールが作成され、そのコー ドウィンドウが表示されます。このコードウィンドウに、VBAのコードを記述してい きます。 マ クロを 含 め て保 存 できる文書の形式に ついては19ページを 参照してください。VBAのコードは、主として各種のキーワードと、処理対象となるデータに よって構成されます。キーワードというのはVBAであらかじめ定義された、命 令などに用いられる語のことです。また、データとしては、数値などがコード中 にそのまま記述される場合と、変数などの名前を使って記述される場合とが あります。 なお、VBEの画面で行った操作は、対象のプロジェクトである文書ファイル またはテンプレートに保存されます。VBEのツールバーの[上書き保存]ボタ ンをクリックして保存することもできますが、Wordの通常画面を開いて文書 を保存しても、VBEでの変更内容も併せて保存されます。
■
Subプロシージャの作成
VBAのプログラムは、1つの処理のまとまりをプロシージャという単位で扱い ます。プロシージャにもいくつか種類がありますが、Wordのマクロは「Sub」と いうキーワードで始まるSubプロシージャです。新しいSubプロシージャは[挿 入]メニューから作成することもできますが、ここでは直接コードウィンドウに入 力して、「MyMacro」という名前のSubプロシージャを作成しましょう。 標準モジュールのコードウィンドウに「Sub MyMacro」と入力し、Enterキー を押します。 変 数 に つ い て は 41 ページを参照してくだ さい。 作成された標準モジュール 標準モジュールの コードウィンドウプロシージャ名である「MyMacro」の後に自動的に「()」が付き、さらに1行 空けて「End Sub」という行が入力されます。この「Sub MyMacro()」と「End Sub」の間の行に、VBAのコードを入力していきます。 なお、この「MyMacro」というプロシージャ名は、そのままマクロ名として Wordの[マクロ]ダイアログボックスにも表示されます。つまり、1つのSubプロ シージャはVBAにおける1つの処理のまとまりであり、1つのマクロとして実行 することができます。 「Sub」はVBAのキーワードですが、「MyMacro」のようなプロシージャ名 (マクロ名)の部分には、プログラム作成者が好きな名前を付けることができ ます。ただし、文字数は半角255文字以内で、スペースや「.」、「!」、「@」な どほとんどの記号類は使用できず、先頭文字を数字にすることもできませ ん。なお、日本語は使用可能です。 プロシージャ名以外にも、VBAではユーザーが名前を付けられるものがい くつかありますが(変数、定数など)、そのいずれの場合でも命名の規則はほ ぼ同様です。 マクロ名を入力してEnter 「_」(アンダースコア) は使用可能ですが、 この記号には特定の 役 割 も あ る た め、使 用する際は注意が必 要です。
■
VBAのコードの基本ルール
「Sub マクロ名()」と「End Sub」の間には、原則として1行に1つの処理を記 述していきます。このSubプロシージャを実行すると、基本的には、上から1行 ずつ順番に実行されていきます。 マクロ記録で生成されたSubプロシージャでは、「Sub マクロ名()」と「End Sub」の間の行は、通常、インデント(字下げ)されていますが、ユーザーが一 からSubプロシージャを作成する場合も、Tabキーを使って同様にインデント したほうがわかりやすくなります。コードの内容によっては、処理のまとまりを表 すために、さらにもう1段階インデントする場合もあります。 コードの中で、見やすくするために空白行を空けることも可能です。この場 合も、やはり上から順番に、記述された行の処理が実行されていきます。空 白行は無視されます。 コードの実行順 インデント 空白行 具体的 に どのよ うな 場合にインデントのレ ベルを変えるかにつ い て は、後 の 節の 解 説 で、自 然 と わ か っ ていくと思います。
1行が長くなりすぎた場合、適当な位置に改行を入れて2行に分けることが できます。その場合、改行する位置の末尾には行継続文字として「 _」(半角 スペースとアンダースコア)を入れます。VBAでは、行継続文字で終わって いる行は、次の行とつながっているものと見なされます。 コードウィンドウには、コードとしての意味のある単語以外に、ちょっとした説 明や覚え書きを入れるためのコメントを書き込むことができます。「Rem」とい うキーワードで始まる行は、その行全体がコメントと見なされます。また、行の 中に「'」(シングルクォーテーション)が出てきた場合、その位置以降がコメント と見なされます。
■
VBAで扱えるデータ
VBAのコードの中で扱えるデータは、大きく分けて、数値、文字列、オブ ジェクトの3種類です。いずれも実際にはより細分化されて扱われますし、こ れ以外の種類のデータもないわけではありませんが、VBAの勉強を始めた 最初の段階ではとりあえずこの3つに分けて理解しておけばいいでしょう。 数値は、コードの中に直接指定できます。たとえば、次のコードは、メッセー ジボックスに「12」と表示します。 キーワードなどの語句 の途中や、「” “」で囲 まれた文字列の途中 などに行継続文字を 入れて改行すること はできません。 コメントは、コードウィ ンドウ内では通常、緑 色の文字で表示され ます。 行継続文字 データの種類は、41 ページでもう少し詳し く 説 明 し ま す。ま た、 オブジェクトについて は37ページ以降で詳 しく説明します。 MsgBox 12 Sample file Pt1P034_01.docm「MsgBox」は、「組み込み関数」と呼ばれる種類のVBAのキーワードです が、ここでは「指定したデータをメッセージボックスに表示する命令」とでも理 解しておいてください。 一方、文字列は、前後を「" "」で囲んで指定します。次のコードは、メッ セージボックスに「こんにちは!」と表示します。
■
ステートメントと式
ステートメントというのは、コードにおける処理の実行単位です。通常、1行 が1つのステートメントになりますが、複数の行がセットで1つのステートメントと なる場合もあります。たとえば、Subプロシージャの開始と終了を表す「Sub マクロ名()」と「End Sub」も、この2行がセットになって1つの「Subステートメン ト」と呼ばれます。 また、1行のステートメントの中でも、実際にはさまざまな処理が行われて MsgBox 関 数 に つ い ては56ページでも説 明 し ま す。組み 込み 関 数 は、厳 密 に 言 う と Global オ ブ ジ ェ ク ト のメソッドです。MsgBox "こんにちは!" Sample file Pt1P035_01.docm
います。その部分だけではコードとして実行できないが、演算などの処理の結 果として何らかのデータを返す部分を式といいます。式によって返されるデー タとしては、数値や文字列、またはオブジェクトなどがあります。式を処理して その結果を求めることを、式を「評価する」ともいいます。 式を使って、コードの中で数値の計算を行うこともできます。たとえば、次 のコードは、「2 + 3」という式の計算結果をメッセージボックスに表示します。 この式で使われている「+」のような記号を演算子といい、特に数値同士の 計算に使用するものを算術演算子といいます。VBAの式で使用できる算術 演算子には、以下のようなものがあります。 また、「&」という記号は、2つの文字列を結合する機能を持った文字列演 算子です。 MsgBox 2 + 3 演算子 使い方 機能 + 数値1 + 数値2 数値1と数値2の和を返す - 数値1 – 数値2 数値1から数値2を引いた差を返す * 数値1 * 数値2 数値1と数値2の積を返す / 数値1 / 数値2 数値1を数値2で割った商を返す \ 数値1 ¥ 数値2 数値1を数値2で割った商の整数部分を返す Mod 数値1 Mod 数値2 数値1を数値2で割った商の余りを返す ^ 数値1 ^ 数値2 数値1を数値2でべき乗した値を返す Sample file Pt1P036_01.docm
VBAの演算子の種類は算術演算子と文字列演算子だけではありません が、これら以外の演算子については、以降の解説の中で、具体的な用例とと もに紹介していきます。
■
VBAのオブジェクト操作の基本
VBAのステートメントの書式にはいくつかのパターンがありますが、主に使 用されているのは、「オブジェクト」を使用する次の2つのパターンです。 オブジェクトというのは、ここでは、いわば処理の対象となる「モノ」とでも理 解しておいてください。オブジェクトにはどのようなものがあり、どのように指定 するかについては、後の節で詳しく説明します。 メソッドというのは、いわば対象の「モノ」に対して行う「操作」のことです。た とえば、選択された文字列の範囲をオブジェクトとして指定し、これに対して 「削除する」という操作を表すメソッドを指定することで、選択範囲の文字列 を削除することができます。このようなコードでは、オブジェクトとそのメソッドを 「.」(ドット)でつなぎます。実行可能なメソッドの種類は、対象のオブジェクトに よって異なります。また、処理で使うデータや、処理内容の細かい設定を指 定する必要がある場合は、メソッド名の後に引数として指定します。 一方、プロパティというのは、対象の「モノ」の属性や設定を表します。「=」 は代入演算子で、左辺に指定されたプロパティや変数に、右辺に指定され た値を代入します。たとえば、対象のオブジェクトに属する文字列を表すプロ パティに文字列を代入することで、その文字列を変更するという操作になりま す。やはり、オブジェクトとそのプロパティは「.」(ドット)でつなぎます。また、プロ パティを使用した式で、現在の設定値を調べることも可能です。使用可能な プロパティの種類は、やはり対象のオブジェクトによって異なります。 各パターンの具体的なサンプルは、次の項で紹介します。■
オブジェクトの取得
オブジェクト名と、そのオブジェクトのコード中での指定方法の関係は、 少々面倒です。 オブジェクト.メソッド オブジェクト.プロパティ = 設定値 【書式】 パターン1 パターン2 変 数 に つ い て は 41 ページを参照してくだ さい。 プロパティでも引数を 指定する場合はあり ま すが、40ペ ージ で 説明するインデックス のようなものがほとん どです。Word VBAでは、オブジェクトをその名前を使って直接指定することはほと んどありません。通常は、プロパティやメソッドを使った式で、その戻り値として 間接的にオブジェクトを指定します。このようにしてオブジェクトを求めること を、オブジェクトを取得するといいます。 たとえば、Word文書(ドキュメント)を表すオブジェクトは「Documentオブ ジェクト」ですが、いきなりコードウィンドウに「Document」と書いてもオブジェク トは取得できません。Wordでは一度に複数の文書を開いている場合もある ため、操作対象となるDocumentオブジェクトを特定する必要があります。 現在作業中の(最前面で開かれている)文書を表すDocumentオブジェク ト を 取 得 し た い 場 合 は、「ActiveDocumentプ ロ パ テ ィ」を 使 用 し ま す。 ActiveDocumentプロパティは、その値として数値や文字などではなく「オブ ジェクト」を持っており、プロパティの値を取り出す式によって、オブジェクトを 取得することができます。 ActiveDocumentプロパティの対象オブジェクトはWordアプリケーションを 表すApplicationオブジェクトまたはGlobalオブジェクトです。Globalオブジェ クトのメンバー(プロパティまたはメソッド)は、オブジェクトの指定を省略して記 述することができます。ActiveDocumentプロパティのように、対象のオブジェ クトを省略してコードの先頭に記述できるプロパティをトップレベル(最上位)の プロパティと呼びます。Word VBAのコードは、多くの場合、トップレベルのプロ パティまたはメソッドから記述を開始します。 次の例は、作業中の文書を表すDocumentオブジェクトに対し、保存の操 作を行うSaveメソッドを実行するステートメントです(パターン1の例)。 また、文書中の選択範囲を表すSelectionオブジェクトも、トップレベルのプ ロパティであるSelectionプロパティで取得できます。Selectionオブジェクトの Textプロパティに値を設定するという操作で、選択範囲の文字列を変更する ことができます。次の例は、選択範囲の文字列を「Office」に変更するステー トメントです(パターン2の例)。 なお、ここではプロパティを使用してオブジェクトを取得する方法を紹介し ActiveDocument.Save Selection.Text = "Office" この2ページで紹介し ているコードは、単な る書式 の例 なの で、 サ ン プ ル フ ァ イ ル は 用意していません。
ましたが、オブジェクトによっては、プロパティではなくメソッドで取得する場合 もあります。メソッドの中には、単にオブジェクトを操作するだけでなく結果とし て値を返すものもあり、その戻り値として数値や文字列ではなくオブジェクトを 返す場合もあるのです。 また、あるオブジェクトを取得する方法が1つだけとは限りません。ここで例 に挙げたDocumentオブジェクトについても、ActiveDocumentプロパティ以 外にもいろいろな取得方法が用意されています。
■
オブジェクトの階層構造
ActiveDocumentプロパティはトップレベルのプロパティなので対象のオブ ジェクトを省略することができますが、作業中の文書を保存するコードを、対 象のApplicationオブジェクトを指定して書くと次のようになります。 このコード中の「Application」は、やはりGlobalオブジェクトのプロパティで、 Applicationオブジェクトを返します。つまり、このコードはApplicationオブジェ クトとそこに含まれるDocumentオブジェクトとが、階層構造になっているわけ です。同様に、Documentオブジェクトのプロパティを使って、Documentオブ ジェクトに含まれるオブジェクトを取得することができます。このようにプロパ ティ(またはメソッド)を重ねて指定していくことで、最終的に操作したいオブ ジェクトを特定します。 たとえば、DocumentオブジェクトのPageSetupプロパティで、その文書の ページ設定を表すPageSetupオブジェクトを取得できます。次のコードは、 PageSetupオブジェクトのLeftMarginプロパティで、作業中のドキュメントの 左側の余白の大きさを指定するものです。なお、最初の「Application.」は省 略可能です。 オブジェクトが階層構造になっている場合、上位のオブジェクトを親オブ ジェクト、それに含まれるオブジェクトを子オブジェクトと呼びます。 Application.ActiveDocument.Save Application.ActiveDocument.PageSetup.LeftMargin = 10■
オブジェクトとコレクション
プロパティによって取得できるオブジェクトの中には、「同じ種類のオブジェ クトの集合」とでもいうべきものがあります。たとえば、トップレベルのプロパティ であるDocumentsプロパティを使用することで、現在Wordで開かれている すべての文書を表すDocumentsオブジェクトを取得できます。Documents オブジェクトは単体のDocumentオブジェクトの集合であり、このようなオブ ジェクトのことをコレクション(コレクションオブジェクト)ともいいます。 コレクションに含まれている単体のオブジェクトは、通常、後ろに付けたカッ コの中にインデックスを指定して取り出すことが可能です。インデックスも引数 の一種ですが、特にオブジェクト(または配列の要素)を特定するために使用 する番号または名前のことをいいます。 たとえば、現在Wordで3つの文書が開かれているとして、次のような式で は、そのうち2番目に開かれた文書をDocumentオブジェクトとして取得でき ます。 また、「MyDoc01.docx」というファイル名の文書をDocumentオブジェクト として取得したい場合は、次のような式を指定します。 なお、ここで指定できるのはあくまでも現在開かれている文書ファイル名な ので、開かれていない状態の文書を指定することはできません。 Documents(2) Documents("MyDoc01.docx") インデックスを使って 特定のオブジェクトを 取り出すことができる のは、厳密に言うと、 ほ ぼ す べ て の コ レ ク ションに用意されてい る「Item」というメソッド (またはプロパティ)の 機能によるものです。 ただ、Itemは多くの場 合、省 略 す る こ と が 可能なので、実際に はあまり意識すること はありません。1-3 データの種類と変数・定数
■
変数と定数の基礎知識
VBAのコードの中では、数値や文字列といったデータを直接指定できるだ けでなく、「変数」や「定数」といった名前を使って処理することが可能です。 いずれにも「数」という字が付いていますが、数値だけでなく文字列のデータ も、変数や定数を利用して処理することができます。 変数というのは、いわばデータの入れ物のようなものです。プログラム作成 者が適当な名前を付けて作った変数に任意のデータを代入し、以後、元の データの代わりにその変数を使って処理を行います。変数にどのようなデー タが入るかは、処理のたびに変わる可能性があります。また、変数はあくまで もデータの一時的な入れ物なので、処理の途中でその内容が変更される場 合もあります。要するに、処理における「役割」を表すものといえます。 一方、定数というのは、特定のデータに付ける名前のことです。変数とは 違い、コードの中で一度その名前に対応するデータを決めたら、以後、その 定数の値が変わることはありません。元のデータを直接使ってもいいのです が、定数を利用することで、数値などよりもそのデータの持つ「意味」がわかり やすくなります。たとえば、「0.05」という数値に「zeiritu」という名前を付けて おけば、この数値が税率を表すものとすぐにわかります。数値そのものを複数 の箇所で使用していた場合、後で税率が変更になったときには、そのすべて の箇所を修正する必要がありますが、定数を使用していた場合は、最初に 定数を定義している箇所だけを修正すれば済みます。 変数や定数として使用する名前の作成ルールは、プロシージャ名の命名 規則と同様です。■
変数の使用方法
変数は、コードの中で直接使い始めることが可能です。VBAのキーワード ではない語がコード中に出現すると、多くの場合、その語は変数と見なされま す。たとえば、次のコードでは、「a」という変数に演算の結果を代入し、その変 数の値をメッセージボックスに表示します。 プ ロ シ ー ジ ャ 名 の 命 名規則は、32ページ を参照してください。 a = 2 + 3 MsgBox a 1 2 Sample file Pt1P041_01.docmただし、特に長いプロシージャの場合、変数は直接使い始めるのではなく、 最初に宣言してから使用することをお勧めします。変数の宣言にもいくつか 種類がありますが、Dimステートメントを使う方法が一般的です。たとえば、整 数を扱うための変数aは、次のように宣言します。 変数を宣言するステートメントは、その変数を使用する前であればコード中 のどこに置いても構いませんが、通常はプロシージャの冒頭部分で、使用す る変数をすべてまとめて宣言しておくとわかりやすいでしょう。 このステートメントの「As」の後の部分は、変数のデータ型を表しています。 「Integer」は整数(比較的桁数の少ないもの)のデータを意味します。数値を 扱うデータ型としては、これ以外にも、より桁数の多い整数を扱える「Long」、 小数点以下の桁が扱える「Single」、より高い精度で小数点以下の桁が扱え る「Double」などがあります。True/Falseの論理値や、日付・時刻データも 数値の一種ですが、VBAでは前者は「Boolean」、後者は「Date」というデー タ型として扱います。 また、文字列を扱うためのデータ型は「String」、オブジェクトを扱うための データ型は「Object」です。 さらに、これらすべてのデータを代入することができる「Variant」というデー タ型もあります。Dimステートメントで「As」以下を省略した場合や、変数を宣 言せずに使用した場合も、Variant型の変数として扱われます。ただし、この 型を指定した変数は他のデータ型よりも余計にメモリを消費し、またプログラ ムの問題点を発見しにくくなるなどのデメリットもあるため、変数にはできるだ け適切なデータ型を指定するようにしましょう。 オブジェクトを扱う変 数については43ペー ジ を 参 照 し て く だ さ い。 Dim a As Integer 必 要 以 上 に 対 象 範 囲の広いデータ型を 指定すると、それだけ 余 分 に メ モ リ を 消 費 することになります。 コ ー ド ウ ィ ン ド ウ 内 に 「Option Explicit」とい う1行を入力しておく と、変数の宣言が必 頇となります。これに より、変数の入力ミス を減少させることがで きます。
■
オブジェクト変数
変数に収めることができるのは、数値や文字列のデータだけではありませ ん。取得するための処理が複雑なオブジェクトを変数に「代入」しておくこと で、一度取得したオブジェクトを、以降のコード中で手軽に再利用できるよう になります。 ただし、オブジェクトを変数に「代入」する操作は、普通の変数の場合とは 少し勝手が違います。オブジェクト変数の場合、通常の代入ステートメントで はなく、Setというキーワードを使ったSetステートメントを使用する必要があり ます。また、この操作は、厳密にいうと変数への「データの代入」ではなく、変 数に対する「オブジェクトへの参照のセット」です。 次 の 例 は、Wordで 開 か れ て い る「MyWork.docx」と い う 文 書 を 表 す Documentオブジェクトを「Dc」というオブジェクト変数にセットするステートメン トです。 なお、オブジェクト変数の宣言を行う場合、データ型は「As Object」としま す。ただし、この例のようにオブジェクトの種類がはっきりしている場合は、そ のオブジェクトの種類の名前そのものをデータ型として指定できます。このよう なデータ型を固有オブジェクト型といいます。たとえば、この場合のオブジェク ト変数Dcを固有オブジェクト型で宣言すると、次のようになります。 固有オブジェクト型で宣言することで、コードの中にそのオブジェクト変数を 入力するだけで自動的にメソッドやプロパティの候補が表示されるといったメ リットがあります。■
定数の使い方
VBAの定数には組み込み定数とユーザー定義定数の2種類があります。 組み込み定数とは、文字通りVBAにあらかじめ組み込まれている定数で、た とえば、コード中に「1」と書く代わりに「vbOK」のように記述できます。ただ、こ うした定数は使うべき状況が決まっており、特定の状況で使えばコードの意 味がわかりやすくなりますが、それ以外の状況で使うのはかえってわかりにくく Set Dc = Documents("MyWork.docx") Dim Dc As Documentなるので注意が必要です。 一方、ユーザー定義定数とは、プログラム作成者がコードの中で自由に定 義して使える定数のことです。ユーザー定義定数を使う場合は、Constス テートメントを使ってコードの中で宣言します。たとえば、「ninzu」という定数に 「5」という数値を設定したい場合は、次のようにします。 「Const」に続けて定数名を書き、その後「As」に続けてデータ型を指定す るところまでは変数のDimステートメントと同様です。定数の場合は、さらに 「=」に続けて、その定数に設定するデータまで指定します。
■
配列について
VBAでは、一般的な数値や文字列といった単体のデータのほかに、複数 のデータをまとめて取り扱えるデータ構造を利用できます。このようなデータ 構造のことを配列といい、配列を収めることのできる変数を配列変数といいま す。実際には、VBAで単に「配列」といったときには、ほとんどの場合、配列 変数を意味しています。 配列変数には、固定長配列(静的配列)と動的配列とがあります。固定長 配列とは、配列変数を宣言する際、その配列に含まれるデータ要素の数を あらかじめ決めてしまう配列変数のことです。たとえば、次のように宣言する と、3つの整数型のデータ要素を持った「hairetu」という固定長配列が利用 できるようになります。 配列変数は、通常、末尾に「()」を付けて表します。固定長配列の宣言 は、この中に要素番号(インデックス)の最大値を指定します。ここでは「2」と していますが、配列のインデックスは通常0から始まるため、0、1、2というイン デックスで表される3つのデータ要素が含まれることになります。 ただし、この時点ではまだ配列変数を宣言しただけであり、「部屋は3つ用 意したがまだ誰も入居していない」という状態です。たとえば、この配列変数 の2番目の部屋に「5」という数値を代入したい場合は、次のようにします。Const ninzu As Integer = 5
Dim hairetu(2) As Integer 組 み 込 み 定 数 の 具
体的な例は、57ペー ジなどを参考にしてく ださい。
一方、動的配列とは、宣言した時点では要素の数を決めず、コードの実行 中、状況に応じて要素数を変える配列変数のことです。動的配列の場合、 宣言時に「()」の中には何も入れません。 この状態ではまだ、配列変数hairetuにインデックスを指定して使用するこ とはできません。コードの実行中、Redimステートメントで、配列の要素数を 適宜設定・変更することができます。たとえば、次のステートメントを記述する と、それ以降の行では配列変数Hairetuを4要素の配列として使用できるよう になります。 この後も、Redimステートメントを使って何度でも配列の要素数を再設定 することができます。ただし、普通にRedimステートメントを使った場合、配列 の各要素に代入されたデータはすべて失われてしまいます。代入された データを残したまま要素数を変更したい場合は、Preserveキーワードを使っ て、次のように記述します。 なお、ここで紹介した形式の配列は1次元配列と呼ばれます。インデックス 番号を2つ指定した場合は、それぞれがいわば行番号と列番号を表し、行数 ×列数分の要素を配列で処理できるようになります。このような配列を2次 元配列といいます。 hairetu(1) = 5
Dim hairetu() As Integer
Redim hairetu(3)
Redim Preserve hairetu(5)
VBAでは仕様的には 60次元までの配列を 扱 え ま す。2 次 元 以 上 の 配 列 に つ い て は、ここでは説明を省 略します。
1-4 条件分岐
■
比較演算子と論理演算子
何らかの条件、たとえば文書に何らかの文章が入力されているかどうかと いった条件を設定し、それをチェックした結果に応じてそれぞれ異なる処理 を実行するといったことが可能です。このような条件分岐の処理には、通常、 Ifというキーワードと、比較演算子や論理演算子、または条件判断に利用で きるVBAの組み込み関数などを使用します。 VBAで使用できる比較演算子には、以下のような種類があります。いずれ も、2つの式を比較してTrueまたはFalseを返します。 また、比較演算子などを使った論理式に対して、さらに次のような論理演 算子が使用できます。 演算子 使い方 機能 = 式1 = 式2 式1と式2が等しければTrue > 式1 > 式2 式1が式2より大きければTrue < 式1 < 式2 式1が式2より小さければTrue >= 式1 >= 式2 式1が式2以上であればTrue <= 式1 <= 式2 式1が式2以下であればTrue <> 式1 <> 式2 式1と式2が等しくなければTrueLike 文字列式 Like パターン 文字列式がパターンにマッチすればTrue
Is オブジェクト1 Is オブジェ クト2 両者が同じオブジェクトを参照していれ ばTrue 演算子 使い方 機能 And 式1 And 式2 式1と式2の論理積(式1かつ式2) Or 式1 Or 式2 式1と式2の論理和(式1または式2) Not Not 式 式の論理否定 Xor 式1 Xor 式2 式1と式2の排他的論理和 Eqv 式1 Eqv 式2 式1と式2の論理等価演算 Imp 式1 Imp 式2 式1と式2の論理包括演算 VBAでは論理値True は -1、False は 0 と 等 価です。
なお、条件判断に利用できるVBAの組み込み関数としては、数値かどう かを調べるIsNumeric関数、日付かどうかを調べるIsDate関数など、「Is」で 始まるいくつかの関数が存在します。
■
1行のIfステートメント
Ifキーワードを使って条件分岐を行うIfステートメントには、1行だけで終わ る記述方法と、複数行に渡る記述方法とがあります。1行のステートメントに は、以下のようなパターンがあります。 パターン1では、条件式の評価結果がTrueであれば、Thenの後の処理を 実行します。次の例は、現在Wordで複数の文書が開かれていれば「OK」と いうメッセージを表示するステートメントです。 なお、このコードのCountは、コレクション(この場合は開かれているすべて の文書を表すDocumentsコレクション)に含まれているオブジェクトの数を表 すプロパティです。 パターン2では、条件式の評価結果がTrueであれば処理1を、Falseであ れば処理2を実行します。次の例は、文書が1つだけ開かれていれば「OK」、 そうでなければ「NG」というメッセージを表示するステートメントです。■
複数行のIfステートメント
条件判断を行って実行したい処理が1つだけであれば1行のIfステートメン トで記述できますが、ある条件を満たす場合に実行したい処理が複数である こともあります。そのような場合には、Ifステートメントを複数行に渡って記述 することもできます。この方法としては、次の3つのパターンがあります。 こ れ ら の 関 数 は、い ずれも結果をTrue/ Falseで返します。 If 条件式 Then 処理 If 条件式 Then 処理1 Else 処理2 【書式】 パターン1 パターン2If Documents.Count > 1 Then MsgBox "OK"
If Documents.Count = 1 Then MsgBox "OK" Else MsgBox "NG"
Count プ ロ パ テ ィ は、 ほとんどのコレクション で使用できます。 Sample file Pt1P047_01.docm Sample file Pt1P047_02.docm
いずれのパターンも、処理グループの部分には1行以上のステートメントを 記述することができます。パターン1は条件式の評価結果がTrueの場合に処 理グループを実行するだけですが、パターン2では評価結果がTrueであれば 処理グループ1を、Falseであれば処理グループ2を実行します。 パターン3は、最初の条件式の評価結果がFalseだった場合に、さらに別 の条件式を設定できる記述方法です。ここでは「ElseIf」の行は1つだけです が、さらにElseIfを重ねて複数の条件式を設定することができます。また、設 定した条件式のいずれにも該当しない場合の処理を設定したい場合、最後 に「Else」の処理を付けることも可能です。 次の例は、開かれているドキュメントの数に応じて異なるメッセージを表示 するコードです。いずれの場合にも複数の処理を記述できますが、サンプル が長くなりすぎるので、ここではそれぞれ1行ずつの処理にしています。 If 条件式 Then 処理グループ End If If 条件式 Then 処理グループ1 Else 処理グループ2 End If If 条件式1 Then 処理グループ1 ElseIf 条件式2 Then 処理グループ2 End If 【書式】 パターン1 パターン2 パターン3 If Documents.Count > 5 Then MsgBox "多い"
ElseIf Documents.Count > 3 Then 1
2 3 Sample file
■
Select Caseステートメント
条件に応じて行いたい処理の種類が多い場合、「If」と「ElseIf」を組み合 わせて記述することもできますが、前述の例でいうと「Document.Count」の ような部分を何度も重複して記述する必要があります。
このようなときに使うと便利なのがSelect Caseステートメントです。Select Caseは、次のような書式で使用します。 評価式には、評価したい値を求める式を指定します。その結果が値1であ れば処理グループ1を、値2であれば処理グループ2を……といった具合で、 いくつでも処理のグループを追加できます。各処理グループには、いずれも1 行以上のステートメントを記述可能です。また、「Case」の後の各値には、以 下のような指定方法があります。 ①値そのもの 評価式の結果が指定した値そのものだった場合に、その処理グループを 実行します。 ②範囲指定 MsgBox "やや多め"
ElseIf Documents.Count > 1 Then MsgBox "普通" Else MsgBox "少ない" End If 4 5 6 7 8 9 Select Case 評価式 Case 値1 処理グループ1 Case 値2 処理グループ2 : End Select 【書式】 同じ内容の式であれ ば、その評価は一度 で済ませたほうがコー ドの処理効率も向上 します。
「To」キーワードを使って範囲を指定することができます。たとえば、「Case 2 To 4」のように指定すると、評価式の結果が2から4の範囲内だった場合 に、その処理グループを実行します。 ③比較 「Is」キーワードと比較演算子を使用して、評価式の結果を特定の値と比 較するような条件を設定することができます。この場合のIsキーワードは比較 演算子のIsとは異なり、評価式の結果の値そのものを表しています。たとえ ば、「Case Is >= 3」のように指定すると、評価式の結果が3以上であった場 合に、その処理グループを実行します。 ④複数の値 「,」(カンマ)で区切って複数の値を並べると、評価式の結果がそのいずれ かであった場合に、その処理グループを実行します。また、この場合の「値」 は、上の①~③の方法で指定することも可能です。 ⑤その他 「Case Else」とすると、評価式の結果が上記のいずれにも当てはまらない 場合に、その処理グループを実行します。 また、各Caseは上から順番にチェックされていきます。評価式の結果が いずれかのCaseに該当した場合は、その処理グループが実行され、それ以 降のCaseはチェックされません。したがって、評価式の結果が複数のCase に該当する場合でも、より上にあるCaseの処理しか実行されないので注意し てください。次のコードは、Select Caseステートメントの使用例です。
Select Case Documents.Count Case 1 MsgBox "少ない" Case 2 To 5 MsgBox "普通" Case 10, 15, 20 To 30 MsgBox "特定の数" Case Is > 30 MsgBox "多い" Case Else MsgBox "特定の数以外" End Select 1 2 3 4 5 6 7 8 9 10 11 12 Sample file Pt1P050_01.docm
1-5 繰り返し処理
■
Do...Loopステートメント
繰り返し処理とは、同じ処理を何度も連続して実行するものです。処理の 内容そのものを記述するのは一度だけで、指定した条件に応じた回数だけ、 その処理が繰り返されます。VBAで繰り返し処理を実現する方法はいくつか ありますが、まずDo...Loopステートメントから紹介します。 このステートメントの最もシンプルな使用方法は次のようなものです。 このように記述することで、処理グループの部分(複数行も可)を無制限に 繰り返します。ただ、本当に無制限に実行させてしまってはプログラムが終了 しないので、何らかの仕組みで繰り返し処理を終了する必要があります。通常、これにはDoキーワード(またはLoopキーワード)と、Whileキーワード
またはUntilキーワードを組み合わせます。上の書式の「Do」の行を次のよう に変更すると、条件式の評価結果がTrueである間は繰り返し処理を実行し ます。逆に言うと、条件式がFalseになったところで繰り返しを終了し、処理を その次の行へ進めます。 たとえば、次のコードは、変数iの値が5未満である間、iの値をメッセージ ボックスに表示します。 Do 処理グループ Loop 【書式】 Do While 条件式 【書式】 Do While i < 5 i = i + 1
MsgBox "変数iの値:" & i Loop 1 2 3 4 Sample file Pt1P051_01.docm 掲 載 し た サ ン プ ル コ ー ド で は 変 数 を 宣 言なしで 使用 してい ますが、宣言を行わ なくても実行は可能 です。サンプルファイ ル中のコードでは、変 数の宣言を行ってい ます(以下同)。
変数iの初期値は0なので、最初の「i = i + 1」でiの値が1になり、以後、こ の処理が繰り返されるたびにiの値が1ずつ増えていきます。 一方、「Do」の行を次のように変更すると、条件式の評価結果がTrueに なったところで繰り返し処理を終了します。 次のコードは、変数iの値が5になるまで、iの値をメッセージボックスに表示 します。結果として、先のコードと同じ内容の処理になります。 なお、WhileやUntilは、Doの側ではなくLoopの側に付けることもできま す。どちらもほぼ同じ結果になりますが、処理の内容によっては違いが生じる 場合もあるので注意が必要です。 また、より複雑な条件で繰り返し処理を終了したい場合は、DoとLoopの 中でIfステートメントなどを使用し、条件を満たした場合のみ繰り返し処理を 抜けるという方法もあります。このような目的には、「Exit Do」という命令を使 用します。次の例も、やはり変数iの値が5になったときに繰り返し処理を終了 するものです。
■
For...Nextステートメント
繰り返し処理を行う回数が最初から決まっている場合は、For...Nextス Do Until 条件式 【書式】 Do Until i = 5 i = i + 1MsgBox "変数iの値:" & i Loop 1 2 3 4 Do i = i + 1
MsgBox "変数iの値:" & i If i = 5 Then Exit Do Loop 1 2 3 4 5 Sample file Pt1P052_01.docm Sample file Pt1P052_02.docm
テートメントを利用するのが便利です。For...Nextステートメントは、次のような 書式で使用します。 変数に指定された変数に、初期値から終了値までの値が自動的に1ずつ 変化して、処理グループの内容が繰り返し実行されます。次のコードは、変 数iの値が1から5になるまで、iの値を繰り返しメッセージボックスに表示するも のです。 Do...Loopステートメントの例と同じ処理ですが、こちらの場合は、変数iに1 を加えるという操作を行う必要はありません。また、「i」という変数名を「Next」 の後にも付けていますが、これは省略することもできます。ただ、For...Nextス テートメントを二重に使用した場合などに、繰り返し処理の始まりと終わりの対 応関係がわかりやすくなるので、付けておくことをお勧めします。 また、初期値から終了値までは、特に指定しない場合は自動的に1ずつ 増加しますが、この変化の量を指定することも可能です。このような目的には Stepキーワードを使用します。1行目を次のように変えると、変数iの値は2か ら14まで、3ずつ増加していきます。 この場合、iの値は2、5、8、11、14に変化します。初期値を終了値よりも 大きくし、Stepにマイナスの値を指定することで、変数の値を順番に減らして いくこともできます。1行目を次のようにすると、変数iの値は6から0まで、2ず つ減っていきます。 For 変数 = 初期値 To 終了値 処理グループ Next 変数 【書式】 For i = 1 To 5
MsgBox "変数iの値:" & i Next i 1 2 3 For i = 2 To 14 Step 3 1 Sample file Pt1P053_01.docm Sample file Pt1P053_02.docm
この場合、iの値は6、4、2、0に変化します。
■
For Each...Nextステートメント
コレクションに含まれている各オブジェクトに対して同じ処理を繰り返し実行 したい場合は、For Each...Nextステートメントを利用するのが便利です。ま た、このステートメントは、配列の各要素に対して同じ処理を実行したい場合 にも利用できます。For Each...Nextステートメントは、次のような書式で使用 します。 変数に指定された変数に、コレクションに含まれる各オブジェクトがセットさ れ、処理グループの内容が繰り返されます。コレクションではなく配列の場合 は、その各要素が変数に代入されて、やはり繰り返し処理が実行されます。 次のコードは、Wordで開かれているすべての文書のファイル名をメッセージ ボックスに表示するものです。 なお、「Next」側の変数名(ここではDc)は省略も可能ですが、For...Next ステートメントと同じ理由で、付けておくことをお勧めします。 For i = 6 To 0 Step -2 1 For Each 変数 In コレクション(または配列) 処理グループ Next 変数 【書式】For Each Ds In Documents MsgBox Ds.Name Next Ds
1 2 3
For Each Dc In Documents MsgBox Dc.Name Next Dc Sample file Pt1P054_01.docm Sample file Pt1P054_02.docm