次の方法で共有


Microsoft Office ドキュメントの拡張と自動化を行うための VBA アドインの作成

概要:  Microsoft Visual Basic for Applications (VBA) を使用して、Microsoft Word、Microsoft PowerPoint、および Microsoft Excel 用のアドインを作成する方法について説明します。アドインに VBA を使用することが最適な場合について考察し、Microsoft Office 2010 用の VBA アドインに組み込むことができるいくつかのサンプル タスクを説明します。

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

この記事の内容
VBA を使用する理由
VBA を使用する状況
VBA アドイン ファイルの作成
アドインのトラブルシューティング
VBA アドインでできること
VBA コードの管理
次の手順
その他の技術情報
著者について

対象:  Microsoft Excel 2010 | Microsoft PowerPoint 2010 | Microsoft Word 2010 | Microsoft Excel for Mac 2011 | Microsoft PowerPoint for Mac 2011 | Microsoft Word for Mac 2011

公開:   2011 年 2 月

提供元:  Stephanie Krieger

目次

  • VBA を使用する理由

  • VBA を使用する状況

  • VBA アドイン ファイルの作成

  • アドインのトラブルシューティング

  • VBA アドインでできること

  • VBA コードの管理

  • 次の手順

  • その他の技術情報

  • 著者について

クリックしてコードを取得 サンプル コードのダウンロード

VBA を使用する理由

開発者は、ドキュメントとテンプレートを自動化するときに VBA を使用してマネージ コードを操作することがありますが、VBA の利点はそれだけではありません。Microsoft Office プロジェクトを開始するときに最初にする作業が Microsoft Visual Studio を開くことだとすると、必要以上に作業を行っている可能性があります。

サーバー統合、より柔軟性の高い UI 設計、Microsoft Silverlight テクノロジの利用など、マネージ コードの機能がプロジェクトの要件に有効な場合は、これを読むのをやめて Visual Studio を開いてください。ただし、特定のプロジェクトの要件を、より簡単にすばやく構築でき、費用効率を向上できる可能性があるソリューションによって満たすことができる場合は、VBA を試してみることをお勧めします。

VBA を使用する状況

最近、ある大手企業で Visual Studio で作成していた基本的なアドインに関して厄介な問題が発生しました。そのアドインの目的は、少量のカスタマイズされたヘルプのコンテンツにリンクしているリボン タブを Word、PowerPoint、および Excel で提供することでした。

その企業の担当者たちが私に助けを求めてきたとき、私は、そんな簡単なものを作成するときに VBA を使用しなかった理由を聞きました。特に理由はないとその担当者は言いました。彼らは、Visual Studio 以外のツールを使用しようとは一度も考えたことがありませんでした。そこで、私は Office 2010 アプリケーションで Visual Basic Editor を開きました。約 1 時間後、Word、Excel、および PowerPoint 用の簡単で完全なアドインと彼らが最初に意図したとおりの外観を備えた UI が完成しました。

ことわざにもあるように、"蚊を殺すのに大砲はいらない (don't use a cannon to kill a mosquito)" のです。必要なソリューションを VBA で作成できると、費やす時間も記述するコードも少なくなり、依存関係が少なく、より簡単に展開できるパッケージを作成できる可能性があります。

確かに、前述の例は非常に単純です。ただし、作成するソリューションが 1 人のユーザー向けか数千人のユーザー向けかにかかわらず、VBA アドインで実現できることの多さに驚く可能性があります。プロのドキュメント コンサルタントとして、私は、Word、PowerPoint、および Excel で VBA ベースのソリューションを企業向けに作成しています。ユーザー数は合計で 50 万人に上り、約 100 の国と地域で使用されています。

以下のセクションでは、Word、PowerPoint、および Excel でアドイン ファイルを作成する方法について説明します。次に、企業のドキュメント作成を簡単にするものから、組み込みの Office 2010 機能を対話操作するものまで、アドインに組み込むことができる各種タスクの例を見ていきます。

VBA アドイン ファイルの作成

このセクションでは、前述の例を使用して、Word、PowerPoint、および Excel 用の簡単なアドインを作成する方法について説明します。各アドインは、ユーザーによって選択された手順に関するコンテンツにすばやくアクセスできるカスタム リボン タブを提供します。

Word アドインの作成

Word VBA アドインは、グローバル テンプレートです。つまり、インストールすると、作業中のドキュメントにかかわらず利用できるようになるテンプレートです。Word アドインを作成するには、最初に新しい .dotm (マクロ有効 Word テンプレート) ファイルを作成します。

VBA プロジェクトを作成するには

  1. 新しい .dotm テンプレートを Word で開いた状態で、[開発] タブで [コード] グループの [Visual Basic] をクリックします。または、Alt キーを押しながら F11 キーを押します。

  2. [挿入] メニューの [標準モジュール] をクリックします。[プロパティ] ウィンドウで、モジュールに名前を付けます。

  3. [ツール] メニューの [プロジェクトのプロパティ] をクリックしてプロジェクトに名前を付け、プロジェクトの説明を追加するか、パスワードによる保護を追加します。

以下に、カスタム ヘルプ アドインのコードがあります。このコードを先ほど作成したモジュールにコピーします。

重要

これらのマクロで参照しているファイルについては、Office 2010 製品ガイドリボン ガイドを表示するインタラクティブ メニューを Microsoft ダウンロード センターからダウンロードできます。この記事のサンプル ダウンロードで会社のブランド ガイドライン ドキュメントとして使用できるプレースホルダー ファイルを探します。マクロで指定されているパスとファイル名を使用して参照ファイルを保存し、アドインをテストする必要があります。別のパスとファイル名を使用する場合は、それに応じてマクロを編集します。

また、この記事に記載しているすべてのアドイン例の完全版がサンプル ダウンロードに収録されています。ただし、Word、PowerPoint、および Excel 用のカスタム ヘルプ アドインをテストするには、該当する製品ガイドとリボン ガイドを表示するインタラクティブ メニューを (個別に) ダウンロードして保存するか、インストールする必要があります。

Option Explicit
Public oPath As String

Sub CommandRef(ByVal Control As IRibbonControl)
On Error GoTo Errorhandler
'The FollowHyperlink method used in this procedure requires an open document.
With Documents
    If .Count = 0 Then
    .Add
    End If
End With
'If you use the environmental variable for program files as shown here,
'(which is usually advisable) rather than hard-coding the drive letter,
'note that 64-bit machines that include both a Program Files x86 folder
'and a Program Files folder may not point to the desired location.
oPath = Environ("ProgramFiles")
ActiveDocument.FollowHyperlink Address:=oPath & _
    "\CompanyTools\CustomHelp\Word 2010\Word 2010 Guide.html", NewWindow:=True
Exit Sub
Errorhandler:
'Error 4198 occurs if the file name or path is not found.
If Err.Number = 4198 Then
    MsgBox "The Word 2010 Interactive Guide is unavailable. " & _
        "Consult your local IT department for assistance.", vbInformation
End If
End Sub

Sub ProductGuide(ByVal Control As IRibbonControl)
On Error GoTo Errorhandler
With Documents
    If .Count = 0 Then
        .Add
    End If
