Excel 2010 VBA の基礎知識

概要: まだプログラミング経験のない Excel パワー ユーザーを対象に、Excel 2010 での Visual Basic for Applications (VBA) について説明します。内容は、VBA 言語の概要、Excel 2010 で VBA を使用する方法、実際の Excel VBA プログラミングでの問題に対する解決策の詳細な説明、プログラミングとデバッグについてのヒントなどです。

コミュニティ会員アイコン Ben Chinowsky、SDK Bridge

この記事の内容
2010 で VBA を使用する理由
VBA プログラミングの基礎
マクロと Visual Basic Editor
実例
記録されたコードを変更する
VBA の他の機能
次のステップ
その他の技術情報

2009 年 11 月

適用対象: Excel 2010 | Office 2010 | SharePoint Server 2010 | VBA | Visual Basic for Applications (VBA)

目次

  • 2010 で VBA を使用する理由

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

  • マクロと Visual Basic Editor

  • 実例

  • 記録されたコードを変更する

  • VBA の他の機能

  • 次のステップ

  • その他の技術情報

2010 で VBA を使用する理由

Microsoft Excel 2010 は非常に強力なツールであり、データの操作、分析、提示に使用できます。標準の Excel ユーザー インターフェイス (UI) は充実した機能を備えていますが、それでも、毎日繰り返し行う作業や、UI が対応していないらしい処理を、簡単に実行できる手段が必要になる場合があります。そのようなときのために、Excel などの Office アプリケーションには、アプリケーションを拡張できるプログラミング言語である Visual Basic for Applications (VBA) が用意されています。

VBA は "マクロ" を実行することで動作します。マクロとは、Visual Basic で記述された手順です。プログラミングの学習は難しいと思うかもしれませんが、多少の忍耐力と、この記事にあるような例があれば、ほんの少し VBA のコードを学習するだけで、作業が簡単になり、それまでは不可能だと思っていた Office での処理を実行できることがわかります。ある程度 VBA のことがわかると、それ以降はもっと簡単に、より多くのことを学習できるようになります。つまり、可能性は無限です。

Excel で VBA を使用する最も一般的な理由は、繰り返し行う作業を自動化することです。たとえば、数十のブックがあり、各ブックには数十のワークシートがあり、各ワークシートで何らかの変更を行う必要がある場合を考えてみてください。変更は、決まった範囲のセルに新しい書式設定を適用するような簡単なものでも、各シートのデータの統計的特徴を調べて、特徴的なデータの表示に最適な種類のグラフを選択し、それに従ってグラフを作成して書式を設定するような複雑なものでもかまいません。

いずれにしても、このような操作を手作業で何回も行いたくはないでしょう。代わりに VBA を使用して Excel が実行する明示的な命令を記述することで、作業を自動化できます。

ただし、VBA は繰り返し行う作業にしか使用できないわけではありません。VBA を使用して、新しい機能を Excel に組み込んだり (たとえば、データを分析するための新しいアルゴリズムを作成し、Excel のグラフ機能を使用して結果を表示できます)、Excel と Microsoft Access 2010 などの他の Office アプリケーションを統合するタスクを実行したりすることもできます。実際、すべての Office アプリケーションの中で、一般的な開発プラットフォームのようなものとして最もよく使用されるのは Excel です。リストや計算が関係する明らかな作業だけでなく、Excel はデータの視覚化からソフトウェアのプロトタイピングまで、広範な作業に使用されています。

Excel 2010 での VBA の使用を推奨する理由はいろいろありますが、それでも問題の最善の解決策が VBA をまったく使用しないものである可能性もあることを憶えておいてください。VBA を使用しなくても Excel には多彩な機能があり、パワー ユーザーでもそのすべてを熟知してはいないでしょう。VBA で解決することに決める前に、ヘルプやオンライン リソースをよく調べて、もっと簡単な方法がないことを確認してください。

VBA プログラミングの基礎

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

