Office 2010 VBA の基礎知識

概要 : プログラマーではないユーザーを対象として、Visual Basic for Applications (VBA) プログラミングを使用して Microsoft Office 2010 を拡張する基本的な方法を紹介します。VBA 言語の全体的な概要、さまざまな Office 2010 アプリケーションで VBA にアクセスする際の詳細な手順、単純なプログラミング例、サンプル アプリケーションなどについて説明します (13 ページ)。

適用対象: Access 2010 | Excel 2010 | Office 2007 | Office 2010 | Open XML | PowerPoint 2010 | Publisher 2010 | SharePoint Server 2010 | VBA | Word 2010

この記事の内容
Office 2010 での VBA プログラミング
VBA を使用する状況と理由
VBA プログラミングの基礎
プログラミングのヒントとコツ
より高度なプログラミング
実用的な Office 2010 サンプル コード
まとめ
その他の技術情報

Applies to:    Microsoft Word 2010 | Microsoft Outlook 2010 | Microsoft Access 2010 | Microsoft Excel 2010 | Microsoft PowerPoint 2010 | Microsoft Publisher 2010

公開日:  2009 年 11 月

提供元:   Tim Burnett、Kingfisher Computer Consulting

目次

  • Applies to:    Microsoft Word 2010 | Microsoft Outlook 2010 | Microsoft Access 2010 | Microsoft Excel 2010 | Microsoft PowerPoint 2010 | Microsoft Publisher 2010公開日:  2009 年 11 月提供元:   Tim Burnett、Kingfisher Computer Consulting目次概要Office 2010 での VBA プログラミングVBA を使用する状況と理由VBA プログラミングの基礎プログラミングのヒントとコツより高度なプログラミング 実用的な Office 2010 サンプル コードまとめその他の技術情報

  • Office 2010 での VBA プログラミング

  • VBA を使用する状況と理由

  • VBA プログラミングの基礎

  • プログラミングのヒントとコツ

  • より高度なプログラミング

  • 実用的な Office 2010 サンプル コード

  • まとめ

  • その他の技術情報

Office 2010 での VBA プログラミング

Word 2010 で 50 個の表を繰り返しクリーンアップしていませんか。特定の文書が開かれたときに、入力を求めるようにする必要はありませんか。Microsoft Outlook 2010 の連絡先を Microsoft Excel 2010 のスプレッドシートに効率よく転記する方法を求めてはいませんか。

VBA for Office 2010 を使用すると、これらの作業を実行し、さらにそれ以上のことを実現できます。VBA for Office 2010 は、単純でありながら強力なプログラミング言語であり、Office 2010 アプリケーションを拡張するために使用できます。

この記事の内容は、VBA について学ぶことを希望したり、Office 2010 をカスタマイズする作業にプログラミングを役立てる方法について詳しく知ることを望む、経験ある Office ユーザーのために書かれています。

Office 2010 アプリケーション スイートには、豊富な機能が用意されています。文書、電子メール、データベース、フォーム、スプレッドシート、およびプレゼンテーションを多数の異なる方法で作成、書式設定、および操作することができます。Office 2010 において VBA プログラミングが提供する大きなメリットは、マウス、キーボード、またはダイアログ ボックスで実行できるほとんどすべての操作が VBA を使用しても行えることです。さらに、いったん VBA を使用して実行可能になったことは、簡単に 100 回繰り返すことができます (実際、タスクを自動で繰り返し実行することは、Office で最も一般的な VBA の使い方です)。

VBA では、日常の作業を効率化するだけでなく、Office 2010 アプリケーションに新しい機能を追加したり、それぞれのビジネス ニーズに合わせた方法でドキュメントのユーザーに操作を促したりユーザーと対話したりすることもできます。たとえば、文書を最初に保存しようとしたときに、特定のネットワーク ドライブに保存するように指示するポップアップ メッセージを表示することも、VBA コードを作成して実行できます。

以下では、VBA プログラミングを活用する主な理由について説明します。VBA 言語の概要を解説し、ソリューションを操作するためにすぐに使用できるツールについて説明します。締めくくりとして、一般的なプログラミングのフラストレーションと手違いを避けるためのヒントと手法を示します。

VBA を使用する状況と理由

Office 2010 で VBA プログラミングの使用を検討するのは、主に次の 3 つの理由からです。

自動実行と繰り返し