End With
oPath = Environ("ProgramFiles")
ActiveDocument.FollowHyperlink Address:=oPath & _
    "\CompanyTools\CustomHelp\WordProductGuide.pdf", NewWindow:=True
Exit Sub
Errorhandler:
If Err.Number = 4198 Then
    MsgBox "The file 'WordProductGuide.pdf' is unavailable. " & _
        "Consult your local IT department for assistance.", vbInformation
End If
End Sub

Sub BrandOverview(ByVal Control As IRibbonControl)
On Error GoTo Errorhandler
With Documents
    If .Count = 0 Then
    .Add
    End If
End With
oPath = Environ("ProgramFiles")
ActiveDocument.FollowHyperlink Address:=oPath & _
    "\CompanyTools\CustomHelp\Brand Guidelines.pdf", NewWindow:=True
Exit Sub
Errorhandler:
If Err.Number = 4198 Then
    MsgBox "The file 'Brand Guidelines.pdf' is unavailable. " & _
        "Consult your local IT department for assistance.", vbInformation
End If
End Sub

注意

このコード サンプルのプロシージャは、リボン コントロールとして宣言されています。この宣言を配置すると、関連付けられたリボン コントロールからのみプロシージャを実行できます。このため、マクロのコード量が多い通常のアドインでは、多くの場合、リボン コントロールのプロシージャのセットごとに個別のモジュールを用意して、そのコントロールからマクロを呼び出すほうが便利です。

モジュールが完成すれば、テンプレートを保存して閉じることができます。

グローバル テンプレートをインストールするには、Word を終了し、ファイルを Word スタートアップ フォルダーに保存します。Word を起動すると、そのフォルダーに配置したグローバル テンプレートが自動的に読み込まれます。ただし、このアドインを読み込むことができるようにするには、最初にカスタム リボン タブ用の Office Open XML マークアップを追加する必要があります。この手順については、次のセクションで説明します。

Microsoft Windows 7 と Windows Vista の場合、既定の Word スタートアップ フォルダーの場所は、C:\Users\[ユーザー名]\AppData\Roaming\Microsoft\Word\Startup です。グローバル テンプレート アドインを管理する、またはアドインが読み込まれているかどうかを確認するには、Word の [開発] タブで、[アドイン] をクリックします。

アドインを読み込んだ後にコードを編集する必要がある場合は、Word で .dotm ファイルを開きます。以前に読み込まれたインスタンスは、開いたテンプレートに自動的に置き換えられます。Visual Basic Editor でコードを編集し、変更内容を保存して, .dotm ファイルを閉じます。アドインの読み込み済みインスタンスは、最新の変更内容で自動的に更新され、読み込まれた状態が維持されます。Word を再起動する必要はありません。

注意

この記事のカスタム UI に関する内容は、Office 2010 には当てはまりますが、Office for Mac 2011 には当てはまりません。Word 2011 では、特定のテンプレート用のカスタム ツール バーとメニューをプログラムによって追加できます。ただし、Word でコードを使用せずに追加することもできます。追加するには、[表示] メニューの [ツールバー] をポイントし、[ツールバー/メニューのユーザー設定] をクリックします。

また、この記事を書いている時点では、Word 2011 の起動時にグローバル テンプレートが自動的に読み込まれるようにするには、追加の手順が必要になる可能性があります。前述の手順に従ってもテンプレートが再度読み込まれない場合は、Normal.dotm グローバル テンプレート内のモジュールで、マクロを追加するように指示する 1 行のマクロを追加します。このコードを次に示します (コード内のファイルの場所とファイル名は自分のグローバル テンプレートに合わせて変更する必要があります)。

Sub AutoExec()AddIns.Add fileName:="[Complete Path and File Name]", Install:=TrueEnd Sub

アドイン用のカスタム UI の作成

ユーティリティはドキュメントまたはテンプレートでリボンをカスタマイズするのに役立ちますが、マークアップを手動で追加するのも同様に簡単です。任意の Office Open XML マークアップを記述するときのように、Windows メモ帳または任意のテキスト エディターを使用できます。ただし、Visual Studio ではリボンのカスタマイズ スキーマを参照できるので、IntelliSense を利用できます。このため、Visual Studio が便利であると考える人もいます。

注意

以下の手順では、ドキュメント パッケージを開いていて、ファイルに customUI を手動で追加することを前提としています。このような作業の経験がない場合は、ドキュメントの背後にある Office Open XML 構造を理解するよい機会です。Office Open XML ドキュメント パッケージの編集経験があり、Visual Studio 2010 を使用している場合は、Visual Studio でドキュメントまたはテンプレートを直接開くのに Open XML Package Editor Power Tool を試してみることをお勧めします。このツールを使用すると、フォルダーを直接パッケージに追加できるので、いくつかの手順を省略できます。また、リレーションシップの追加が簡単になり、パーツまたはファイルを追加するときにコンテンツ タイプが自動的に管理されます。Open XML Package Editor Power Tool for Visual Studio 2010 の詳細およびダウンロードについては、こちらをクリックしてください。

customUI 構造を構築するのに役立つツールを使用することもできます。たとえば、Custom UI Editor は無償のツールで、ユーザーに必要なパーツを追加します。また、customUI.xml マークアップのサンプルも用意されています。

この例のマークアップに含まれているボタンは少数ですが、簡単に追加できるカスタマイズをいくつか示しています。たとえば、図 1 の 3 つ目のボタンはカスタム イメージです。このマークアップには、カスタム ヒント テキストとカスタム KeyTip アクセラレータも記述されています。

customUI マークアップを Office 2010 ドキュメントまたはテンプレートに追加するには

  1. customUI という名前のフォルダーを作成します。このフォルダーは、Windows デスクトップなど、簡単にアクセスできる任意の場所に作成できます。

  2. customUI.xml という名前のファイルを新しいフォルダーに追加し、リボンのカスタマイズ用のマークアップをそのファイルに追加します。次のコードは、前述の Word アドインの例に追加するマークアップです。

    <?xml version="1.0" encoding="utf-8"?>
    <customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui">
      <ribbon>
        <tabs>
          <tab id="customTab" label="Company Help" >
            <group id="CustomHelp" label="Get Help" >
              <button id="WebGuide" visible="true" size="large" 
                      label="Interactive Word 2010 Guide" keytip="W" 
                      screentip="Get help for finding commands on the ribbon." 
                      onAction="CommandRef" imageMso="FindDialog"/>
              <button id="ProdGuide" visible="true" size="large" 
                      label="Word 2010 Product Guide" keytip="P" 
                      screentip="Learn what's new in Word 2010 and how to find it." 
                      onAction="ProductGuide" imageMso="AdpPrimaryKey"/>
              <button id="BrandGuide" visible="true" size="large" 
                      label="Company Brand Guidelines" keytip="B" 
                      screentip="Get help for using company branding." 
                      onAction="BrandOverview" image="brand"/>
            </group>
          </tab>
        </tabs>
      </ribbon>
    </customUI>
    
  3. customUI フォルダーをドキュメントまたはテンプレート パッケージに追加します。

    追加するには、ファイル拡張子を .zip に変更して ZIP パッケージを開き、そこに新しいフォルダーをドラッグします。または、ファイル拡張子を変更せずにパッケージを開くことができる 7-Zip のようなユーティリティを使用します。

    注意

    ファイル拡張子を変更してパッケージを開く場合には、作業終了後にファイル拡張子を元に戻すことを忘れないでください。

  4. customUI ファイルのリレーションシップ定義を ZIP パッケージの最上位リレーションシップ (.rels) ファイルに追加します。

    1. _rels フォルダーのファイル .rels を開きます。

    2. 次のリレーションシップ定義を追加します。ファイルの別のリレーションシップで既に ID rID4 を使用している場合は、このリレーションシップに別の ID を選択します。

      <Relationship Id="rID4" Type="https://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="customUI/customUI.xml"/>
      

      注意

      この例では、図 1 に示すように [Company Brand Guidelines] ボタンにカスタム イメージを使用するので、手順 5. ~ 7. を実行する必要があります。組み込みのイメージだけを使用する場合は、以降の手順は必要ありません。customUI マークアップで使用できるすべての組み込み Office 2010 イメージのリストについては、この記事の最後にある「その他の技術情報」セクションを参照してください。

  5. customUI フォルダーに 2 つのサブフォルダーを作成します。1 つは _rels という名前で、もう 1 つは、このサンプルのマークアップを使用している場合は images という名前です。

  6. (この例の 3 つ目のボタンで使用する) カスタム コントロール イメージの画像ファイルを images フォルダーに配置し、_rels フォルダーに配置する customUI.xml.rels という名前のファイルを作成します。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Relationships xmlns="https://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="brand" Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="images/brandicon.png"/></Relationships>
    
  7. ZIP パッケージの最上位にある [Content_Types].xml ファイルを開きます。.png ファイル拡張子 (カスタム イメージのファイル形式) の定義が追加されていない場合は、その定義を追加します。次のマークアップを使用します。

    <Default Extension="png" ContentType="image/png"/>
    