コードの作成はよくわからないとか、難しいとか思うかもしれませんが、基本的な原理で使用されているのは当たり前の論理であり、簡単に理解できます。Office 2010 のアプリケーションは、命令を受け取ることのできる "オブジェクト" と呼ばれるものを公開することで作成されます。アプリケーション内のさまざまなオブジェクトに命令を送ることで、アプリケーションを操作します。さまざまなオブジェクトが多数あり、柔軟性を備えていますが、限界もあります。オブジェクトは行うように設計されていることしか行うことができず、命令されたことしか実行しません。

オブジェクト

プログラミング オブジェクトは、アプリケーションの "オブジェクト モデル" と呼ばれる階層で、相互に体系的に関連しあっています。オブジェクト モデルは、ユーザー インターフェイスの外観をほぼ反映しています。たとえば、Excel オブジェクト モデルを構成する多数のオブジェクトには、Application、Workbook、Sheet、Chart などのオブジェクトが含まれます。オブジェクト モデルは、アプリケーションとその機能の概念的な地図です。

プロパティとメソッド

オブジェクトは、"プロパティ" を設定し、"メソッド" を呼び出すことで操作できます。プロパティを設定すると、オブジェクトの一部の性質が変化します。メソッドを呼び出すと、オブジェクトは何らかのアクションを実行します。たとえば、Workbook オブジェクトの Close メソッドはブックを閉じ、ActiveSheet プロパティはブック内で現在アクティブになっているシートを表します。

コレクション

多くのオブジェクトには単数バージョンと複数バージョンがあります。たとえば、Workbook と Workbooks や、Worksheet と Worksheets などです。複数バージョンは "コレクション" と呼ばれます。コレクション オブジェクトは、コレクション内の複数の項目に対してアクションを実行するために使用されます。後で、Worksheets コレクションを使用してブック内の各ワークシートの名前を変更する方法を説明します。

マクロと Visual Basic Editor

Microsoft Excel 2010 がオブジェクト モデルを公開する仕組みがある程度わかったでしょうから、オブジェクト メソッドを呼び出し、オブジェクト プロパティを設定してみましょう。そのためには、Office が理解できる場所と方法でコードを記述する必要があります。通常は Visual Basic Editor を使用します。Visual Basic Editor は既定でインストールされますが、多くのユーザーはリボンでそれが有効になるまで、それを使用できることにさえ気付きません。

[開発] タブ

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

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

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

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

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

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

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

Excel で [開発] タブが表示されたら、そのタブ上の [Visual Basic]、[マクロ]、[マクロのセキュリティ] の各ボタンの位置を確認してください。

図 1. Excel 2010 での [開発] タブ

Excel 2010 の [開発] タブ

セキュリティの問題

実行できるマクロと実行の条件を指定するには、[マクロのセキュリティ] ボタンをクリックします。悪質なマクロ コードはコンピューターに重大な損傷を与える可能性がありますが、役に立つマクロの実行を妨げるようなセキュリティ条件では生産性が大きく低下してしまいます。マクロのセキュリティは複雑ですが、Excel マクロを使用する場合は勉強して理解する必要があります。

この記事に関しては、マクロを含むブックを開いたときにリボンとワークシートの間に [セキュリティの警告: マクロが無効にされました] というバーが表示される場合は、[コンテンツの有効化] ボタンをクリックしてマクロを有効にできることを覚えておいてください。

また、セキュリティの手段として、マクロを既定の Excel ファイル形式 (.xlsx) に保存することはできません。マクロは、特別な拡張子 .xlsm を持つファイルに保存する必要があります。

Visual Basic Editor

次の手順では、マクロを格納するために新しい空のブックを作成する方法を示します。その後、ブックを .xlsm 形式で保存できます。

新しい空のブックを作成するには

  1. [開発] タブの [マクロ] をクリックします。

  2. 表示される [マクロ] ダイアログ ボックスで、[マクロ名] に「Hello」と入力します。

  3. [作成] をクリックすると、Visual Basic Editor が開き、そこに新しいマクロのアウトラインが既に入力されています。