VBA は、特定の書式の設定や問題の修正を繰り返し実行するソリューションを作成するには、効果的で効率の良い手段です。たとえば、Word で各ページの最初の段落にのみ別のスタイルを設定したことはないでしょうか。Excel から Word 文書または Outlook の電子メールに貼り付けた複数の表に、書式の再設定が必要になったことはないでしょうか。同じ変更作業を複数の Outlook の連絡先に行う必要に迫られたことはないでしょうか。

変更を 10 回または 20 回以上繰り返す必要がある場合、VBA を使用してこの操作を自動化すると便利です。変更を数百回繰り返す必要があるのなら、VBA の使用には確実にメリットがあります。手動で行えるほとんどすべての書式設定や編集の操作は、VBA でも実行することができます。

ユーザーとの対話を拡張する

ときとして、Office 2010 アプリケーションまたは文書との対話型の操作をユーザーに促す、または強制するために、標準アプリケーションの一部ではない手段を使用する必要に迫られることもあります。たとえば、文書を開く、保存する、または印刷するときに特定のアクションを行うようにユーザーに求めることがあります。

Office 2010 アプリケーション間の対話

Outlook 2010 からすべての連絡先を Word 2010 にコピーし、それらに特定の方法で書式を設定する必要はないですか。または、Excel 2010 からデータを一連の PowerPoint 2010 スライドに移動する必要はないですか。ときには、コピーと貼り付けが期待した結果にならなかったり、時間がかかり過ぎたりすることもあります。VBA プログラミングを使用すると、同時に 2 つ以上の Office 2010 アプリケーションの個別の機能を対話型で操作してから、アプリケーションのコンテンツを別のアプリケーションのコンテンツに基づいて変更することができます。

別の方法で実現する

VBA プログラミングは強力なソリューションですが、常に最適なアプローチであるとは限りません。目的によっては、別の手段を選択するほうが適切な場合もあります。

まず、もっと簡単な方法がないかを確認します。VBA プロジェクトを開始する前に、組み込みのツールや標準機能で実現できないか検討してください。たとえば、時間のかかる編集やレイアウトの作業がある場合、スタイルやアクセラレータ キーを使用して問題を解決できるかどうかを検討します。最初の一回だけその操作を行って、Ctrl + Y キー (やり直し) でその操作を繰り返すという方法も検討してみてください。正しい書式やテンプレートを使用して新しい文書を作成してから、コンテンツをこの文書にコピーすることはできないでしょうか。

Office 2010 アプリケーションの機能は強力です。必要とするソリューションが既に用意されている可能性があります。プログラミングに飛び付く前に、Office 2010 についてもう少し学んでみてください。

VBA プロジェクトを開始する前に、VBA の作業に必要な時間を確保してください。プログラミングには作業に専念できる時間が必要となり、その作業にかかる時間数は予測できないこともあります。特に初心者の場合は、注意深く作業できる時間を確保せずにプログラミングを始めることはしないようにしてください。期限が迫っているときに、"間に合わせのスクリプト" を記述して問題を解決しようとすると、深刻な状況に陥ることがあります。時間がないときは、単調で繰り返しが多いとしても標準的な手段を利用してください。

VBA プログラミングの基礎

コードを使用してアプリケーションに処理を実行させる

コードを記述することは謎の多い難解な作業に思われることもありますが、その基本原理は日常的論理に基づいていて理解しやすいものです。Office 2010 アプリケーションは "オブジェクト" という概念を公開するように開発されており、各オブジェクトは命令を受け取ることができます。これは、電話機にボタンがあり、ボタンを介して電話機に操作を伝えるのと似ています。あるボタンを押すと電話機は命令を認識し、ダイヤルする番号を順序に従って受け取ります。プログラミングの世界では、アプリケーションとやり取りするためにそのアプリケーションに含まれる各種 "オブジェクト" に命令を送ります。さまざまなオブジェクトが用意されていますが、それぞれに制約があります。各オブジェクトはデザインされている機能だけを実行でき、命令されたことだけを実行します。

たとえば、文書を Word 2010 で開き、若干の変更を行ってから保存し、最後に閉じるとします。VBA プログラミングの世界では、Word 2010 は Document オブジェクトを公開します。VBA コードを使用して、Document オブジェクトに対して Open、Save、Close などの動作を指示することができます。

以下に、オブジェクトがどのような方法で整理されているかを説明します。

オブジェクト モデル

プログラミング オブジェクトは階層構造で開発され、そのような階層をアプリケーションの "オブジェクト モデル" といいます。たとえば、Word のトップレベルの Application オブジェクトには、Document オブジェクトが含まれます。さらに Document オブジェクトには Paragraph オブジェクトが含まれ、以降も同様の構造となっています。オブジェクト モデルは、ユーザー インターフェイス上に見えるものをおおまかに反映します。アプリケーションとその機能の概念上のマップが、オブジェクト モデルです。