図 1. customUI マークアップの結果

customUI マークアップの結果

この記事の後半では、次のようなその他の customUI タスクの例について説明します。

  • 分割ボタン コントロールの使用

  • 組み込みタブへのリボンのカスタマイズの追加

  • タブ上のコントロールの位置またはリボン上のタブの位置の指定

  • VBA と customUI マークアップを使用したコントロールの表示の管理

PowerPoint アドインの作成

PowerPoint アドインを作成するには、最初にマクロ有効 PowerPoint プレゼンテーション (.pptm) ファイルを作成します。PowerPoint では、アドインに固有のファイル形式 (.ppam) を使用しますが、この形式は読み取り専用です。このため, .pptm ファイルでコードを記述および編集してから、コピーを .ppam アドインとして保存します。

PowerPoint アドインを作成するには

  1. 新しい .pptm ファイルを開いた状態で、Visual Basic Editor を開きます。

    注意

    同時に複数のアプリケーションの Visual Basic Editor で作業している場合は、Alt キーを押しながら F11 キーを押して、Visual Basic Editor と該当するアプリケーションの間を切り替えます。

  2. この記事の Word アドインに関するセクションで説明した手順と同じ手順を使用して、新しい VBA プロジェクトを作成します。そのセクションに記載されているカスタム ヘルプ モジュールのコードをコピーし、PowerPoint ではそのコードを次のように編集します。

    1. Documents コレクション オブジェクトと ActiveDocument オブジェクトをそれぞれ Presentations と ActivePresentation に置き換えます。

    2. Word 2010 のコンテンツとファイルの場所への参照を同等の PowerPoint 2010 のコンテンツへの参照に置き換えます。

      PowerPoint の製品ガイドとリボン ガイドを表示するインタラクティブ メニューも前述のリンクからダウンロードできます。Word アドインと同様、マクロで指定されているパスとファイル名に合わせて PowerPoint サンプル ファイルを保存して名前を付ける必要があります。これらのファイルの一部は Word アドインのファイルとは異なるので、同様にサンプル ファイル名に合わせるためにマクロでファイル名を編集する必要があります。

  3. .pptm ファイルを保存して閉じます。

  4. 必要な customUI フォルダーとコンテンツを .pptm ファイルに追加します。

    選択した PowerPoint のコンテンツに合わせて必要に応じてマークアップ (ラベル、ヒントのテキストなど) を編集すれば、前のセクションで示した手順とマークアップを使用できます。ただし, .rels ファイルと [Content_Types].xml ファイルを置き換えるのではなく、手順に従って PowerPoint ファイルに存在するこれらのファイルを必ず編集してください。

  5. PowerPoint で .pptm ファイルを開きます。カスタム リボン タブの外観と機能が正しいことを確認した後で、ファイルのコピーを PowerPoint アドイン (.ppam) ファイルとして保存します。このアドインは自動的に Microsoft Add-Ins フォルダーに保存されます。

    Windows 7 の場合、Microsoft Add-Ins の既定のフォルダー パスは C:\Users\user name\AppData\Roaming\Microsoft\AddIns です。

注意

PowerPoint for Mac 2011 の場合、ツール バーまたはメニューをプログラムによってアドインに追加できます。サンプルについては、この記事に付属のダウンロードを参照してください。

PowerPoint アドインを読み込むには

  1. PowerPoint の [開発] タブで [アドイン] をクリックします。

  2. [新規追加] をクリックします。

  3. 先ほど保存したファイルを選択し、[開く] をクリックします。

  4. マクロに関するセキュリティ警告が表示された場合、[マクロを有効にする] をクリックします。

既定では、読み込まれた PowerPoint アドイン ファイルは Visual Basic Editor のプロジェクト エクスプローラーに表示されません。読み込まれた .ppam プロジェクトを表示し、開くには、Windows レジストリに新しい値を追加します。キー HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\PowerPoint\Options で、DebugAddins という名前の DWORD 値を追加し、値を 1 に設定します。その後、PowerPoint を再起動します。これで、読み込まれた .ppam プロジェクトのコンテンツを表示、エクスポート、およびコピーできるようになります。また、読み込まれたアドインで編集を行ってその編集内容をテストすることもできます。つまり、トラブルシューティングを行うとき、または何か新しいことを試すときに便利なスクラッチ パッドのようなものとしてアドインを使用できます。ただし、変更内容は読み込まれたアドイン ファイルには直接保存できません。

Excel アドインの作成

Excel アドインは、この記事で説明する 3 つのプログラムの中で最も効率的に作成できる可能性があります。Excel では、ファイルを Excel アドイン (.xlam) として保存し、アドイン ファイルを読み込み、そのファイルが読み込まれている間は直接そのファイルでコードを記述したり、編集したりできます。