VBA は機能を網羅したプログラミング言語であり、それに対応してプログラミング環境にもあらゆる機能が用意されています。ここではプログラミングに着手するために使用するツールのみを説明し、Visual Basic Editor のほとんどのツールにはふれません。ですから、Visual Basic Editor の左側にある [プロパティ] ウィンドウを閉じ、コードの上部に表示される 2 つのドロップダウン リストは無視してください。

図 2. Visual Basic Editor

Visual Basic Editor

Visual Basic Editor には次のコードが表示されます。

Sub Hello()

End Sub

Sub は "Subroutine" (サブルーチン) を表し、ここではこれを "マクロ" として定義できます。Hello マクロを実行すると、Sub Hello() と End Sub の間に記述されているコードが実行されます。

以下のコードのように、このマクロを編集します。

Sub Hello()
   MsgBox ("Hello, world!")
End Sub

Excel の [開発] タブに戻り、もう一度 [マクロ] をクリックします。

表示される一覧から Hello マクロを選択し、[実行] をクリックすると、"Hello, world!" というテキストが含まれる小さなメッセージ ボックスが表示されます。

これで、Excel にカスタム VBA コードを作成して実装することができました。[OK] をクリックすると、メッセージ ボックスが閉じてマクロの実行が完了します。

メッセージ ボックスが表示されない場合は、マクロのセキュリティの設定を確認してから Excel を再起動してください。

マクロを使いやすくする

[表示] タブから [マクロ] ダイアログ ボックスを表示することもできますが、頻繁に使用するマクロは、キーボード ショートカットまたはクイック アクセス ツール バーのボタンから実行できるようにすると便利です。

クイック アクセス ツール バーHello マクロのボタンを作成するには、以下の手順を使用します。

以下の手順では、クイック アクセス ツール バーにマクロのボタンを作成する方法を説明します。

クイック アクセス ツール バーにマクロのボタンを作成するには

  1. [ファイル] タブをクリックします。

  2. [オプション] をクリックして [Excel のオプション] ダイアログ ボックスを表示し、次に [クイック アクセス ツール バー] をクリックします。

  3. [コマンドの選択] の一覧から [マクロ] を選択します。表示される一覧で Book1!Hello というテキストを探し、そのテキストを選択します。

  4. [追加 >>] をクリックしてマクロを右側の一覧に追加し、次に [変更…] をクリックして、このマクロと関連付けるボタン イメージを選択します。

  5. [OK] をクリックします。[ファイル] タブの上のクイック アクセス ツール バーに新しいボタンが表示されます。

これで、[開発] タブを使用しなくても、作成したマクロをいつでもすぐに実行できるようになりました。試してみてください。

実例

多数のワークシートにリストが作成されているブックがあり、各ワークシートの名前をそのワークシートの見出しと一致するように変更するものとします。リストが含まれないワークシートもありますが、リストがある場合は見出しはセル B1 であり、リストがない場合はセル B1 は空欄です。リストがないワークシートの名前はそのままにします。

通常、これは複雑な作業であり、各ワークシートを見てリストがあるかどうかを調べ、ある場合は名前をコピーし、ワークシートのタブをクリックして、新しい名前を貼り付ける必要があります。この手順をすべて手動で実行する代わりに、Excel VBA を使用してシートの名前を自動的に変更します。

オブジェクトについて

VBA のプログラミングの問題を解決するには、最初にコードで操作するオブジェクトを確認する必要があります。この情報を調べるための基本的なツールは、「Excel Object Model Reference」です。これは、Microsoft Developer Network (MSDN) の「Excel 2007 Developer Reference」の一部です。

これらの参考資料は、Excel 2010 が公開リリースされた時点で更新される予定ですが、「Excel 2007 Developer Reference」は Excel 2010 のほとんどの目的にも十分に利用できます。