オブジェクトの定義は "クラス" と呼ばれるので、オブジェクトとクラスは同じものを指す用語としてよく登場します。技術的にはクラスとは、オブジェクトを作成 ("インスタンス化") するために使用される記述またはテンプレートを指します。

オブジェクトを作成した後は、そのオブジェクトの "プロパティ" を設定したり、"メソッド" を呼び出したりすることによって、オブジェクトを操作できます。オブジェクトが名詞だとすると、プロパティはその名詞を修飾する形容詞、メソッドはその名詞の述語となる動詞です。プロパティを変更すると、オブジェクトの外観や動作が変わります。オブジェクトのメソッドを呼び出すと、オブジェクトにアクションを実行させることができます。

この記事の VBA コードは、動作中の Office 2010 アプリケーションに対して実行します。アプリケーションでは、コードによって操作される多数のオブジェクトが既に稼働しています。たとえば、アプリケーション本体 (Application)、Excel 2010 の Worksheet 、Word 2010 の Document 、PowerPoint 2010 の Presentation 、Outlook 2010 の Explorer および Folder は、いずれもオブジェクトです。オブジェクト モデルの基本レイアウトと、アプリケーションの現在の状態にアクセスするために使用できる Application の主なプロパティについて理解できれば、Office 内で VBA を使用して Office 2010 アプリケーションを拡張したり操作したりすることができます。

メソッド

たとえば、Word では、現在の Word 文書のプロパティを変更し、メソッドを呼び出すには、Application オブジェクトの ActiveDocument プロパティを使用します。この ActiveDocument プロパティは、Word アプリケーションで現在アクティブになっている Document オブジェクトへの参照を返します。"~への参照を返す" とは、"~へアクセスできるようにする" ことを意味します。

次のコードは、文字どおりの処理を実行します。つまり、アプリケーション内のアクティブな文書を保存します。

Application.ActiveDocument.Save

このコードを左から順に見ていくと、"この Application 内で、ActiveDocument によって参照される Document を使用して、Save メソッドを呼び出す" と書かれています。Save がメソッドの最も単純な形式であることに注意してください。細かい指示を与える必要はありません。Document オブジェクトを Save するように指示する場合、それ以上の入力を与える必要はありません。

メソッドが他の情報を必要とする場合、そのような詳細な情報は "パラメーター" と呼ばれます。次のコードは、SaveAs メソッドを実行します。このメソッドは、ファイルの新しい名前を受け取る必要があります。

Application.ActiveDocument.SaveAs ("New Document Name.docx")

メソッド名の直後にかっこで囲んで記述する値が、パラメーターです。ここでは、ファイルの新しい名前が SaveAs メソッドのパラメーターです。

プロパティ

プロパティを設定する構文は、プロパティを読み取るときの構文と同じです。次のコードは、Excel 2010 内でセル A1 を選択し、そのセルに値を入力するためにプロパティを設定するメソッドを実行します。

    Application.ActiveSheet.Range("A1").Select
    Application.Selection.Value = "Hello World"

VBA プログラミングの学習で最初に訪れる試練は、各 Office 2010 アプリケーションのオブジェクト モデルを把握し、オブジェクト、メソッド、またはプロパティの構文を読み解くことです。オブジェクト モデルはすべての Office 2010 アプリケーションで類似していますが、アプリケーションごとに扱う文書とオブジェクトの種類に依存する固有の部分があります。

このコード スニペットの 1 行目には Application オブジェクト (ここでは Excel 2010) があり、その直後には、アクティブなワークシートへのアクセスを提供する ActiveSheet オブジェクトがあります。その次にある見慣れない用語 "Range" は、"セル範囲をこのように定義する" という意味です。このコードは Range に対して、A1 のみを定義済みのセルのセットとしてセル範囲を作成することを指示します。つまり、コードの 1 行目では Range というオブジェクトを定義し、メソッドを実行してそれを選択します。その結果は Application の別のプロパティである Selection に自動的に保管されます。

コードの 2 行目は、Selection の Value プロパティをテキスト "Hello World" に設定し、この値をセル A1 に表示します。