Excel アドインを作成し、読み込むには

  1. 新しい Excel ファイルを作成し、Excel アドイン (.xlam) として保存します。このファイルは自動的に Microsoft Add-Ins フォルダーに保存されます。

  2. [開発] タブの [アドイン] をクリックします。新しく保存したアドインがリストに表示されるはずです。表示されている場合は、そのアドインを選択して (そのアドインを読み込んで)、ダイアログ ボックスを閉じます。表示されていない場合は、[参照] ボタンをクリックしてアドイン ファイルを探して読み込みます。

  3. Visual Basic Editor を開きます。前の Word と PowerPoint に関するセクションで説明したとおりにプロジェクトを作成し、値を入力します。

    Word アドインに関するセクションにある VBA コードをコピーする場合は、Documents コレクション オブジェクトと ActiveDocument オブジェクトへの参照をそれぞれ Workbooks と ActiveWorkbook に変更します。また、Word ファイルと場所への参照も、Excel のコンテンツに合わせて適切に変更します。このアドインで使用できる Excel の製品ガイドとリボン ガイドを表示するインタラクティブ メニューは前述のリンクからダウンロードできます。

  4. Excel を終了し、Microsoft Add-Ins フォルダーを参照して新しいアドイン ファイルを見つけます。

  5. アドイン ファイルに customUI を追加します。

    前述の Word アドイン用のマークアップとコードを使用する場合は、Excel のコンテンツに合わせて必要に応じて属性 (ラベル、ヒントなど) を編集します。前述の UI をカスタマイズする手順に従って、Excel ファイルに存在する .rels ファイルと [Content_Types].xml ファイルを必ず編集してください。

次に Excel を開くと、アドインが読み込まれたままの状態で、customUI が表示されているはずです。

アドインのトラブルシューティング

アドインが正しく読み込まれないまたは実行されない場合は、以下の一般的な問題について確認してください。

  • リボンのカスタマイズが表示されない。  customUI を含んでいるファイルを開いたときに (または、アドインを読み込んだときに) リボンのカスタマイズが表示されない場合は、その原因はほとんどの場合、構文エラーにあります。作成した customUI.xml ファイルおよびリレーションシップを追加した .rels ファイルを確認します。

    • 引用符やかっこがない、大文字と小文字が正しくないなど、ささいな間違いによって、XML ドキュメント パーツが機能しなくなる可能性があります。

    • また, .rels ファイルに追加したリレーションシップ定義を確認して、パスが、customUI マークアップが格納されているフォルダーとファイルの名前に一致していることを確認します。

  • プロシージャが実行されない。  リボン上のアドイン コントロールをクリックしたときにプロシージャが実行されない場合は、次の項目を確認してください。

    • customUI マークアップで、そのコントロールの OnAction 属性で使用したプロシージャ名が VBA コードのプロシージャ名と一致していますか。

    • OnAction 属性の値として使用したプロシージャで、customUI マークアップが VBA でリボン コントロールとして宣言されていますか。

  • すべてのアドイン コードが実行されない。  アドイン UI はリボンに表示されるが、すべてのプロシージャが実行されない場合、セキュリティが原因の可能性が高いです。

    [開発] タブの [マクロのセキュリティ] をクリックします。オプション [警告を表示してすべてのマクロを無効にする] を選択します。すべてのマクロの実行を許可することはお勧めしません。ただし、警告なしでマクロを無効にした場合、アドインを読み込めなくなる可能性があります。

VBA アドインでできること

前述のとおり、カスタム ヘルプの例は、アドインの最も簡単な使用法の 1 つです。VBA を使用してドキュメント ソリューション一式を提供するアドインを作成し、さまざまな要件に対応できます。

以下のセクションに示すタスクは、始まりにすぎません。この目的は、ユーザー情報の収集と格納、ドキュメントの事前設定、ドキュメントのコンテンツの評価、ファイルを閉じる、アプリケーションを起動するという組み込みのタスクの対話操作など、各種のニーズに適用できる概念に取りかかるきっかけを作ることです。

これらの概念を見ていくときに、記載されている基になる VBA のほとんどは、その個別の例で使用されているアプリケーションの種類にかかわらず、Word、PowerPoint、または Excel に適用できる点に注意してください。

ドキュメント作成タスクの自動化

ユーザーのコンテンツを自動化するときは、ユーザー情報と基本設定を収集して格納した後に、その情報を使用してプログラムによってコンテンツを生成またはカスタマイズする必要があります。

この例では、Word アドインは連絡先情報と用紙サイズの基本設定を収集します。また、このアドインによって、会社のブランド マークが入ったレターを生成できます。レターを作成するときは、保存されている情報がアドインによって自動的に使用されます。

このサンプル アドインには、1 つのユーザー フォームと 3 つのモジュールが組み込まれています。

  • ユーザー フォームは、ユーザー情報と基本設定を収集し、格納するためのものです。

  • 1 つ目のモジュールは、格納されているユーザー情報の取得など、複数のプロシージャに必要な変数用です。

  • 2 つ目のモジュールはリボン コントロール用です。

  • 3 つ目のモジュールは、カスタム ドキュメントを生成するコード用です。

このタスクでは、ユーザーが情報を入力できるダイアログ ボックス (ユーザー フォーム) を作成します。その後、その情報を Windows レジストリに保存します。

注意

以下の手順を開始する前に、VBA プロジェクトを作成する必要があります。また、Office for Mac 2011 の場合も、Windows レジストリで情報を保存または取得するために使用するコードと同じコードを使用できます。Mac OS では、これらのメソッドは同じように機能し、情報は、ライブラリの環境設定フォルダーにある .plist ファイルに保存されます。