図 3. MSDN の「Excel Object Model Reference」

MSDN の Excel オブジェクト モデル参照情報

まず最初に、目的の作業を実行するために使用する必要のある特定のオブジェクトの操作方法を調べます。たとえば、ワークシート、ワークシート名、セル、セルの内容などです。Excel では、この問題を解決するための方法が少なくとも 2 つあります。

  • 「Object Model Reference」を直接参照します。

  • 自動化する操作の一部を記録し、記録されたコードがオブジェクトを操作する方法を調べた後、「Object Model Reference」でさらに詳細を参照します。

どちらの方法がいいかは意見が分かれますが、ここでは最初にマクロの記録を使用してみます。

マクロの記録を使用する

場合によっては、記録された簡単なマクロだけで十分なこともあります。そのような場合は、コードを見る必要さえありません。たいていは、記録だけでは不十分です。そのような場合、記録されたコードは以下のプロセスの起点になります。

マクロの記録をソリューションの起点にするには

  1. コードにする操作を記録します。

  2. コードを調べて、操作を実行している行を探します。

  3. それ以外のコードを削除します。

  4. 記録されたコードを変更します。

  5. マクロの記録では記録できない変数、制御構造、および他のコードを追加します。

最初に、ワークシートの名前を「New Name」に変更するマクロを記録します。その後、記録されたマクロを使用して、内容に基づいて複数のワークシートの名前を変更する独自のマクロを開発できます。

ワークシートの名前を変更するマクロを記録するには

  1. [開発] タブの [マクロの記録] をクリックします。

  2. マクロに「RenameWorksheets」という名前を設定し、Sheet1 の名前を「New Name」に変更して、[記録終了] をクリックします。

  3. [開発] タブまたは [表示] タブの [マクロ] ボタンをクリックし、[編集] をクリックして Visual Basic Editor を開きます。

Visual Basic Editor に次のようなコードが表示されます。

Sub RenameWorksheets()
'
' RenameWorksheets Macro
'
'
    Sheets("Sheet1").Select
    Sheets("Sheet1").Name = "New Name"
End Sub

Sub 行の後の最初の 4 行はコメントです。アポストロフィで始まる行はすべてコメントで、マクロの動作には関係ありません。コメントには主に次のような用途があります。

  • 作成者だけでなく、後でコードを変更する必要があるかもしれないすべての開発者が、コードを簡単に理解できるようにします。

  • 一時的にコード行を無効にします ("コメント化" といいます)。

この記録されたマクロの 4 つのコメントにはどちらの役割もないので、削除します。

次の行では、Select メソッドを使用して Sheets コレクション オブジェクトの Sheet1 メンバーを選択しています。マクロの記録では行われていますが、VBA のコードでは、通常、オブジェクトを操作する前にオブジェクトを選択する必要はありません。つまり、このコード行は冗長であり、削除してもかまいません。

記録されたマクロの最後の行では、Sheets コレクションの Sheet1 メンバーの Name プロパティを変更しています。これが残しておく必要のある行です。

変更した後の記録されたコードは、次のようになります。

Sub RenameWorksheets()
    Sheets("Sheet1").Name = "New Name"
End Sub

手動で New Name シートの名前を Sheet1 に戻してから、マクロを実行します。名前が再び New Name に変わるはずです。

記録されたコードを変更する

次に、マクロの記録で使用されている Sheets コレクションを調べます。Object Model Reference の Sheets のトピックには次のように書かれています。

"Sheets コレクションは Chart オブジェクトまたは Worksheet オブジェクトを格納できます。1 種類のみのシートを使用する場合は、そのシートの種類のオブジェクトのトピックを参照してください。"

Worksheets のみを使用しているので、コードを次のように変更します。

Sub RenameWorksheets()
    Worksheets("Sheet1").Name = "New Name"
End Sub

ループ処理