おそらく最も簡単に作成できる VBA コードは、使用中の Office アプリケーション内のオブジェクトにアクセスし、プロパティを設定するだけのコードです。たとえば、VBA スクリプトを使用して Word の表にある行にアクセスし、表の書式を変更できます。単純に聞こえますが、これができると非常に便利です。コードを書いてさえおけば、プログラミングの威力を最大限に活用して、同じ変更を複数の表または文書に対して行ったり、変更を特定の論理や条件に従って実行したりすることができます。コンピューターにとって 10 回の変更も 100 回の変更も違いはないので、文書や問題の規模が大きいほど得られるスケール メリットも大きくなります。これこそが、VBA がその真価を発揮し、時間の節約をもたらす状況です。

マクロと Visual Basic Editor

これで Office 2010 アプリケーションから公開されるオブジェクト モデルについてはある程度わかったので、この知識を生かしてオブジェクトのメソッドを呼び出し、オブジェクトのプロパティを設定し、オブジェクトのイベントに応答してみることにしましょう。これらの操作を行うには、Office が認識できる場所および方法でコードを記述する必要があります。一般には Visual Basic Editor を使用します。これは既定でインストールされますが、リボン上で有効になるまではほとんどのユーザーは存在することさえ知りません。

[開発] タブを開く

すべての Office 2010 アプリケーションはリボンを使用します。このリボンにある [開発] タブから、Visual Basic Editor とその他の開発者ツールを使用できます。既定では Office 2010 に [開発] タブは表示されないので、以下の手順でこれを有効にする必要があります。

[開発] タブを有効にするには

  1. [ファイル] タブの [オプション] をクリックして [オプション] ダイアログ ボックスを表示します。

  2. ダイアログ ボックスの左側にある [リボンのユーザー設定] をクリックします。

  3. ダイアログ ボックスの左側にある [コマンドの選択] で、[基本的なコマンド] を選択します。

  4. ダイアログ ボックスの右側にある [リボンのユーザー設定] のドロップダウン リストから [メイン タブ] を選択し、[開発] チェック ボックスをオンにします。

  5. [OK] をクリックします。

注意

Office 2007 で [開発] タブを表示するには、Office ボタンをクリックし、[オプション] をクリックし、次に [オプション] ダイアログ ボックスの [基本設定] カテゴリで [[開発] タブをリボンに表示する] チェック ボックスをオンにしていました。

[開発] タブを有効にすると、そこに [Visual Basic] ボタンと [マクロ] ボタンがあることもすぐにわかります。

図 1. [開発] タブのボタン

[開発] タブのボタン

セキュリティの問題

Office 2010 のユーザーをウイルスと危険なマクロ コードから保護するため、標準のファイル拡張子が付けられた標準の Office 2010 文書にマクロ コードを保存することは禁止されています。マクロ コードは、特別な拡張子付きのファイルに保存する必要があります。たとえば、マクロを .docx 拡張子付きの標準 Word 2010 文書に保存することはできませんが, .docm 拡張子付きの特別な Word 2010 マクロ有効文書に保存することはできます。

.docm ファイルを開くと、Office 2010 のセキュリティ設定によっては文書内でのマクロの実行が禁止されている場合があり、そのことを通知するメッセージも表示されないことがあります。すべての Office 2010 アプリケーションでセキュリティ センターの設定とオプションを調べてください。既定ではマクロの実行は無効になっていますが、マクロが無効にされていることを警告するメッセージが表示され、その文書に関してマクロを有効にするオプションが提示されます。

マクロを実行できる特定のフォルダーを指定するには、信頼できる場所、信頼済みドキュメント、または信頼できる発行元を作成します。最も移植性に優れたオプションは、信頼できる発行元を使用する方法です。信頼できる発行元は、配布するデジタル付き署名文書と共に使用できます。特定の Office 2010 アプリケーションのセキュリティ設定の詳細については、[オプション] ダイアログ ボックスを開き、[セキュリティ センター] をクリックし、[セキュリティ センターの設定] をクリックすると確認できます。

注意

Outlook 2010 などの一部の Office 2010 アプリケーションでは、マクロは既定でローカル コンピューターのマスター テンプレートに保存されます。この方法は自身のコンピューターで自作のマクロを実行するときにセキュリティ問題を減らしますが、マクロを配布する場合には展開の手段が必要になります。

マクロの記録

[開発] タブの [マクロ] ボタンをクリックすると、[マクロ] ダイアログ ボックスが表示されます。ここから、特定の文書またはアプリケーションからアクセスできる VBA サブルーチンまたはマクロにアクセスできます。[Visual Basic] ボタンをクリックすると、Visual Basic Editor が表示され、VBA コードの作成と編集を行うことができます。