ユーザー情報を収集し、保存するには

  1. Visual Basic Editor で、必要なコントロールを使用してユーザー フォームを作成し、事前設定します。[挿入] メニューの [ユーザー フォーム] をクリックします。(使用可能なユーザー フォーム コントロールが格納されている) ツールボックスが自動的に表示されない場合は、[表示] メニューの [ツールボックス] をクリックします。

    1. 必要なコントロール (ラベル、テキスト ボックスなど) をクリックしてユーザー フォームにドラッグし、必要なサイズでそのコントロールを作成します。

      整列と間隔のツールは [書式] メニューにあります。

    2. [プロパティ] ウィンドウを使用して、コントロールに名前を付け、キャプションやアクセラレータ キーの追加、高さと幅の設定、左および上からの位置の設定など、さまざまなプロパティを設定します。このウィンドウでは、コントロールの外観と動作に関する多数の要素を指定できます。

    図 2 に、完成したこの例のユーザー フォーム オブジェクトを示します。このユーザー フォームはユーザーにとって操作しやすいものになっています。たとえば、キーボードを使用するユーザーのためにアクセラレータ キーが用意され、コントロールのサイズと整列には一貫性があり、フレームを使用してコントロールを視覚的にまとめています。

    目で確認できる機能に加えて、タブ オーダーは、キーボードを使用するユーザーが使いやすい順に並べられています。ユーザー フォームにあるコントロールのタブ オーダーを設定するには、フォームを右クリックして [タブ オーダー] をクリックします。次に、各フレームを右クリックして [タブ オーダー] をクリックし、選択したフレームに表示するコントロールを並べ替えます。

    図 2. コーディング完了後のユーザー フォーム

    コーディング後のユーザー フォームが完了

  2. ユーザー フォームのコードによって保存される設定を取得する変数、ユーザー フォームのコントロールを事前設定する変数など、ユーザー フォームに必要な変数のモジュールを作成します。

    Option Explicit
    Public oName As String, oTitle As String, oAdd1 As String, oAdd2 As String, _
    oPh1 As String, oPh2 As String, oPDat1 As String, oPDat2 As String, i As Integer, _
    oPaper As String, oPhone(2) As String, oDoc As Word.Document
    
    Sub DocVarbs()
    'GetSetting and SaveSetting use VB and VBA Program Settings in the Registry: _
    HKEY_CURRENT_USER\Software\VB and VBA Program Settings
    oName = GetSetting("CustomDocs", "Info", "Name")
    oTitle = GetSetting("CustomDocs", "Info", "Title")
    oAdd1 = GetSetting("CustomDocs", "Info", "Add1")
    oAdd2 = GetSetting("CustomDocs", "Info", "Add2")
    oPh1 = GetSetting("CustomDocs", "Info", "PLabel1")
    oPh2 = GetSetting("CustomDocs", "Info", "PLabel2")
    oPDat1 = GetSetting("CustomDocs", "Info", "PData1")
    oPDat2 = GetSetting("CustomDocs", "Info", "PData2")
    oPaper = GetSetting("CustomDocs", "Info", "Paper")
    
    'populates the combo boxes in the dialog box
    oPhone(0) = "Phone"
    oPhone(1) = "Fax"
    oPhone(2) = "Email"
    
    'sets default values for the first use of the info dialog box
    'or in the case that a user generates a document with the tools
    'before saving information.
    If oName = "" Then
        oName = Application.UserName
        oChk = True
    End If
    If oPh1 = "" Then oPh1 = "Phone"
    If oPh2 = "" Then oPh2 = "Email"
    If oPaper = "" Then oPaper = "L"
    End Sub
    
  3. ユーザー フォームのコードを追加します。

    Initialize プロシージャは、既に保存されている情報または前の手順で示した変数プロシージャによって示される既定値を使用して、フォームを事前設定します。cmdSave プロシージャは、ユーザーが入力した情報をレジストリに保存します。

    Option Explicit
    
    Private Sub cmdCancel_Click()
    Unload Me
    End Sub
    
    Private Sub cmdSave_Click()
    Dim myP As String
    With Me
        SaveSetting "CustomDocs", "Info", "Name", .txtName.Value
        SaveSetting "CustomDocs", "Info", "Title", .txtTitle.Value
        SaveSetting "CustomDocs", "Info", "Add1", .txtAdd1.Value
        SaveSetting "CustomDocs", "Info", "Add2", .txtAdd2.Value
        SaveSetting "CustomDocs", "Info", "PLabel1", .cmbPh1.Value
        SaveSetting "CustomDocs", "Info", "PLabel2", .cmbPh2.Value
        SaveSetting "CustomDocs", "Info", "PData1", .txtPDat1.Value
        SaveSetting "CustomDocs", "Info", "PData2", .txtPDat2.Value
        If .optA.Value = True Then
            myP = "A"
        Else
            myP = "L"
        End If
        SaveSetting "CustomDocs", "Info", "Paper", myP
    End With
    Unload Me
    End Sub
    
    Private Sub UserForm_Initialize()
    Call modVarbs.DocVarbs
    With Me
        .txtName.Value = oName
        .txtTitle.Value = oTitle
        .txtAdd1.Value = oAdd1
        .txtAdd2.Value = oAdd2
        .txtPDat1.Value = oPDat1
        .txtPDat2.Value = oPDat2
        .cmbPh1.List() = oPhone
        .cmbPh2.List() = oPhone
        .cmbPh1.Value = oPh1
        .cmbPh2.Value = oPh2
        If oPaper = "L" Then
            .optL.Value = True
        Else
            .optA.Value = True
        End If
    End With
    End Sub
    
  4. リボン コントロールのモジュールを作成します。このモジュールでは、ユーザー フォームを表示するプロシージャを追加し、そのプロシージャをリボン コントロールとして宣言します。

    Sub UserInfo(ByVal control As IRibbonControl)
    frmInfo.Show
    End Sub
    

この例では、ユーザー情報はレジストリに保存されます。その保存された情報は、PowerPoint または Excel 用のカスタム コンテンツを作成する場合など、必要に応じて別のアドインを使用してアクセスできます。つまり、この例のコードとユーザー フォームは、PowerPoint または Excel でも同じように作成できたはずです。

カスタム ドキュメントを作成するには

  • このタスクについては、この例では会社のブランド マークが入ったレターのようなドキュメント テンプレートから始めます。この例のコードは、テンプレートからドキュメントを生成します。その後、ユーザーの基本設定に基づいてドキュメントをカスタマイズし、ドキュメントの本文とフッターに表示されるコンテンツ コントロールに、格納されているユーザー情報を入力します。

  • 図 3 を見ると、このレター サイズのドキュメント テンプレートには、2 つの背景図形 (灰色のグラデーション背景と赤色のバー) が含まれていることがわかります。この図形は、ユーザーの用紙サイズの基本設定が A4 の場合はプログラムによって調整する必要があります。これらの図形には、Word 2010 の [オブジェクトの選択と表示] ウィンドウを使用してコードで識別しやすいように名前が付けられています。[オブジェクトの選択と表示] ウィンドウにアクセスするには、[ホーム] タブの [編集] グループで [選択] をクリックします。

  • 図 3 のドキュメント本文の名前と役職、フッターの住所、電話番号、および電子メール (電話番号と電子メールのラベルも) は、コンテンツ コントロールに含まれています。コンテンツ コントロールは、[開発] タブの [コントロール] グループから挿入できます。同じグループにある [デザイン モード] をクリックすると、プレースホルダー テキストにアクセスして編集できます。[プロパティ] をクリックすると、以下に示すコードでコンテンツ コントロールを識別するためのタグを追加するなど、コントロールの設定をカスタマイズできます。

    注意

    Word for Mac 2011 では、コンテンツ コントロールを作成したり、プログラムによってそのコントロールを操作できません。代わりに、このセクションで示したドキュメント コンテンツを事前設定するための参照点として、表のセルまたはブックマークを使用することを検討してみてください。

    ユーザーに表示されないようにブックマークを追加するには、ブックマークにアンダースコアで始まる名前を付けます。これは、プログラムによってのみ実行できます。ブックマークを追加するには、ブックマークを追加するドキュメント内の場所をクリックし、Visual Basic Editor でイミディエイト ウィンドウを使用してブックマークを追加します。選択した場所にブックマークを追加するコードを次のコード サンプルに示します。

    Selection.Range.Bookmarks.Add("_name")

    図 3. ドキュメントを生成するためにコードによって使用されるテンプレート

    ドキュメントを作成するためにコードで使用するテンプレート

  • このドキュメントを生成およびカスタマイズするコードを以下に示します。このようなアドインを実際に使用する場合には、このドキュメントは、ユーザーが作成する可能性がある複数のドキュメントの種類の 1 つになる可能性があるので、このコード用に個別のモジュールを作成することをお勧めします。このコードが完成した後で、前に作成したリボン モジュールにプロシージャを追加します。このプロシージャを使用して、このマクロを呼び出すリボン コントロールを宣言できます。

    Sub NewLetter()
    On Error GoTo ErrorHandler
    Dim cc As ContentControl
    'If the user has not yet saved their information, prompt with that option.
    If GetSetting("CustomDocs", "Info", "Name") = "" Then
    i = MsgBox("Would you like to save your document details now, so that they " _
    & "can be added to your documents automatically?", vbQuestion + vbYesNoCancel, _
    "Custom Document Tools")
        If i = vbYes Then
        frmInfo.Show
        ElseIf i = vbCancel Then
        Exit Sub
        End If
    End If
    
    Call modVarbs.DocVarbs
    'set the defined Word.Document variable to the new document when it's created.
    'avoids errors related to multiple concurrent open documents.
    Set oDoc = Documents.Add(oPath & "\CompanyTools\CustomDocs\CompanyLetter.dotx")
    
    'if the saved paper size preference is A4, this changes the paper size and
    'then corrects the size and position of the background graphics in the header.
    If oPaper = "A" Then
    oDoc.PageSetup.PaperSize = wdPaperA4
        With oDoc.Sections(1).Headers(wdHeaderFooterFirstPage).Range
                With .ShapeRange("Backing")
                    .Width = 541.75
                    .Height = 841.95
                End With
                With .ShapeRange("Edge")
                    .Width = 53.2
                    .Height = 841.95
                    .Left = 542.5
                End With
        End With
    End If
    
    'populate the saved information in the controls provided in the template.
    For Each cc In oDoc.Range.ContentControls
        Select Case cc.Tag
            Case "Name"
            cc.Range.Text = oName
            Case "Title"
            cc.Range.Text = oTitle
        End Select
    Next cc
    
    For Each cc In oDoc.Sections(1).Footers(wdHeaderFooterFirstPage) _
    .Range.ContentControls
        Select Case cc.Tag
            Case "Address Line 1"
            cc.Range.Text = oAdd1
            Case "Address Line 2"
            cc.Range.Text = oAdd2
            Case "Label1"
            cc.Range.Text = oPh1
            Case "Label2"
            cc.Range.Text = oPh2
            Case "Phone1"
            cc.Range.Text = oPDat1
            Case "Phone2"
            cc.Range.Text = oPDat2
        End Select
    Next cc
    Exit Sub
    
    ErrorHandler:
    Select Case Err.Number
        Case 5174
        MsgBox "The document template is unavailable." & _
        " Please contact your local IT staff for assistance." _
        , vbInformation, "Custom Document Tools"
        Case Else
        MsgBox "The task ended in error. The template may be damaged. Note " & _
        " that your saved info may not have been added to the new document.", _
        vbInformation, "Custom Document Tools"
    End Select
    End Sub
    
  • この例では、ユーザー情報にバインドされていないコンテンツ コントロールを使用しました。ドキュメントの複数の場所に同じユーザー情報を表示する必要がある場合、別の送付状文書パーツと交換される可能性がある送付状に情報を表示する場合など、要件によってはバインドされたコントロールを使用するほうが望ましい場合があります。

