Office VBA の基礎知識

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

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

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

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

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

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

注意

複数のプラットフォーム間で Office エクスペリエンスを拡張するソリューションを開発することに関心がありますか? 新しい Office アドイン モデルを参照してください。 Office アドインは、VSTO アドインやソリューションに比べてフットプリントが小さく、HTML5、JavaScript、CSS3、XML などのほぼすべてのWeb プログラミング テクノロジーを使用して構築できます。

VBA を使用する状況と理由

Office で VBA プログラミングの使用を検討するのは、次のようないくつかの理由からです。

自動実行と繰り返し

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

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

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

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

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

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

別の方法で実現する

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

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

Office アプリケーションの機能はとても充実しています。必要とするソリューションが既に用意されている可能性があります。 プログラミングを始める前にまず、Office の機能を確認する時間を確保してください。

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

VBA プログラミングの基礎

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

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

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

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

オブジェクト モデル

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

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

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

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

メソッド

たとえば、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 内でセル A1 を選択し、そのセルに値を入力するためにプロパティを設定するメソッドを実行します。

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

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

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

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

おそらく最も簡単に作成できる VBA コードは、使用中の Office アプリケーション内のオブジェクトにアクセスし、プロパティを設定するだけのコードです。 たとえば、VBA スクリプトを使用して Word の表にある行にアクセスし、表の書式を変更できます。

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

マクロと Visual Basic Editor

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

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

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

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

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

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

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

  5. [OK] を選択します。

注意

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

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

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

[開発] タブのボタン

セキュリティの問題

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

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

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

注意

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

マクロの記録

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

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

マクロを記録するには

  1. Excel で新しいブックを開き、リボンの [開発] タブを選択します。 [マクロの記録] を選択し、[マクロの記録] ダイアログ ボックスでは、マクロ名 [Macro1] やマクロの保存先 [作業中のブック] など、既定の設定をすべてそのまま使用します。

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

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

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

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

図 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 行のコメント行は割愛します。

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

注意

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

開発者用ヘルプ

記録されたマクロの FormulaR1C1 を選択し、F1 キーを押します。 ヘルプ システムで検索が行われ、Excel ヘルプの Excel 開発者用ヘルプ セクションに適切なトピックがあるかどうかが確認され、一覧に FormulaR1C1 プロパティが表示されます。 このリンクを選択すると詳細な情報を表示できますが、そうする前にウィンドウの下部近くに [Excel オブジェクト モデル リファレンス] というリンクがあることに注目してください。 このリンクを選択して Excel のオブジェクト モデルで使用される多数のオブジェクトを示す一覧を表示すると、ワークシートとそのコンポーネントに関する説明を参照できます。

一覧でいずれかのオブジェクトを選択すると、そのオブジェクトに対応するプロパティおよびメソッドと、別の関連トピックへの相互参照が表示されます。 多くのヘルプ項目には、役に立つ簡単なコード サンプルも含まれています。 たとえば、 Borders オブジェクトの関連リンクを使用して VBA で罫線を設定する方法を参照できます。

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

コードの編集

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

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

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

ヒント

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

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

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

最初のマクロの実行結果

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

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

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

サンプルを土台とする

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

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

問題を単純化する

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

バグとデバッグ

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

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

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

[OK] を選択し、テキストを "Wow!" に戻します。

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

たとえば、Visual Basic エディターを開き、マクロで Value プロパティ名を ValueX に変更し 、Range オブジェクトに ValueX というプロパティが存在しなかから、ランタイム エラーが意図的に発生します。 Excel ドキュメントに戻り、[マクロ] ダイアログ ボックスを開いて、Macro1 を再び実行します。 実行時エラーについて説明するテキスト "オブジェクトは、このプロパティまたはメソッドをサポートしていません" を含む Visual Basic メッセージが表示されます。 このメッセージでも明らかですが、[デバッグ] を選択してさらに詳細な情報を表示します。

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

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

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

リファレンスの活用

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

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

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

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

当然ですが、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 サンプル コード

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

Outlook でメールを作成する

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

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

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

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 i
End Sub

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

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

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 から Word にコピーする

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

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。