現時点でのコードにある制限の 1 つは、変更するワークシートが 1 つだけであることです。名前を変更するワークシートごとに別の行を追加することもできますが、ワークシートの数がわからない場合、またはワークシートの現在の名前がわからない場合はどうしますか。ブックのシートごとに何らかの規則を適用する手段が必要です。

VBA には、For Each ループと呼ばれるうってつけの構造があります。For Each ループでは、Worksheets などのコレクション オブジェクト内の各項目が調べられるので、これを使用して一部または全部の項目に操作 (名前の変更など) を実行できます。

For Each ループの詳細については、「VBA Language Reference」を参照してください。「Visual Basic Conceptual Topics」をクリックし、「Using For Each...Next Statements」をクリックします。また、「VBA Language Reference」は「Object Model Reference」と同じように、参照して損のない資料であり、コードについて行き詰まった場合にアイデアを探すのに最適です。

「Using For Each...Next Statements」トピックの 3 番目の例を使用し、次のようにマクロのコードを編集します。

Sub RenameWorksheets()
For Each myWorksheet In Worksheets
    myWorksheet.Name = "New Name"
Next
End Sub

myWorksheet は変数です。つまり、表しているものが変化します。この例では、myWorksheet 変数は Worksheets コレクション内の各ワークシートを次々に表します。myWorksheet を使用する必要はありません。"x"、"ws"、"WorksheetToRenameAfterTheContentsOfCellB1"、または (いくつかの制限はありますが) ほとんどどのような名前でも自由に使用できます。通常は、変数の内容がわかるのに十分な長さで、かといってコードが見にくくなるほどは長くない変数名を使用します。

現在の状態でマクロを実行すると、エラーが発生します。これは、Excel ではブックの各ワークシートは固有の名前である必要がありますが、次の行ではすべてのシートに同じ名前を設定するよう Excel に指示しているためです。

    myWorksheet.Name = "New Name"

For Each ループが動作することを確認できるように行を修正するには、行を次のように変更します。

    myWorksheet.Name = myWorksheet.Name & "-changed"

この行は、各ワークシートに同じ名前を設定するのではなく、各ワークシートの現在の名前 (myWorksheet.Name) の後に "-changed" を追加することで名前を変更します。

便利な名前の変更

マクロは問題を実際に解決するものに近づいてきました。次に必要なのは、ワークシート自体 (具体的には各ワークシートのセル B1) から情報を取得し、その情報をワークシートの名前に設定する手段です。

今度は、マクロの記録を使用してセルを参照する方法を知るのではなく、Cell オブジェクトを使用するものと推測し、それが動作することを確認します。これはよい推測ですが、「Object Model Reference」を開いて Cell オブジェクトを探しても、Cell オブジェクトは見つかりません。しかし、CellFormat オブジェクト (英語)ならあります。

CellFormat オブジェクトのトピックの最初のコード サンプルには、次のコードが含まれます。

    ' Set the interior of cell A1 to yellow.
    Range("A1").Select

Range を使用して、セルの範囲または単に 1 つのセルを指定することがわかります。やはり .Select の部分は必要ありませんが、Range オブジェクト自体ではなく Range オブジェクトの内容を参照する方法を知る必要があります。Range オブジェクトのトピックを見ると、Range には Methods と Properties の両方があることがわかります。Range の内容は物であり、操作ではないので、おそらく Property です。一覧を下の方に見ていくと、Value プロパティが見つかります。そこで、次のコードを試しています。

Sub RenameWorksheets()
For Each myWorksheet In Worksheets
    myWorksheet.Name = myWorksheet.Range("B1").Value
Next
End Sub

B1 が空のワークシートを含むブックに対してこれを実行すると、エラーが発生します。これは、空の Range の Value は "" (空のテキスト文字列) であり、これは有効なワークシート名ではないためです。いずれにしても、何らかのサンプル データを作成する頃合いです。次の図のような 3 つのシートをブックに作成し、マクロを実行してみます。