アドイン用の UI の作成

この例のアドイン UI では、図 4 に示すように [ホーム] タブの [段落] グループの後に配置された分割ボタン コントロールを使用します。このリボンのカスタマイズを作成するには、前述の customUI の例で使用した手順 1. ~ 4 を実行します。手順 2. では、以下のマークアップを使用します。

<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui">
  <ribbon>
    <tabs>
      <tab idMso="TabHome" >
        <group id="CustomDocs" label="Company Docs" 
               insertAfterMso="GroupParagraph" >
          <splitButton id="CompanyDocs" size="large" >
            <menu id="coDocs" >
              <button id="NewLetter" visible="true" label="New Letter" 
                      onAction="Letter" imageMso="NewPageShort"/>
              <button id="UserInfo" visible="true" label="Save Info" 
                      onAction="UserInfo" imageMso="ContactAddMyContacts"/>
            </menu>
          </splitButton>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

図 4. [ホーム] タブでのアドイン カスタマイズ

[ホーム] タブのアドインのカスタマイズ

この例では、保存された情報を事前に入力するためにコンテンツ コントロールを使用しています。ただし、同じような処理を使用して、Word 文書、PowerPoint プレゼンテーション、または Excel ブックの別のオブジェクトを事前設定できます。たとえば、Word 文書の表のセルまたはブックマークの位置、PowerPoint のテキスト ボックス、またはExcel のワークシートのセルに、コンテンツを事前に入力できます。

注意

以下のセクションで説明するアプリケーション イベントは、Office for Mac 2011 では広くサポートされていません。PowerPoint 2011 ではアプリケーション イベントをサポートしておらず、Word 2011 でのサポートは非常に限定的です。ただし、Excel for Mac 2011 ではモジュールとクラス モジュールを設定するための同じ手順を使用して、そこで使用可能なさまざまなアプリケーション イベントを確認できます。Word または Excel でアプリケーション イベントを始めるのに役立つ情報については、以下のセクションの手順の後に記載されているメモを参照してください。また、Word 2011 ではドキュメント レベルのイベントがサポートされており、PowerPoint 2011 では、スライド ショーに固有のマクロの選択がサポートされています。

アプリケーション イベントの対話操作

ユーザーが印刷するとき、ファイルを閉じるときなど、アドインを使用してアプリケーションまたは特定のドキュメントで発生する組み込みの動作とやり取りする理由はさまざまです。VBA には、アプリケーション レベルで発生するイベント (つまり、開いているドキュメントは関係ない)、およびドキュメント レベルで発生するイベント (つまり、特定のテンプレートに基づくドキュメントなど、個別のドキュメントにのみ当てはまる) を含むイベントを対話操作する方法がいくつか用意されています。

ドキュメント レベルのイベントは、個別のドキュメントまたはテンプレートの VBA でよく使用されています。また、ドキュメントまたはテンプレートに組み込まれている動作とやり取りするコードをアドインで作成することがあります。ただし、アプリケーション レベルのイベントは、ユーザーが実行する動作とやり取りするために Word、PowerPoint、または Excel のアドインに直接組み込むことができるので、ほとんどの場合、アプリケーション レベルのイベントのほうがアドインに便利です。

この例では、PowerPoint でアプリケーション レベルのイベントを作成して、ユーザーがファイルを閉じるときに会社のプレゼンテーションをチェックする方法を考察しています。コードは、プレゼンテーションの複数のマスターをチェックし、マスターをプログラムによってクリーンアップして、最初の適切にブランド マークが配置されたマスターだけをファイルに残すオプションをユーザーに提供します。

注意

この記事では、特に、以前のファイル形式を使用するバージョンの Microsoft Office (Office 2003 以前) から Office 2010 (または Office 2007) に移行している企業で、ユーザーの多くが訴える不満に対応するのに役立つのでこの例を使用しています。ユーザーは以前のバージョンで作成したプレゼンテーションからスライドをコピーするとき、多くの場合 [元の書式を保持] コマンドを使用します。これは、このコマンドによって、そのスライドがプレゼンテーション内の他のスライドと同じような外観になるとユーザーが考えるためです。ただし、実際は、このコマンドを使用するたびに別のマスターとレイアウトのセットが追加されます。その結果、プレゼンテーションは、処理しきれないほどのマスター数、整合性のない書式設定、膨れあがったファイル サイズを抱えることになり、ユーザーや技術サポート スタッフはこのファイルは壊れている、破損していると考えます。例のコードに似たツールを使用して、プレゼンテーションが管理しにくくなる前にユーザーを補助し、ユーザーは特定の動作によって発生する問題について学習できます。

アプリケーション イベントを作成するには、VBA プロジェクトの既存のモジュールにあるコードを追加し、イベント コード自体のクラス モジュールを追加する必要があります。次の例では、ユーザーの基本設定に基づいて動作を実行できるようにユーザー フォームを使用します。