Word 2010 および Excel 2010 の [開発] タブには [マクロの記録] という別のボタンがあり、これをクリックすると、アプリケーションで実行したアクションを再現できる VBA コードが自動的に生成されます。[マクロの記録] は、VBA の学習を深めるには絶好のツールです。この機能によって生成されるコードを読み解くことで VBA をより深く理解することができ、ユーザーとしての Office 2010 の知識とプログラマーとしての知識を確実に結び付けることができます。1 つだけ注意する必要があるのは、マクロのエディターはユーザーが何を意図しているかを仮定して機能するため、その仮定が正確でないと、生成されたコードがあいまいになることです。

マクロを記録するには

  1. Excel 2010 で新しいブックを開き、リボンの [開発] タブをクリックします。[マクロの記録] をクリックし、[マクロの記録] ダイアログ ボックスですべての既定の設定を使用します。これにより、マクロの名前は "Macro1" となり、保存先は "作業中のブック" となります。

  2. マクロの記録を開始するには [OK] をクリックします。ボタンに表示されるテキストが [記録終了] に変わることに注意してください。記録するアクションを完了したら、このボタンをクリックします。

  3. セル B1 をクリックし、プログラマーが伝統的に使う最初の文字列である「Hello World」を入力します。入力を終えたら、[記録終了] ボタンを見てください。灰色表示になっているはずです。これは、セルへの値の入力が終了するのを Excel 2010 が待っているからです。

  4. セル B2 をクリックして セル B1 へのアクションを完了し、[記録終了] をクリックします。

  5. [開発] タブの [ マクロ] をクリックし、まだ選択されていなければ [Macro1] を選択し、[編集] をクリックして Macro1 のコードを Visual Basic Editor に表示します。

図 2. Visual Basic Editor 内のマクロ コード

Visual Basic Editor 内のマクロ コード

コードを調べる

作成したマクロは、以下のようなコードになっているはずです。

Sub Macro1()
'
' Macro1 Macro
'
'
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "Hello World"
    Range("B2").Select
End Sub

セル A1 内のテキストを選択した前のコード スニペットとの類似点および相違点に注目してください。このコードは、セル B1 を選択してから、文字列 "Hello World" をアクティブになっていたセルに適用します。テキストを引用符で囲むのは、これが数値ではなく文字列値であることを示すためです。

[記録終了] ボタンを再び表示するためにセル B2 をクリックしたことを思い出してください。このアクションもコードの 1 行として現れます。マクロ レコーダーは、すべてのキーストロークを記録します。

アポストロフィで始まり、エディターには緑色の文字で表示されるコード行はコメントです。コメントは、コードについて説明したり、他のプログラマーにコードの目的を知らせたりするためのテキストです。VBA では、単一引用符で始まる行または行の一部は無視されます。わかりやすく適切なコメントをコードに記入することは重要なテーマですが、これについて語ることはこの記事の主旨を外れます。以下でこのコードについて触れるときは、これらの 4 行のコメント行は割愛します。

マクロ レコーダーでは、コードの生成時に複雑なアルゴリズムを使用して、ユーザーの意図するメソッドとプロパティが判断されます。見覚えがないプロパティがあっても、解釈の手がかりとなるリソースはたくさんあります。たとえば、記録したマクロの内部に、マクロ レコーダーによって ForumulaR1C1 プロパティを参照するコードが生成されたとします。このプロパティが何を意味するか、すぐにわかるでしょうか。

ヒント

注意 : Application オブジェクトはすべての VBA マクロに暗黙に含まれます。記録されたコードでは、各行の先頭で Application. を使用できます。

開発者用ヘルプ

記録したマクロの ForumulaR1C1 を選択し、F1 キーを押します。ヘルプ システムで検索が行われ、Excel 2010 ヘルプの Excel 2010 開発者用ヘルプ セクションに適切なトピックがあるかどうかが確認され、一覧に FormulaR1C1 プロパティが表示されます。このリンクをクリックすると詳細な情報を表示できますが、そうする前にウィンドウの下部近くに [Excel オブジェクト モデル リファレンス] というリンクがあることに注目してください。このリンクをクリックして Excel 2010 のオブジェクト モデルで使用される多数のオブジェクトを示す一覧を表示すると、ワークシートとそのコンポーネントに関する説明を参照できます。一覧でいずれかのオブジェクトをクリックすると、そのオブジェクトに対応するプロパティおよびメソッドと、別の関連トピックへの相互参照が表示されます。多くのヘルプ項目には、役に立つ簡単なコード サンプルも含まれています。たとえば、Borders オブジェクトの関連リンクを使用して VBA で罫線を設定する方法を参照できます。

Worksheets(1).Range("A1").Borders.LineStyle = xlDouble

コードの編集