図 4. RenameWorksheets マクロのサンプル データ

RenameWorksheets マクロのサンプル データ

 

RenameWorksheets マクロのサンプル データ

 

RenameWorksheets マクロのサンプル データ

 

ワークシートの名前がデータに従って変更されるはずです。

空のセルを調べる

前に説明したように、ブックのいずれかの B1 セルが空の場合、マクロは失敗します。手作業ですべてのワークシートを調べる代わりに、マクロを使ってこの作業を自動化できます。myWorksheet.Name 行の前に、次のコード行を追加します。

If myWorksheet.Range("B1").Value <> "" Then

また、myWorksheet.Name 行の後に、次のテキストを追加します。

End If

これは If…Then ステートメントと呼ばれます。If…Then ステートメントは、Excel に対し、If 行の条件が満たされている場合にのみ、If 行と End If 行の間にある行を実行するよう指示します。この例では、次の行が満たす必要のある条件を指定しています。

myWorksheet.Range("B1").Value <> ""

<> は "等しくない" を意味し、間に何もない引用符の対は空のテキスト文字列を表します。つまり、テキストがまったくない状態です。したがって、If と End If の間にあるすべてのコード行は、B1 の値が無ではない場合、つまりセル B1 にテキストがある場合にのみ、実行されます。

If…Then ステートメントの詳細については、「VBA Language Reference」を参照してください (完全な名前は "If…Then…Else ステートメント" であり、"Else" は省略可能なコンポーネントです)。

変数の宣言

マクロに対して行う必要のあるもう 1 つの改良は、myWorksheet 変数の宣言をマクロの先頭に追加することです。

Dim myWorksheet As Worksheet

Dim は "Dimension" の短縮形であり、Worksheet はこの特定の変数の型です。このステートメントは、VBA に、myWorksheet が表すエンティティの型を通知します。「As」と入力すると、使用できるすべての変数型の一覧がポップアップ表示されることに注意してください。これは IntelliSense テクノロジの例です。つまり、Visual Basic Editor は、ユーザーが行おうとしていることを判別し、それに対応して、適切なオプションの一覧を提示します。一覧からオプションを選択しても、そのまま入力を続けても、どちらでもかまいません。

VBA では線数宣言は必須ではありませんが、使用することを強くお勧めします。変数を宣言しておくと、変数を追跡したり、バグをコードまで究明したりすることが、ずっと容易になります。また、オブジェクト型 (Worksheet など) の変数を宣言した場合、後でマクロの中でそのオブジェクト変数を使用すると、オブジェクトに関連付けられているプロパティとメソッドの適切な一覧が IntelliSense によって表示されます。

コメント

マクロがかなり複雑になったので、コードで行われている処理の覚え書きであるコメントを追加することにします。使用するコメントの数はある程度まで各開発者のスタイルに委ねられますが、一般に、少なすぎるより多すぎる方が役に立ちます。コードは、通常、時間が経つと変更したり更新したりする必要があります。コメントがないと、コードで何が行われているのかを理解するのは難しく、最初にコードを作成した人とコードを変更する人が異なる場合はいっそう困難になります。If 条件と、ワークシートの名前を変更している行にコメントを追加すると、次のようなコードになります。

Sub RenameWorksheets()
Dim myWorksheet As Worksheet
For Each myWorksheet In Worksheets
    'make sure that cell B1 is not empty
    If myWorksheet.Range("B1").Value <> "" Then
        'rename the worksheet to the contents of cell B1
        myWorksheet.Name = myWorksheet.Range("B1").Value
    End If
Next
End Sub

マクロをテストするため、ワークシートの名前を Sheet1、Sheet2、Sheet3 に戻し、1 つ以上のワークシートのセル B1 の内容を削除します。マクロを実行し、セル B1 にテキストがあるワークシートの名前は変更され、他のワークシートの名前は変更されないことを確認します。このマクロは、ワークシートの数およびセル B1 の設定と非設定の組み合わせに関係なく動作します。

