Excel 2007 Application オブジェクト開発者向けガイド
Frank Rice、Microsoft Corporation
2008 年 1 月
適用対象:
Microsoft Office Excel 2007
要約: Application オブジェクトのメンバをプログラム上で操作し、Microsoft Office Excel 2007 のアプリケーションを拡張する方法について説明します。Application オブジェクトに関連する一般的な操作を多くのコード例を挙げていくつか紹介します。
目次
概要
Application オブジェクトからオブジェクトを参照する
Application オブジェクト コレクション
Application オブジェクトのプロパティ
Application オブジェクト メソッド
Application オブジェクトのイベント
Application オブジェクトを使用する他のタスク
結論
追加情報
概要
Application オブジェクトは Microsoft Office Excel 2007 オブジェクト モデルの中で最も上位のオブジェクトで、Excel アプリケーションそのものを表します。Application オブジェクトは、実行中のアプリケーション、そのインスタンスに適用されるオプション、およびそのインスタンス内で開いている現在のユーザー オブジェクトについての情報を公開します。 Application オブジェクトはオブジェクト モデルの中で最上位のオブジェクトなため、ブック、ワークシート、およびセルのコレクションや、これらのアイテムに含まれるデータなど、ブックを構成するパーツの多くも含まれています。
Application オブジェクトには次が含まれます。
- アプリケーション全体の設定とオプション。これらのオプションの多くは、[ツール] メニューの [オプション] ダイアログ ボックスにあるのと同じオプションです。
- ActiveCell や ActiveSheet など、最上位オブジェクトを返すメソッド。
以下のセクションでは、Microsoft Visual Basic for Applications (VBA) のコード例を使用して、Application オブジェクトに関連し頻繁に使用するオブジェクト、メソッド、およびプロパティをいくつか紹介します。すべての Application オブジェクト モデル メンバの詳細については、「Application Object Members (英語)」を参照してください。
Application オブジェクトからオブジェクトを参照する
Application オブジェクトを返すには、Application プロパティを使用します。アプリケーションを参照した後、Application オブジェクトの下位のオブジェクトにアクセスするには、オブジェクト モデルの階層を下へ移動します。次の例では、ワークシートの最初のセルが 20 と設定されています。
Application.Workbooks(1).Worksheets(1).Cells(1, 1) = 20
セルを参照するために、この例では Application オブジェクトから始まり、最初のブック、最初のワークシート、セルの順に移動します。
次の例では、Excel ブック オブジェクトを別のアプリケーションで作成し、次いで Excel でブックを開きます。
Set xl = CreateObject("Excel.Sheet")
xl.Application.Workbooks.Open "newbook.xls"
アクティブ ワークシート (ActiveSheet プロパティ) など、最も一般的なユーザー インターフェイス オブジェクトを返すプロパティとメソッドの多くは、Application オブジェクトの修飾子なしで使用することができます。たとえば、Application.ActiveSheet.Name = "Monthly Sales" と記述する代わりに、ActiveSheet.Name = "Monthly Sales" と記述することができます。 ただし、これらのショートカット表記を使用する場合は、正しいオブジェクトを選択するよう注意が必要です。 Worksheet オブジェクトの Activate メソッドを使用した場合など、適切なブックとワークシートを選択していることが確かな場合は、Cell(1, 1) を使用して最初のセルを参照することができます。
いくつかのインスタンスについては、Application 修飾子を使用する必要があります。たとえば、この記事の後で説明する OnTime メソッドは、修飾子を必要とします。アプリケーション ウィンドウの Width と Height プロパティも同様です。一般に、Excel ウィンドウの外観に関係するプロパティや、アプリケーション全体の動作に影響するプロパティの場合、Application 修飾子が必要です。たとえば、数式バーの表示、非表示に使用する DisplayFormulaBar プロパティや、Calculation メソッドの場合、修飾子が必要です。
Application オブジェクト コレクション
このセクションでは、Application オブジェクトに関連するコレクションのいくつかについて詳しく説明します。
AddIns コレクション
AddIns コレクションは、Excel に現在ロードされているすべてのアドインを表します。他のコレクションを反復処理するのと同様に、アプリケーションにあるアドインについてのさまざまな種類の情報を一覧表示することができます。次の例では、Excel に現在ロードされているアドインのパスと名前が一覧表示されています。
Sub ListAddIns()
Dim myAddin As AddIn
For Each myAddin In AddIns
MsgBox myAddin.FullName
Next
End Sub
Columns コレクションと Rows コレクション
これらのコレクションは作業中のブックの列と行を表します。これらのコレクションを使用して、それぞれ特定の列と行を選択します。
Application.Columns(4).Select
このステートメントでは D 列を選択します。ユーザー インターフェイスのヘッダーをクリックして選択するのと同様です。
Application.Rows(5).Select
このステートメントではワークシートの 5 番目の行を選択します。行の境界をクリックして選択するのと同様です。
Dialogs コレクション
Dialogs コレクションは、アプリケーション内のすべてのダイアログ ボックスから成ります。Dialogs コレクションについてはこの記事の後で詳しく説明します。
Sheets コレクション
Sheets オブジェクトは、指定のブックまたは作業中のブックにあるすべてのシートのコレクションを返します。Sheets コレクションには Chart オブジェクトか Worksheet オブジェクトを含めることができます。次の例では、作業中のブックにあるすべてのワークシートを印刷します。
Application.Sheets.PrintOut
この例では、すべてのワークシートをループ処理し、データ範囲のあるすべてのワークシートを印刷します。
For iSheet = 1 To Application.Sheets.Count
If Not IsEmpty(Application.Sheets(iSheet).UsedRange) Then
Application.Sheets(iSheet).PrintOut copies:=1
End If
Next iSheet
アプリケーション オブジェクトのプロパティ
Excel 2007 アプリケーション内のさまざまなオブジェクトにアクセスするためのプロパティは、記憶したり、ここで説明したりすることができないほど数多く存在します。しかし、幸いなことに頻繁に使用するプロパティはごく少数しかありません。
- ActiveCell
- ActiveChart
- ActiveSheet
- ActiveWindow
- ActiveWorkbook
- RangeSelection
- Selection
- StatusBar
- ThisWorkbook
次のシナリオで、これら頻繁に使用するプロパティの使用法を説明します。
ActiveCell プロパティ
Application オブジェクトの ActiveCell プロパティは、Range オブジェクトを返します。Range オブジェクトは、作業中のブック内のアクティブ ワークシートのアクティブ セルを表します。オブジェクトの修飾子を指定しない場合、このプロパティは作業中のウィンドウ内のアクティブ セルを返します。
アクティブ セルと、セルの選択範囲とは異なることに注意してください。アクティブ セルとは、現在の選択範囲内の 1 つのセルです。 選択範囲にはセルのコレクションを含めることができますが、アクティブ セルはそのうち 1 つだけです。
次の例では、アクティブ セルのフォント書式を変更します。確実に正しいセルで作業できるよう、Worksheets コレクションの Activate メソッドで Sheet1 をアクティブ ワークシートにしている点に注目してください。
Worksheets("Sheet1").Activate
With ActiveCell.Font
.Bold = True
.Italic = True
End With
ActiveChart プロパティ
ActiveChart プロパティは Chart オブジェクトを返します。Chart オブジェクトはアクティブ グラフを表し、それが埋め込みグラフかグラフ シートかを表します。埋め込みグラフは、選択またはアクティブ化するとアクティブと見なされます。次の例では、ActiveChart プロパティを使用して Monthly Sales ワークシートに 3D 縦棒グラフを追加します。
Sub AddChart()
Charts.Add
With ActiveChart
.ChartType = xl3DColumn
.SetSourceData Source:=Sheets("Sheet1").Range("B3:H15")
.Location Where:=xlLocationAsObject, Name:="Monthly Sales"
.HasTitle = True
.ChartTitle.Characters.Text = Monthly Sales by Category
End With
End Sub
ActiveSheet プロパティ
ActiveSheet プロパティは Worksheet オブジェクトを返します。Worksheet オブジェクトは現在選択しているシート (一番上のワークシート) を表します。ブック内でアクティブ シートは 1 つだけです。次の例では、アクティブ シートの名前を表示します。
MsgBox "The name of the active sheet is " & ActiveSheet.Name
次の例では、アクティブ ワークシートを指定の回数コピーし、コピーを Sheet1 の上に置きます。
Sub CopyActiveSheet()
Dim x As Integer
x = InputBox("Enter number of times to copy active sheet")
For numtimes = 1 To x
' Put copies in front of Sheet1.
ActiveWorkbook.ActiveSheet.Copy _
Before:=ActiveWorkbook.Sheets("Sheet1")
Next
End Sub
ActiveWindow プロパティ
ActiveWindow プロパティは Window オブジェクトを返します。Window オブジェクトは作業中のウィンドウ (一番上のウィンドウ) を表します。次の例では、作業中のウィンドウ名 (Caption プロパティ) を表示します。
MsgBox "The name of the active window is " & ActiveWindow.Caption
Caption プロパティは作業中のウィンドウの名前として機能します。これにより、ユーザーはインデックス番号の代わりにわかりやすい名前を使用してウィンドウにアクセスすることができます。
次の例では、ワークシートを選択、印刷してから、2 番目のワークシートについても同様のプロセスを繰り返します。
Sub PrintWorksheet()
Application.ScreenUpdating = False
Sheets("Sales").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
Sheets("Expenses").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
End Sub
この例で、ScreenUpdating プロパティが False に設定されているのを疑問に思うかもしれません。Excel で一連のタスクが実行される間、画面は何度も更新され、最新の情報に更新されます。 この結果、画面はちらつきます。 それで、ScreenUpdating プロパティを False に設定すると、このちらつきをなくすことができるのです。 また、画面更新のためにコンピュータのプロセッサが一時停止する必要がなくなるため、大きなアプリケーションの動作をいくらか速くすることができます。
ActiveWorkbook プロパティ
ActiveWorkbook プロパティは Workbook オブジェクトを返します。Workbook オブジェクトは作業中のウィンドウ (一番上のウィンドウ) にあるブックを表します。この例では、作業中のブックの名前を表示します。
MsgBox "The name of the active workbook is " & ActiveWorkbook.Name
次の例では、他のブックで計算が行われないよう計算モードを手動に設定してから、作業中のブックにある各ワークシートをループ処理して計算します。
Sub CalcBook()
Dim wks As Worksheet
Application.Calculation = xlManual
For Each wks In ActiveWorkbook.Worksheets
wks.Calculate
Next
Set wks = Nothing
End Sub
RangeSelection プロパティ
RangeSelection プロパティは Range オブジェクトを返します。Range オブジェクトは、指定したウィンドウのワークシート上で選択されているセルを表します。ワークシート上でグラフィック オブジェクトがアクティブになっているか選択されている場合も、選択されているセルを表します。この例では、作業中のウィンドウにあるワークシート上で選択されているセルのアドレスを表示します。
MsgBox Application.ActiveWindow.RangeSelection.Address
セルの範囲を選択する場合、RangeSelection プロパティと Selection オブジェクトはセルの同じ範囲を表します。グラフィックを選択する場合、RangeSelection プロパティは以前のセルの選択範囲を返します。 Selection プロパティの詳細については、次のセクションで説明します。
次の例では、セルの最初の 3 文字を表示します。
Range("A1").Select
MsgBox Left(ActiveWindow.RangeSelection.Name.Name, 3)
この式でこの構文が使用されているのを疑問に思うかもしれません。
ActiveWindow.RangeSelection.Name.Name
範囲を選択する場合、Sheet1!$A$1:$B$15 のような範囲のアドレスがあります。範囲のアドレスは、RangeSelection.Name コマンドで取得します。また、MyRange1 のような範囲の名前もあります。範囲の名前は、RangeSelection.Name.Name コマンドで取得します。
Selection プロパティ
Selection プロパティは、Application オブジェクトに対し、作業中のウィンドウ内で選択したオブジェクトを返します。たとえば、セルに対してこのプロパティは Range オブジェクトを返し、グラフに対しては Chart オブジェクトを返します。 オブジェクト修飾子なしでプロパティを使用すると、Application.Selection を使用するのと同じになります。
この例では、Sheet1 上の選択をクリアします (セルの範囲を選択している場合)。
Worksheets("Sheet1").Activate Selection.Clear
次の例では、選択した行の合計数を NumRows 変数に格納します。
NumRows = 0
For Each area In Selection.Areas
NumRows = NumRows + area.Rows.Count
Next area
この例では、選択範囲内にあるセルの数を数え、結果をメッセージ ボックスに表示します。
Sub Count_Selection()
Dim cell As Object
Dim count As Integer
count = 0
For Each cell In Selection
count = count + 1
Next cell
MsgBox count & " item(s) selected"
End Sub
StatusBar プロパティ
StatusBar プロパティは、ステータス バーのテキストを返すか、設定します。このプロパティでは、Excel ウィンドウの下部にあるステータス バーに表示されるメッセージを変更することができます。 完了までに時間のかかる処理の進捗状況をユーザーに随時知らせるのに特に役立ちます。
ステータス バーが Excel で制御されている場合、StatusBar プロパティは False を返します。また、ステータス バーのテキストを既定に戻すには、プロパティを False に設定します。ステータス バーを非表示にしていてもこの設定で既定に戻ります。
たとえば、次の構文で各ファイルを処理し、StatusBar プロパティにテキストを割り当てます。
Dim FileNum As Integer
FileNum = 0
For Each file in Files
' Do something here.
Application.StatusBar = "Now processing File " & FileNum
FileNum = FileNum + 1
Next
ルーチンが終了したら、次のステートメントを使用してステータス バーを通常の状態に戻します。
Application.StatusBar = False
独自のプロシージャを作成し、StatusBar プロパティを使用してマクロや他の処理の進捗状況を表示することができます。
Sub ShowStatusBarProgress()
Dim i As Long
Dim pctDone As Double
Dim numSquares As Long
Const MAXSQR As Long = 15
For i = 1 To 30
pctDone = i / 30
numSquares = pctDone * MAXSQR
Application.StatusBar = Application.Rept(Chr(31), numSquares)
Application.Wait Now + TimeSerial(0, 0, 1)
Next i
Application.StatusBar = False
End Sub
この例では、MAXSQR 定数で定義した最高 15 個の正方形を表示します。正方形は ASCII 文字 31 を使用して表示します。 この例では、処理中であることを示すのみでマクロの進捗状況は視覚的に表現されません。 Wait メソッドは、実行に長時間かかるマクロをシミュレートします。
ThisWorkbook プロパティ
ThisWorkbook プロパティは、Workbook オブジェクトを返します。Workbook オブジェクトは、現在のマクロ コードが実行されているブックを表します。このプロパティを使用すると、アドインはコードのあるブックを参照することができます。作業中のブックがアドイン コードのあるブックであるとは限らないため、このインスタンスでは ActiveWorkbook プロパティを使用することはできません。つまり、ActiveWorkbook プロパティはアドイン ブックを返すのではなく、アドインを呼び出しているブックを返します。Visual Basic コードからアドインを作成する場合、ThisWorkbook プロパティを使用してステートメントを修飾する必要があります。ステートメントはアドインにコンパイルするブック上で実行される必要があります。
次の例では、コードのあるブックを閉じます。ブックへの変更がある場合、変更は保存されません。
ThisWorkbook.Close SaveChanges:=False
次の例では、開いている各ブックをループ処理して閉じます。その後、このコードのあるブックを閉じます。
Private oExcel As Excel.Application
Private wbk As Excel.Workbook
Sub CloseOpenWrkBks()
Dim wrkb As Workbook
For Each wbk In Application.Workbooks
If wrkb.Name <> ThisWorkbook.Name Then
wbk.Close True
End If
Next wbk
ThisWorkbook.Close True
End Sub
Application オブジェクト メソッド
Application オブジェクトのプロパティの他に、頻繁に使用するメソッドのいくつかについて次に説明します。
FindFile メソッドと Dialogs コレクション
GetOpenFilename メソッドとは異なり、FileFind メソッドは [開く] ダイアログ ボックスを表示し、ユーザーがファイルを開くようにします。新しいファイルが正常に開くと、メソッドは True を返します。 ユーザーがダイアログ ボックスをキャンセルすると、メソッドは False を返します。
次の例では、ユーザーに特定のファイルを開くよう指示するメッセージを表示し、次いで [開く] ダイアログ ボックスを表示します。ユーザーがファイルを開くことができない場合は、メッセージが表示されます。
Sub OpenFile1( )
Dim bSuccess As Boolean
Msgbox "Please locate the MonthlySales.xls file."
bSuccess = Application.FindFile
If Not bSuccess Then
Msgbox "File not open."
End If
End Sub
Dialogs コレクションの列挙型の 1 つを使用して特定のダイアログ ボックスを開いても、同じ操作を実行できます。Show メソッドの使用時に Dialogs コレクションを使用する利点の 1 つは、引数を渡して組み込みのダイアログ ボックスの既定動作を変更できることです。 たとえば、xlDialogOpen の引数は、 file_text、update_links、read_only、format、prot_pwd、write_res_pwd、ignore_rorec、file_origin、custom_delimit、add_logical、editable、file_access、notify_logical、converter です。
**メモ: **特定のダイアログ ボックスに対して設定する引数を見つけるには、対応するダイアログ ボックスの定数を Excel ヘルプの「組み込みのダイアログ ボックスの引数一覧」で探します。
次の例では、[ファイル名] ボックスのファイル名が Book1.xlsm の状態で [開く] ダイアログ ボックスを表示します。これによりユーザーはファイルを選択せずに、ファイルを表示できます。
Sub OpenFile2( )
Application.Dialogs(XlBuiltInDialog.xlDialogOpen).Show arg1:="Book1.xlsm"
End Sub
Dialogs コレクションで重要なのは、このコレクションを使用すると、約 250 ある Excel ダイアログ ボックスをどれでも表示することができる点です。Dialogs コレクションにあるダイアログ ボックスの全一覧を参照するには、次の手順を実行します。
Dialogs コレクションのメンバ一覧を参照するには
- VBA モジュールを開きます。
- オブジェクト ブラウザを表示するには、[表示] メニューの [オブジェクト ブラウザ] をクリックします。または、F2 キーを押します。
- 検索ボックスに「xlDialog」と入力します。
- 検索ボタンをクリックします。
GetOpenFilename メソッド
GetOpenFilename メソッドは、標準の [開く] ダイアログ ボックスを表示し、ユーザーからファイル名を取得します。このとき実際にファイルは開きません。GetOpenFilename メソッドは、ユーザーが選択した完全なパスとファイル名を文字列として返すだけです。このため、このメソッドを使用すると、アプリケーションからブックを開くプロセスを最大限制御することができます。取得する情報をどう扱うかは開発者次第です。たとえば、その結果を OpenText メソッドに渡すこともできます。メソッドの構文は次のとおりです (引数はすべてオプションです)。
GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
FileFilter は、フィルタの条件 (*.txt、*.xla など) を定義する文字列です。FilterIndex は、ファイル フィルタリングの既定の条件のインデックス番号を指定します。1 から FileFilter で指定したフィルタの数までを指定することができます。Title は、ダイアログ ボックスのタイトルを指定します。ButtonText は Macintosh コンピュータの場合のみ使用します。MultiSelect は Boolean 値で、複数ファイルの選択を可能にするよう指定します。
次の例では、[ファイルの種類] ボックスのフィルタリングを [テキスト ファイル (*.txt)] に設定にして [開く] ダイアログ ボックスを表示し、次いでユーザーが選択したファイル名を表示したメッセージ ボックスを表示します。ファイルは開かれないことに注目してください。
Dim fileToOpen As String
fileToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt")
If fileToOpen <> "" Then
MsgBox "Open " & fileToOpen
End If
InputBox メソッド
ご想像のとおり、InputBox メソッドは、値を入力するようユーザーに要求するダイアログ ボックスを表示します。このメソッドを使用すると、ユーザーに要求するデータの型を指定して、入力の選択的検証を行うことができます。 InputBox メソッドの構文は次のとおりです。
InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)
ここで、
Prompt はダイアログ ボックスに表示されるメッセージです。ここで、要求するデータの型をユーザーに知らせることができます。
Title はダイアログ ボックスの上部に表示されるタイトルです。
Default は最初に表示される既定値です。
Left と Top は、ダイアログ ボックスの位置を指定するのに使用します。これらの値は画面の左上隅を基準にし、ポイントで表現します。
HelpFile と HelpContextID はヘルプ ファイルを指定します。これらの値を使用すると、[ヘルプ] ボタンがダイアログ ボックスに表示されます。
Type は返されるデータ型です。既定値は Text です。使用可能な型を表 1 に示します。
表 1. InputBox で返されるデータ型
値 | 型 |
---|---|
0 | 数式。数式は文字列として返されます。 これは唯一必要な引数です。 |
1 | 数値。値を持つ数式を含めて、値が返されるようにすることもできます。 |
2 | テキスト (文字列)。 |
4 | 論理値 (True または False)。 |
8 | Range オブジェクトとしてのセル参照。 |
16 | #N/A などのエラー値。 |
64 | 数値配列。 |
**メモ: ** Type が 8 の場合、Set ステートメントを使用して結果を Range オブジェクトに割り当てる必要があります。次に例を示します。
Set myRange = Application.InputBox(prompt := "Sample", type := 8)
次の例では、ユーザーにコピーの数を入力するよう要求するメッセージを表示し、アクティブ ワークシートをその数だけ印刷します。メソッドが数値を要求するよう型で指定することに注目してください。
Sub PrintActiveSheet()
Dim TotalCopies As Long, NumCopies As Long
Dim sPrompt As String, sTitle As String
sPrompt = "How many copies do you want?"
sTitle = "Prints the active sheet"
TotalCopies = Application.InputBox(Prompt:=sPrompt, Title:=sTitle, Default:=1, Type:=1)
For NumCopies = 1 To TotalCopies
ActiveSheet.PrintOut
Next NumCopies
End Sub
Run メソッド
Run メソッドはマクロの実行または関数の呼び出しを行います。このメソッドを使用して、VBA や Excel マクロ言語で記述されたマクロを実行、または DLL (dynamic-link library) や XLL (Excel アドイン) の関数を実行することができます。 XLL とは、Excel 用のアドインです。DLL の構築をサポートするコンパイラを使用して構築することができます。 このメソッドの構文は次のとおりです。
Run(Macro, Arg1, , Arg30)
Macro は、実行するマクロまたは関数の名前です。Arg1 から Arg30 までは、マクロや関数を渡すのに必要な引数です。
次の例では、Run メソッドを使用して、範囲内のセルのフォントを Bold に設定するプロシージャを呼び出します。Call メソッドを使用しても同じ結果を得ることができる点に注目してください。
Sub UseRunMethod()
Dim wks As Worksheet
Dim rng As Range
Set wks = Worksheets("Sheet2")
Set rng = wks.Range("A1:A10")
Application.Run "MyProc ", rng
' You could accomplish the same thing with:
' Call MyProc(rng)
End Sub
Sub MyProc(rng As Range)
With rng.Font
.Bold = True
End With
End Sub
Application オブジェクトのイベント
Application オブジェクトはいくつかのイベントも公開します。このイベントを使用して、Excel アプリケーション全体に対するアクションを監視することができます。Application イベントを使用するには、イベントの監視を有効にする必要があります。
Application イベントの監視を有効にするには
クラスを作成します。[挿入] メニューで [クラス モジュール] をクリックします。
[プロパティ] ウィンドウで、クラスの名前を AppEventClass に変更します。
クラスのコード ウィンドウで次を追加します。
Public WithEvents Appl As Application
これで、アプリケーション レベルのイベントをアプリケーションで利用できるようになりました。
試しに、コード ウィンドウの [オブジェクト] リストで [適用] をクリックします。
コード ウィンドウの [プロシージャ] リストで [Appl_WorkbookOpen] をクリックします。これにより Appl_WorkbookOpen イベントのプレースホルダ プロシージャが挿入されます。
プロシージャを次のように置き換えます。
Private Sub Appl_WorkbookOpen(ByVal Wb As Workbook) MsgBox "You opened the workbook." End Sub
同じ手順を繰り返し、Appl_WorkbookBeforeClose イベントを挿入します。プレースホルダ コードを次のように置き換えます。
Private Sub Appl_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean) MsgBox "You closed the workbook." End Sub
次に、クラス モジュール内に作成した Application オブジェクトを参照するのに使用する変数を作成します。VBA プロジェクトの [プロジェクト] ウィンドウで [ThisWorkbook] ノードをダブルクリックし、コード ウィンドウを開きます。
次のステートメントを追加します。
Dim ApplicationClass As New AppEventClass
宣言したオブジェクトから Application オブジェクトへの接続を作成します。この接続を作成するには、ThisWorkbook コード ウィンドウに次のプロシージャを追加します。
Private Sub Workbook_Open() Set ApplicationClass.Appl = Application End Sub
ブックを保存して閉じます。
ここでブックを開いてコードを試します。Appl_WorkbookOpen イベントに対してダイアログ ボックスが表示される点に注目してください。
ブックを閉じます。Appl_WorkbookBeforeClose イベントに対してダイアログ ボックスが表示される点に注目してください。
AppEventClass クラス モジュールに戻り、[プロシージャ] リストをクリックすると、アプリケーション内のアクションを監視するのに使用できるイベントの数が表示されます。
これらのイベントがどのように、どのような順序でトリガされるかを理解することは、アプリケーションを理解する上で重要です。クラスに他のイベントを追加し、メッセージ ボックスを挿入してから、さまざまなアクションを試して、特定のイベントがいつトリガされるかを確認してください。
Application オブジェクトを使用する他のタスク
Application オブジェクトのうち最も頻繁に使用するオブジェクトの他にも、Excel アプリケーションで実行する他のタスクがあります。次のセクションでは、これらのタスクのいくつかについて説明します。
ワークシートを保存せずに削除する
次の例では、まず、ワークシートを保存するかどうかをたずねるメッセージをオフにします。次に、ワークシートを削除し、警告メッセージを再びオンにします。
Sub DeleteSheet()
Application.DisplayAlerts = False
ActiveSheet.Delete
Application.DisplayAlerts = True
End Sub
ユーザーにメッセージを表示せずにワークシートを保存する
この例では、ユーザーに通知せずにワークシートを保存します。
Sub SaveWorksheet()
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs "C:\MonthlySales.xls"
Application.DisplayAlerts = True
End Sub
SendKeys を使用して情報をメモ帳に送る
次の例では、SendKeys コマンドを使用して Excel からメモ帳にデータの範囲をコピーし、次いでメモ帳のファイルを保存します。
Sub SKeys()
Range("A1:D15").Copy ' Copy the range.
SendKeys "% n", True ' Minimize Excel.
Shell "notepad.exe", vbNormalFocus ' Start Notepad.
SendKeys "^V", True ' Past the range data into Notepad.
SendKeys "%FA", True ' Specify SaveAs.
SendKeys "SalesData.txt", True ' Provide a file name.
SendKeys "%S", True ' Save the file.
Close notepad
End Sub
この例では、まずデータの範囲をクリップボードにコピーします。次に、Excel を最小化し、メモ帳を起動して、データをクリップボードからメモ帳にコピーします。 次に、ファイル名を指定し、ファイルを保存します。 最後に、メモ帳を閉じます。
指定した時刻に指定した間隔で実行されるようマクロをスケジュールする
Application オブジェクトの OnTime メソッドを使用して、指定した時刻に、または一定の時間間隔でプロシージャを実行することができます。OnTime メソッドの構文は次のとおりです。
Application.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
EarliestTime 変数は、Procedure 変数で命名したプロシージャを実行する時刻を指定します。LatestTime と Schedule 変数はオプションです。LatestTime 変数は、プロシージャを実行する最も遅い時間を指定します。Schedule 変数は、新しいプロシージャをスケジュールするかそれとも既存のプロシージャをキャンセルするかを指定します。 LatestTime 変数は、最初に呼び出したとき Excel がビジー状態にあり、時間範囲を指定してプロシージャを呼び出す必要がある場合に便利です。
次の例では、YourProc という名前のプロシージャを 5 分間隔で実行するよう指定します。
Application.OnTime EarliestTime:= Now + TimeValue("00:05:00), _
Procedure := "YourProc"
次の例では、プロシージャを毎日正午に実行します。
Application.OnTime _
EarliestTime:=TimeValue("12:00:00"), _
Procedure:="YourProc"
次の例は、AutoSave プロシージャを 5 分間隔で呼び出すようスケジュールします。ブックを閉じると CleanUp プロシージャが呼び出され、必要なクリーンアップを実行し、追加の呼び出しをキャンセルします。
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:05:00"), "AutoSave"
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.OnTime Now + TimeValue("00:05:00"), "CleanUp", , False
End Sub
**メモ: ** Workbook_Open と Workbook_BeforeClose イベントは Workbook コード モジュールに含まれます。AutoSave と CleanUp プロシージャは標準コード モジュール内にあるはずです。
結論
この記事で扱うのは、Application オブジェクトのメンバのほんの一部です。他のメンバを使用して、ユーザーが Excel アプリケーションと情報をやり取りする方法を変更したり、アプリケーションのルック アンド フィールを変更したりできます。Application オブジェクトに精通すると、ニーズに応じて Excel の機能を拡張、調整することが可能になります。
追加情報
Application オブジェクトのメンバと Excel プログラミングの詳細については、次の情報源を参照してください。