この Borders コードと前に記録したマクロには相違が見られます。オブジェクト モデルのややこしい点の 1 つは、特定のオブジェクト (ここではセル A1) を扱う方法がいくつもあることです。

ときには、機能するコードの一部を変更してコードの動作がどのように変わるかを実地に試してみることが、プログラミングを習得する最適な方法であることもあります。これを試してみましょう。Macro1 を Visual Basic Editor に表示し、次のようにコードを変更してください。

Sub Macro1()
    Worksheets(1).Range("A1").Value = "Wow!"
    Worksheets(1).Range("A1").Borders.LineStyle = xlDouble
End Sub

ヒント

入力ミスを避けるため、コードを編集するときはできる限りコピーと貼り付けを使用します。

コードを試すためにその都度保存する必要はありません。Excel 2010 文書に戻り、[開発] タブの [マクロ] をクリックし、[Macro1] をクリックし、[実行] をクリックします。セル A1 にテキスト "Wow!" が収められ、その周囲に罫線が二重線のスタイルで表示されます。

図 3. 最初のマクロの実行結果

最初のマクロの実行結果

 

マクロの記録を組み合わせ、オブジェクト モデルのドキュメントを参照し、単純なプログラミングを行うだけで、機能する VBA プログラムを作成できました。成功です。

期待どおりに動作しないときは、VBA のデバッグ関連情報を参照してください。

プログラミングのヒントとコツ

サンプルを土台とする

VBA には大規模なコミュニティがあります。Web を検索すると、求めている機能とよく似た機能を備えたサンプル VBA コードがたいてい見つかります。適切なサンプルが見当たらなければ、タスクをより小さな単位に分割し、それぞれについて検索を行ってみるか、問題の性質は同じままで、より一般的な解釈に替えて試してみます。サンプルを土台とすることは、開発時間の節約になります。

ただし、十分に考え抜かれて記述された無料のコードが Web で出番を待っているとは思わないでください。実際には、見つかるコードの多くにバグや誤りが含まれます。オンラインで見つかったり、VBA のドキュメントから入手できるサンプルを利用すれば、出発点を前に進めることができる、というのがこの方法の発想です。プログラミングの習得には時間と思考力が必要とされます。問題を解決しようと別のソリューションに性急に飛び付く前に、その問題に VBA が適しているかどうかを冷静に検討してください。

問題を単純化する

プログラミングはあっという間に複雑になります。そのため、特に初心者にとっては、問題をできる限り小さい論理単位に分割してから、それぞれのコードを単独で記述し、テストすることが不可欠です。取り組むコードが多すぎて混乱したり収拾がつかなくなったりした場合は、作業を中断し、その問題を保留にします。後でその問題に再び取り組むときに、問題の一部を新しいモジュールとして切り出して、その部分を解決し、コードが機能するようにし、最後にテストして機能の正常性を確認します。その後で、次の部分の記述に進んでください。

バグとデバッグ

プログラミング エラーには、主に 2 つの種類があります。"構文" エラーは、プログラミング言語の文法規則に反すると発生し、"実行時"エラーは、構文としては正しく見えても VBA がコードの実行に失敗すると発生します。

修正には手間取ることもありますが、構文エラーを見つけることは簡単です。入力したコードに構文エラーがあると、Visual Basic Editor が警告音を鳴らし、エラー部分の表示を強調します。

たとえば、VBA では文字列を二重引用符で囲む必要があります。単一引用符を使うとどうなるかは、Visual Basic Editor に戻ってコード例の "Wow!" 文字列を 'Wow!' (Wow という単語を単一引用符で囲む) に書き換えるとわかります。次の行をクリックすると、Visual Basic Editor が反応します。表示されるエラー "コンパイル エラー : 修正候補 : 式" はあまり役に立ちませんが、エラーが発生した行が赤い字で表示されて、その行に構文エラーがあり、その結果、このプログラムは動作しないことが通知されます。

[OK] をクリックし、テキストを "Wow!" に戻します。

実行時エラーを見つけることは、構文エラーの場合よりも困難です。プログラミングの構文は正しく見えますが、VBA がコードを実行しようとする時点で失敗するからです。

たとえば、Visual Basic Editor を開き、マクロの Value プロパティの名前を ValueX に変更すると、故意に実行時エラーを起こすことができます。Range オブジェクトには ValueX という名前のプロパティは存在しないからです。Excel 2010 文書に戻り、[マクロ] ダイアログ ボックスを表示して Macro1 を再実行してください。実行時エラーについて説明するテキスト "オブジェクトは、このプロパティまたはメソッドをサポートしていません。" を含む Visual Basic メッセージが表示されます。このメッセージからも原因は明らかですが、より詳細な情報を表示するには [デバッグ] をクリックします。