VBA の他の機能

ここでは、Excel 2010 で VBA を使用して行うことができる他のことを説明します。ここで示す例は、実際の具体的なシナリオに注目するのではなく、VBA の機能を示すことを目的として作られています。例を見ながら、各手順でのオブジェクトについて「Object Model Reference」で情報を確認するとよくわかります。

知識への道を開いておくことの重要性

プログラミング全般、そして特に Excel VBA について学習するためのよい方法は、何かを試してみて、動くようにし、次のようなことを自問してみることです。

  • 次は何を試そうか

  • 思うように VBA を使うためには、最初に何を学習しよう。

  • 面白いことや知りたいことは何だろう。

  • 何に好奇心を感じるだろう。

読者には、知識に至る道を何でも調べてみることを強くお勧めします。

グラフ

Excel でよく行われる作業の 1 つは、ある範囲のセルを基にしてグラフを作成することです。AssortedTasks という名前の新しいマクロを作成し、Visual Basic Editor で次のテキストを入力します。

Dim myChart As ChartObject

グラフ オブジェクトを作成するための行を追加し、myChart 変数をそれに割り当てます。

Set myChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 200)

かっこの中の値によって、グラフの位置とサイズが決まります。最初の 2 つの値は左上隅の座標で、次の 2 つの値は幅と高さです。

新しく空のワークシートを作成し、マクロを実行します。データがないので作成されるグラフは役に立ちません。作成されたグラフを削除し、マクロの最後に次の行を追加します。

With myChart
    .Chart.SetSourceData Source:=Selection
End With

これは VBA のプログラミングでよく使われるパターンです。最初に、オブジェクトを作成して変数に代入し、次に With…End With 構造を使用してオブジェクトの処理を行います。この例のコードでは、現在選択されているデータを使用するようにグラフに指示しています。Selection は SetSourceData メソッドの Source パラメーターの値であり、オブジェクトのプロパティの値ではないので、VBA の構文では、値を代入するために、等号 (=) だけでなく、コロンと等号 (:=) を使用する必要があります。

セル A1:A5 に適当な値を入力し、これらのセルを選択して、マクロを実行します。既定のグラフの種類である棒グラフが表示されます。

図 5. VBA を使用して作成した棒グラフ

VBA を使用して作成した棒チャート

棒グラフが適当でない場合は、次のようなコードを使用して、他のグラフの種類に変更できます。

With myChart
    .Chart.SetSourceData Source:=Selection
    .Chart.ChartType = xlPie
End With

"xlPie" は組み込み定数の例であり、列挙定数とも呼ばれます。Excel の随所に多くの組み込み定数があり、ドキュメントで詳細に説明されています。組み込み定数の詳細については、「Object Model Reference」の「Enumerations」セクションを参照してください。たとえば、グラフの種類の定数は「XlChartType Enumeration」に列記されています。

データを変更できます。たとえば、次の行を変数宣言のすぐ後に追加してみてください。

Application.ActiveSheet.Range("a4").Value = 8

ユーザーからの入力を受け取り、その入力を使用してデータを変更できます。

myInput = InputBox("Please type a number:")
Application.ActiveSheet.Range("a5").Value = myInput

最後に、次の行をマクロの最後に追加します。

ActiveWorkbook.Save
ActiveWorkbook.Close

完成したマクロは次のようになります。

Sub AssortedTasks()
Dim myChart As ChartObject
Application.ActiveSheet.Range("a4").Value = 8
myInput = InputBox("Please type a number:")
Application.ActiveSheet.Range("a5").Value = myInput
Set myChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 200)
With myChart
    .Chart.SetSourceData Source:=Selection
    .Chart.ChartType = xlPie
End With
ActiveWorkbook.Save
ActiveWorkbook.Close
End Sub