アドインでアプリケーション レベルのイベントを作成するには

  1. [挿入] タブの [クラス モジュール] をクリックして、クラス モジュールを作成します。[プロパティ] ウィンドウで、EventClassModule のようにわかりやすい名前をクラス モジュールに付けます。

  2. プロジェクトの既存のモジュールにコードを追加して、新しいクラス モジュールをインスタンス化します。これに必要なのは、1 つの宣言 (モジュールの一番上に現れる Dim ステートメントでクラス モジュール名を使用) と 2 つの小さいプロシージャです。

    Dim XMST As New EventClassModule
    Sub Auto_Open()
    Call InitializeMSTApp
    End Sub
    
    Sub InitializeMSTApp()
    Set XMST.app = Application
    End Sub
    
  3. ユーザーにマスターをプレゼンテーションから削除するかどうかをたずねるユーザー フォームを作成します。この例では、ユーザーに追加のオプションを提供するために単純なメッセージ ボックスではなくユーザー フォームを使用します。

    前のセクションのヒントを使用して、ユーザー フォームを作成します。完成したユーザー フォームは、図 5 に示すように 1 つのラベル、2 つのコマンド ボタン、および 1 つのチェック ボックスで構成されています。

    図 5. 完成したアプリケーション イベントのユーザー フォーム

    完了済みのアプリケーション イベント用ユーザー フォーム

  4. この例では、ユーザー フォームの背後にあるコードによって、イベント コードの実行を続行できるようにする (cmdYes)、つまりフォームの読み込みを解除するか、実行を終了 (cmdNo) します。今後同じファイルで作業するときにメッセージが表示されないようにするドキュメント プロパティ (chkDontFix) をファイルに追加するオプションがユーザーに提供されます。また、Terminate プロシージャは、ユーザーがダイアログ ボックスを閉じるためにタイトル バーの X をクリックした場合、中止を指示する値をイベント コードに渡します。

    Private Sub cmdNo_Click()
    If Me.chkDontFix.Value = True Then
        With ActivePresentation
            .CustomDocumentProperties.Add Name:="DontFix", _
            LinkToContent:=False, Type:=msoPropertyTypeBoolean, Value:=True
            .Saved = msoFalse
        End With
    End If
    Unload Me
    End Sub
    
    Private Sub cmdYes_Click()
    Me.Hide
    End Sub
    
    Private Sub userform_Terminate()
    oCncl = True
    End Sub
    
  5. イベントのコードを追加するには、クラス モジュールの先頭で、イベントで使用するアプリケーション変数を宣言します。次に、プロシージャを追加します。この例では、PresentationClose イベントが使用するプロシージャです。

    以下のコードでは、2 つの変数 oCncl (Boolean) と i (Integer) を追加しています。プロジェクト全体で使用するためにこれらの変数を Public として宣言するには、任意の標準モジュールの先頭で宣言します。

    Public WithEvents app As Application
    Private Sub app_PresentationClose(ByVal Pres As Presentation)
    Dim oProp As DocumentProperty
    oCncl = False
    i = 0
    'checks if the active presentation is a branded company
    'presentation. In this case, a document property is included
    'in the template for company presentations for ease of
    'identification.
    With ActivePresentation
        For Each oProp In .CustomDocumentProperties
            If oProp.Name = "CompanyPres" Then i = i + 1
        Next oProp
        If i = 0 Then Exit Sub
    'checks for the DontFix property added when the user
    'selects the check box in the user form.
        For Each oProp In .CustomDocumentProperties
            If oProp.Name = "DontFix" Then Exit Sub
        Next oProp
    'checks the presentation for the number of masters.
    'If only one master exists, there is no need to continue.
        If .Designs.Count = 1 Then Exit Sub
    End With
    'initiates the UserForm.
    With frmMasters
        .chkDontFix.Value = False
        .cmdYes.SetFocus
        .Show
    End With
    
    If oCncl = True Then
        Exit Sub
    End If
    
    Dim oDes As Design, oSd As slide
    'attaches all slides to the first master.
    With ActivePresentation
        For Each oSd In .Slides
            oSd.Design = .Designs(1)
        Next oSd
    'deletes all masters other than the first.
        Do Until .Designs.Count = 1
            For Each oDes In .Designs
                If Not oDes.Index = 1 Then oDes.Delete
            Next oDes
        Loop
    End With
    End Sub
    

このファイルをアドインとして保存し、PowerPoint に読み込んだ後、CompanyPres 変数と複数のマスターを含んでいるプレゼンテーションを使用してアドインをテストする必要があります。この記事のダウンロードに収録されているサンプル ドキュメントを使用します。さらに、テンプレートを使用して独自のテスト プレゼンテーションを作成します。

注意

前述の手順 1. と 2. を Word または Excel で同様に使用して、アプリケーション イベントのクラス モジュールを設定できます。手順 2. のコードはどのプログラムでも同じです。Word または Excel の Visual Basic Editor でクラス モジュールの先頭で同じステートメント Public WithEvents app As Application を使用して、アプリケーション イベントを操作する変数を宣言できます。その後、オブジェクト リスト (コード ウィンドウの左上にあるドロップダウン リスト) から app を選択すると、プロシージャ リスト (コード ウィンドウの右上にあるドロップダウン リスト) に使用可能なイベントが表示されます。

アドイン UI のプログラムによる制御

アドインのカスタム UI を作成するとき、UI の外観に対する制御を Office Open XML マークアップ単体で実行できる制御よりも強化する必要がある場合があります。たとえば、コントロールのラベル テキストは個別の条件によって異なる可能性があり、コントロールの表示/非表示はユーザーの基本設定によって異なる可能性があります。customUI スキーマには、このような柔軟性を提供する属性が用意されています。

次のシナリオでは、ある企業が Excel 用の一連のカスタム ツールをリボン上で提供しています。タブを表示するかどうかはユーザーによって異なります。アドインでは、カスタム タブを表示するかどうかを起動時にユーザーにたずねます。ユーザーがカスタム タブを表示しないことを選択した場合、アドインは、[ホーム] タブの最後にユーザーがカスタム タブの表示方法を変更できるコントロールを表示します。

この VBA プロジェクトでは、リボン コントロール プロシージャを配置するためのモジュールとユーザーの基本設定を取得するユーザー フォームが必要で、ユーザーが Excel を起動するたびにコードを実行するイベントを作成できるアドインの ThisWorkbook オブジェクトにコードを記述する必要があります。

以下の手順を実行する前に、カスタム リボン タブと、最初にタブを表示しないことを選択したユーザーに表示するリセット コントロール両方に対して customUI.xml マークアップを記述しておく必要があります。