Visual Basic Editor に戻ると、特別なデバッグ モードに切り替わり、実行に失敗したコード行が黄色で強調表示されます。予想どおり、ValueX プロパティを記述した行の表示が強調されています。

図 4. 実行中の Visual Basic デバッガー

実行中の Visual Basic デバッガー

 

実行中の VBA コードを変更できるので、ValueX を Value に戻し、[デバッグ] メニューの下にある小さな緑色の再生ボタンをクリックします。プログラムの実行が正常に戻るはずです。

もっと大きく複雑なプログラムについては、デバッガーをより慎重に使用する方法を学ぶことをお勧めします。少なくとも、コードを確認する必要がある場所で実行を停止するためにブレークポイントを設定する方法と、コードの実行中にさまざまな変数やプロパティの値を確認できるウォッチを追加する方法、およびコードを 1 行単位でステップ実行する方法は習得してください。これらのオプションはいずれも [デバッグ] メニューから使用できますが、デバッガーを使いこなそうとするなら、各機能に対応するキーボード ショートカットを覚えておくのが一般的です。

リファレンスの活用

Office 2010 ヘルプに組み込まれた開発者用リファレンスを表示するには、いずれかの Office 2010 アプリケーションでリボン上の疑問符をクリックするか F1 キーを押してヘルプ リファレンスを開きます。次に、内容をフィルター処理するために [検索] ボタンの右側にある下向き矢印をクリックします。[開発者用リファレンス] をクリックします。目次が左側パネルに表示されない場合は、小さな本のアイイコンをクリックしてパネルを開き、そこからオブジェクト モデルのリファレンスを展開します。

図 5. 開発者用ヘルプのフィルター処理はすべての Office 2010 アプリケーションに適用される

開発者ヘルプのフィルター

 

オブジェクト モデルのリファレンスは、時間をかけて閲覧するだけの価値があります。VBA 構文の基礎と使用中の Office 2010 アプリケーションのオブジェクト モデルについて理解できれば、手探りの作業から秩序あるプログラミングへと前進できます。

当然ですが、Office デベロッパー センターは、記事、ヒント、およびコミュニティ情報を得るには非常に便利なポータルです。

フォーラムとグループの検索

すべてのプログラマーは、いずれどこかで壁に突き当たります。探し出したリファレンス記事に残らず目を通し、夜を徹してさまざまな問題解決策を考えたとしてもです。幸いなことに、インターネットでは、互いのプログラミング上の問題に救いの手を差し伸べる開発者コミュニティが発達しています。

Web で "office 開発者 フォーラム" を検索すると、複数のディスカッション グループが見つかります。"office 開発" または問題に関する説明を検索テキストとすると、フォーラム、ブログ投稿、および記事も見つかります。

問題を解決するためにできることはやり尽くしたのであれば、遠慮しないで質問を開発者フォーラムに投稿してください。これらのフォーラムは新参のプログラマーからの投稿に寛容であり、多くの経験豊かな開発者が喜んで助言してくれます。

以下に、開発者フォーラムに投稿するときに注意すべき若干のエチケットについて説明します。

  • 質問を投稿する前に、サイトに FAQ、またはメンバーが従う必要があるガイドラインがないか探してください。投稿の内容がそれらのガイドラインに従っていることを確認し、フォーラムの正しいセクションに投稿します。

  • わかりやすく完結したコード サンプルを投稿に含めます。また、それが長いコードの一部である場合は、他人にもわかるようにコードを編集して明確なものにします。

  • 問題についてわかりやすく簡潔に説明し、解決するために試みた手順を要約して示します。できるだけ時間をかけて投稿を書くように心がけてください。焦っているときや急いでいるときほど、そうする必要があります。問題について初めて読む人にも筋が通るような状況説明を盛り込んでください。

  • 礼儀正しく振舞い、感謝の言葉を書き込むようにします。

より高度なプログラミング

この短い記事では VBA とプログラミングのさわりを紹介しただけに過ぎませんが、これが出発の足がかりとして役立つことを願っています。

以下に、その他の重要なトピックについて簡単に説明します。

変数

この記事で使用したサンプル コードでは、アプリケーションで既に作成されたオブジェクトを操作しました。独自のアプリケーションで一時的に使用する目的で、値または他のオブジェクトへの参照を保存するオブジェクトを独自に作成することもできます。これらは、変数と呼ばれます。