セル A1:A5 がまだ選択されていることを確認し、マクロを実行して、入力ボックスに値を入力してから、[OK] をクリックします。コードによりブックが保存されて閉じられます。ブックを再度開き、円グラフに対する変更を確認してください。

ユーザー フォーム

前のセクションでは、簡単な入力ボックスを使用してユーザーから入力を受け取る方法を示しました。これに対応する情報表示用のメッセージ ボックスだけでなく、VBA には、カスタム ダイアログ ボックスの作成、ワークシートに直接配置するコントロールのコーディング、Excel に組み込まれているダイアログ ボックスの操作などに使用できる広範な機能が用意されています。これらの機能の詳細については、「Excel 2007 Developer Reference」の「Controls, Dialog Boxes, and Forms」を参照してください。

Excel VBA の概要を紹介するこの記事の最後のトピックとして、ユーザー フォームについて簡単に説明します。

[開発] タブの [Visual Basic] ボタンをクリックして Visual Basic Editor を開き、[挿入] メニューの [ユーザー フォーム] をクリックしてユーザー フォーム デザイン ビューを開きます。

2 つのウィンドウが表示されます。1 つには作成しているユーザー フォームが表示され、もう 1 つの [ツールボックス] にはユーザー フォームに追加できるさまざまなコントロールが表示されます。コマンド ボタン、オプション ボタン、チェック ボックスなどが含まれます。[ツールボックス] のコントロールの上にマウスを移動すると、作成されるコントロールの種類が表示されます。

前に作成した Hello マクロを実行するボタンが 1 つあるだけのとても簡単なユーザー フォームを作成します。[ツールボックス] で、CommandButton コントロールをクリックしてユーザー フォームにドラッグし、コマンド ボタンを作成します。コマンド ボタンを右クリックし、[コードの表示] をクリックします。

表示される Sub は、"イベント プロシージャ" のスケルトンです。イベント プロシージャは、特定のイベントが発生すると実行します。この場合は、Sub の名前が示すように、コードを実行するイベントは CommandButton1 の Click です。次の行をイベント プロシージャに追加します。

Run("Hello")

Visual Basic Editor の表示は次のようになります。

図 6. CommandButton1_Click イベント プロシージャ

CommandButton1_Click イベントのプロシージャ

ブックを保存し、[ウィンドウ] メニューの [UserForm1 (UserForm)] をクリックして、ユーザー フォームを再度表示します。ツールバーの緑の矢印をクリックして、ユーザー フォームを実行します。ダイアログ ボックスが表示されたら、コマンド ボタンをクリックして Hello マクロを実行します。メッセージ ボックスに "Hello, world!" と表示されます。メッセージ ボックスを閉じて実行中のユーザー フォームに戻り、ユーザー フォームを閉じてデザイン ビューに戻ります。

次のステップ

この記事の情報、実験、そして「Object Model Reference」および「VBA Language Reference」の学習を組み合わせると、VBA の習得を始める動機になった作業を実行するのに十分な情報が得られることがおわかりになったかもしれません。そうであれば、おめでとうございます。そうでない場合は、もっと範囲を広げて、VBA のさらに一般的な理解を深めることをお勧めします。

VBA についてさらに学習する方法の 1 つは、動作するコードを調べることです。「Object Model Reference」および「VBA Language Reference」の例だけでなく、MSDN の記事、Excel を専門とする Microsoft Most Valuable Professional (MVP) が開いている Web サイト、Web を検索して見つかるものなど、さまざまなオンライン リソースから膨大な量の Excel VBA コードを入手できます。

これらのリソースのコードは、今直面しているコーディングの問題の解決に役立つだけでなく、まだ考えたこともないプロジェクトのアイデアも提供してくれます。

もっと体系的に VBA を学習したい場合は、VBA についての優れた書籍が何冊も出版されています。これらの書籍については、Web でいくつものわかりやすいレビューが発表されているので、自分の学習スタイルに合った本を選ぶときの参考になります。

その他の技術情報