リボンのカスタマイズの動作をプログラムによって制御するには

  1. Excel を起動したときにユーザーに基本設定をたずねるユーザー フォームを作成します。

    前のセクションと同様、この例では、ユーザーに追加のオプションを提供するためにメッセージ ボックスではなくユーザー フォームを使用します。

    図 6. 完成した Workbook_Open イベントのユーザー フォーム

    完了済みの Workbook_Open イベント用ユーザー フォーム

  2. ユーザー フォームの背後にコードを追加して、ユーザーの基本設定を示す変数の値を設定します。この変数は、プロジェクトの標準モジュールで文字列として Public 宣言する必要があります。

    Private Sub cmdNever_Click()
    oVis = "Never"
    Me.Hide
    End Sub
    
    Private Sub cmdNo_Click()
    oVis = "No"
    Me.Hide
    End Sub
    
    Private Sub cmdYes_Click()
    oVis = "Show"
    Me.Hide
    End Sub
    
  3. プロジェクトの ThisWorkbook オブジェクトに Workbook_Open イベントを追加します。ここに示すコードは、ユーザーがダイアログ ボックスを表示しないことをまだ指定していない場合にダイアログ ボックスを表示します。ダイアログ ボックスを表示し、ユーザーが新しく選択した基本設定 (はい、いいえ、または今後表示しない) をレジストリに保存します。

    Private Sub Workbook_Open()
    Dim iResp As Integer
    oVis = GetSetting("CustomDocs", "Info", "ExcelVis")
    If Not oVis = "Never" Then
        frmTools.Show
        SaveSetting "CustomDocs", "Info", "ExcelVis", oVis
    End If
    End Sub
    

    Excel の ThisWorkbook オブジェクトは他にはない利便性をアドインに提供します。このオブジェクトでは、アプリケーション レベルでドキュメント レベルのイベントを使用できます。ThisWorkbook はアドイン ファイル自体を参照するので、アプリケーションが起動し、自動的にアドイン ファイルを読み込む (開く) と、次のコード サンプルで使用している Workbook_Open イベントが実行されます。

  4. プロジェクトの新しいまたは既存のモジュールで、customUI とやり取りするプロシージャを追加します。

    この例では、1 つのプロシージャを使用して、customUI ファイルに渡される表示の基本設定を確立します。もう 1 つのプロシージャは、表示するかどうかをたずねるメッセージを表示しないことをユーザーが選択した場合に、後でその選択をリセットできるように表示するコントロールに使用します。

    ShowControls プロシージャは、customUI.xml ファイルのコントロール ID を参照しています。この例では、1 つ目はカスタム タブに提供される ID です。2 つ目は、[ホーム] タブに追加されるオプションのリセット ボタンに提供される ID です。

    Public Sub ShowControls(ByVal control As IRibbonControl, ByRef visible As Variant)
    Select Case control.ID
        Case "TabCompany"
            If Not oVis = "Show" Then
                visible = False
            Else
                visible = True
            End If
        Case "CustomTools"
            If oVis = "Never" Then
                visible = True
            Else
                visible = False
            End If
    End Select
    End Sub
    
    Sub Reset(ByVal control As IRibbonControl)
    SaveSetting "CustomDocs", "Info", "ExcelVis", ""
    MsgBox "You will be prompted to show " & _
    "company tools the next time you start Excel.", _
    vbInformation, "Company Custom Tools"
    End Sub
    
  5. customUI.xml ファイルで、カスタム タブのタグとリセット ボタンを表示するグループのタグに GetVisible 属性を追加します。両方の値としてプロシージャ名 ShowControls を使用します。

    次の最初のマークアップは、編集対象の 2 つの行だけを示しています。2 つ目のマークアップは、コンテキスト内でこの 2 行を示しています。

    <tab id="TabCompany" label="Company Tools" insertBeforeMso="TabHome" getVisible="ShowControls">
    <group id="CustomTools" label="Company Options" getVisible="ShowControls">
    

    この例の目的はタブに対する表示制御を示すことなので、次の例のカスタム タブでは、任意に選択した組み込みコマンドを使用します。

    <?xml version="1.0" encoding="utf-8"?>
    <customUI xmlns="https://schemas.microsoft.com/office/2006/01/customui">
     <ribbon>
     <tabs>
      <tab id="TabCompany" label="Company Tools" insertBeforeMso="TabHome"
           getVisible="ShowControls">
        <group id="coTools" label="Sample Tools" 
               supertip="Arbitrarily selected tools to demo GetVisible behavior.">
         <button idMso="FileNewDefault" size="large" />
         <button idMso="FileSave" size="large"/>
         <separator id="space2" />
         <button idMso="Paste" size="large"/>
         <gallery idMso="PasteGallery" size="large" />
        </group>
      </tab>
      <tab idMso="TabHome" >
         <group id="CustomTools" label="Company Options" 
                getVisible="ShowControls">
           <button id="coRestore" size="large" label="Reset" 
                   onAction="Reset" imageMso="GroupJournalArrangement" />
         </group>
      </tab>
     </tabs>
     </ribbon>
    </customUI>
    

VBA コードの管理

アドインが完成し、共有できる状態になった後で、追加の手順を実行して、プロジェクトにデジタル署名することができます。VBA には、自己証明書と認証済み証明書の 2 つのコード署名オプションが用意されています。

自己証明書は、すばやく準備して簡単に使用できますが、ユーザーの身分を証明するものではありません。勤務先でコードに署名する必要がある場合は、指定の商用証明機関から認証済み証明書を購入する必要があります。

自己証明書を準備するには、[VBA プロジェクトのデジタル証明書] を使用します ([スタート]、[すべてのプログラム]、[Microsoft Office]、[Microsoft Office ツール] の順にクリックします)。

身分を証明できる証明書を購入できる商用証明機関を探す場合は、同様に [VBA プロジェクトのデジタル証明書] ダイアログ ボックスに移動し、該当するリンクをクリックすると、該当するベンダーのリストが表示されます。

次の手順

この記事では、Word、Excel、または PowerPoint 用の VBA アドインを作成する方法の基本について説明しました。アドインで幅広いタスクに使用できるいくつかの主要な概念の例も挙げています。言うまでもなく、1 つの記事で、VBA のように強力なプログラミング言語でできることをくまなく説明することはできません。新しいプロジェクトにマネージ コードが必要であると考える前に、VBA を検討し、目の前のタスクに最も単純なソリューションを提供するアプローチを特定することをお勧めします。

開発者は、ソリューションはコード ウィンドウで開始する必要があると考えがちです。マネージ コードでも VBA でも自動化しようとしているプログラムは、それ自体が強力で、柔軟性に優れていることを忘れないでください。ソリューションで簡単な自動化を必要とする場合は、コード (または、私たち開発者がコードだと考えるもの) を使用しない簡単なソリューションを構築できる可能性があります。たとえば、Word のバインドされたコンテンツ コントロールまたはフィールド コードは、Excel の関数と同様に、多くの動的な動作を実現できます。プロジェクトにとって有効なのが VBA を使用することでも、アプリケーション ウィンドウの機能を使用することでも、重要なのは、プロジェクトごとに選択肢を検討し、要件を評価して、特定のタスクに最適なツールを決定することです。

マネージ コードまたは VBA を使用してプロジェクトを開始し、プロジェクトの途中でもう 1 つのアプローチのほうが適していることがわかった場合は、VBA とマネージ コードの間で変換する方法について、次の「その他の技術情報」を参照してください。

その他の技術情報

著者について

Stephanie Krieger 氏は、『Advanced Microsoft Office Documents 2007 Edition Inside Out』と『Microsoft Office Document Designer』の 2 冊の本の著者です。プロのドキュメント コンサルタントとして、両方のプラットフォームで Microsoft Office 用のエンタープライズ ソリューションを開発できるように数々のグローバル企業を支援しています。同氏の Office 2010 と Office for Mac 2011 向けの新刊が、2011 年春に出版される予定です。