VBA で変数を使用するには、その変数が表すオブジェクトの種類を、Dim ステートメントを使って VBA に伝える必要があります。その後で、変数に値を設定してから、その変数を他の変数またはプロパティを設定するために使用できます。

    Dim MyStringVariable As String
    MyStringVariable = "Wow!"
    Worksheets(1).Range("A1").Value = MyStringVariable

分岐とループ

この記事で使用した単純なプログラムでは、コードを 1 行ずつ、上から下へ順番に実行しました。プログラミングの真価は、1 つ以上の条件を指定して、どのコード行を実行するかをその条件に基づいて決定できることにあります。同じ操作を多くの回数繰り返すことができる場合は、この機能をさらに拡張できます。以下の例は、Macro1 を拡張します。

Sub Macro1()
    If Worksheets(1).Range("A1").Value = "Yes!" Then
        Dim i As Integer
        For i = 2 To 10
            Worksheets(1).Range("A" & i).Value = "OK! " & i
        Next i
    Else
        MsgBox "Put Yes! in cell A1"
    End If
End Sub

このコードを Visual Basic Editor に入力するか貼り付けて、実行します。表示されるメッセージ ボックスの指示に従い、セル A1 のテキストを Wow! から Yes! に変更し、コードを再実行してループの効果を確かめてください。このコード スニペットは、変数、分岐、およびループの働きを具体的に示します。実際の動作を確かめた後でコードを読み解いて、各行の実行でどのような処理が行われるのかを確認してください。

実用的な Office 2010 サンプル コード

以下のいくつかのスクリプトを試してみてください。実際に存在する Office 2010 の問題を解決できます。

Outlook 2010 で電子メールを作成する

Sub MakeMessage()
    Dim OutlookMessage As Outlook.MailItem
    Set OutlookMessage = Application.CreateItem(olMailItem)
    OutlookMessage.Subject = "Hello World!"
    OutlookMessage.Display
    Set OutlookMessage = Nothing
End Sub

状況によっては、Outlook 2010 で電子メールを自動で作成することが必要になる場合もあります。この目的にはテンプレートも使用できます。

Excel 2010 ワークシートから空の行を削除する

Sub DeleteEmptyRows()    SelectedRange = Selection.Rows.Count    ActiveCell.Offset(0, 0).Select    For i = 1 To SelectedRange        If ActiveCell.Value = "" Then    
            Selection.EntireRow.Delete        Else            ActiveCell.Offset(1, 0).Select        End If    Next iEnd Sub

セル列を選択してからこのマクロを実行すると、選択した範囲の列から、空のセルがある行が削除されます。

PowerPoint 2010 で空のテキスト ボックスを削除する

Sub RemoveEmptyTextBoxes()
    Dim SlideObj As Slide
    Dim ShapeObj As Shape
    Dim ShapeIndex As Integer
    For Each SlideObj In ActivePresentation.Slides
        For ShapeIndex = SlideObj.Shapes.Count To 1 Step -1
            Set ShapeObj = SlideObj.Shapes(ShapeIndex)
            If ShapeObj.Type = msoTextBox Then
                If Trim(ShapeObj.TextFrame.TextRange.Text) = "" Then
                    ShapeObj.Delete
                End If
            End If
        Next ShapeIndex
    Next SlideObj
End Sub

このコードを実行すると、すべてのスライドに対して処理がループして実行され、テキストを含まないすべてのテキスト ボックスが削除されます。カウント変数の値は、1 つずつ増えるのではなく減っていきます。コードでオブジェクトを 1 つ削除するたびにコレクションからオブジェクトが削除されるので、カウントが減ります。

連絡先を Outlook 2010 から Word 2010 にコピーする

Sub CopyCurrentContact()
   Dim OutlookObj As Object
   Dim InspectorObj As Object
   Dim ItemObj As Object
   Set OutlookObj = CreateObject("Outlook.Application")
   Set InspectorObj = OutlookObj.ActiveInspector
   Set ItemObj = InspectorObj.CurrentItem
   Application.ActiveDocument.Range.InsertAfter (ItemObj.FullName & " from " & ItemObj.CompanyName)
End Sub

このコードでは、Outlook 2010 に開いている連絡先を、Word 2010 に開いている文書にコピーします。このコードを正常に実行するには、連絡先が Outlook で開かれ、閲覧できる状態になっている必要があります。

まとめ

ここでは、Office 2010 で Visual Basic for Applications (VBA) を使用するメリットと、VBA を使用して繰り返しタスクを自動化する方法について説明しました。

その他の技術情報

詳細については、次のリソースを参照してください。