Application Object - Excel 97

CreateObject
Application
Excel
VBA
VBScript
Tips to handle Application Objects using Excel VBA.
本文を折り畳む 本文を開く

はじめに

今回のテーマは、Application Object です。 Workbook Object の上位 Object ですから、 Excel の最上位 Object 、つまり Excel 自身です。

小噺

Application とは何者?

多くの人にとって、初めて Application を使う機会は、ワークシートのセル上で使える関数を VBA コード中で使おうとして、コンパイルエラーになった時だと思います。
  MsgBox Sin(0.7)
  MsgBox Sum(1,2,3)
上のコードは、2行目の Sum のところで、コンパイルエラー「Sub または Function が定義されていません。」を引き起こします。ところが、
  MsgBox Sin(0.7)
  MsgBox Application.Sum(1,2,3)
このように、Application を入れるだけで、正しく動くようになります。 Sin と Sum の違いは何でしょうか? なぜ Application を入れるだけで解決するのでしょうか?
ここで世界を Excel から VBScript に切り替えます。 Application Object は Excel 自身ですから、それを理解するには、 Excel の外に出た方が見とおしが効きます。 メモ帳に次のコードを記述して、sin1.vbs というファイル名で保存し、実行してみましょう。
  MsgBox Sin(0.7)
Excel VBA の場合と同じように実行できます。( Windows 95 の場合は、WSH のインストールが必要です。)では、次のコードはどうでしょうか?
  MsgBox Sum(1,2,3)
やはり、これはエラーになります。 「実行時エラー: 型が一致しません。: 'Sum'」というエラーですが、この内容は、 Sum という関数が未定義だという意味です。
Sin 関数は、VB 系言語に標準で備わっています。VB でも VBA でも VBScript でも、Sin 関数は同じように使えます。これまでのコードで、 Sin(0.7) という部分は、 VB の標準関数 Sin が呼び出されていました。
一方、Sum 関数は、 Excel のワークシート関数です。 VB 系言語に標準で備わっているものではありません。そのため、いきなり Sum(1,2,3) と記述しても、関数が見つからないためエラーになります。 VBScript では、 Sum 関数は使えませんが、 Excel VBA なら、 Application.Sum とすることで、VBA は Sum が Excel 独自の関数だと、正しく理解でき、正しく使うことができます。

Excel の独自機能呼び出しには、常に Application. が必要か?

それでは、 Excel 独自の機能を呼び出すときには、常に Application. を付ける必要があるのでしょうか?
これまでの経験から、そんな事はないはずです。実際、ワークシート関数を除く、多くのメソッドやプロパティが、グローバルに定義されているため、Excel VBA 中で Application Object の機能を呼び出すときに、Application. を省略しても問題無く動作することの方が多くなっています。
  MsgBox Application.Workbooks.Count
  MsgBox Workbooks.Count
上記のコードは、1 行目も 2 行目も、同じ数字を返します。 Application. の要不要は、そのキーワードがグローバル定義されているかどうかに依存しています。

CreateObject と Application

Sub xlSum()
    Dim XL, a
    Set XL = Application
    a = XL.Sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    MsgBox a
    Set XL = Nothing
End Sub
上記のコードを Excel VBA で実行してみましょう。 Sum 関数が実行され、 1 から 10 までの和が 55 と計算されます。この記述方法は一見、冗長に見えますが、実は非常に移植性の高いコードになっています。
xlSum

Sub xlSum()
    Dim XL, a
    Set XL = CreateObject("Excel.Application")
    a = XL.Sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    MsgBox a
    XL.Quit
    Set XL = Nothing
End Sub
今度は、上記のコードを VBScript として実行してみましょう。メモ帳で記述して xl1.vbs などとして実行しましょう。 Excel の時と同じように、 55 が計算されるはずです。
2 つのコードの違いは、以下の部分です。
 [VBA]       Set XL = Application
 [VBScript]  Set XL = CreateObject("Excel.Application")

 [VBScript]  XL.Quit
Set XL = の部分は、 Excel 本体を XL という Object 変数に代入しています。 CreateObject("Excel.Application") という記述は、 Excel を新しく子プロセスとして起動してから、それを代入します。 Application という記述は、自分自身が Excel である場合に、自分自身を代入するものです。いずれにせよ、 Excel 本体が XL に代入されます。
最後の XL.Quit は、 Excel を終了するものです。 CreateObject で新しい Excel を起動したので、最後に正しい方法で閉じています。 Excel VBA でも、これを記述することができ、その場合には計算結果が表示された後、コードを実行していた Excel が終了します。
このように、 Application Object とは、外部から CreateObject("Excel.Application") で呼び出すものと同格のものなのです。
上記の VBScript 用コードで何が行われているか、判然としない場合は、 CreateObject の下に、次のコードを追加してみましょう。
    XL.Visible = True
これは、 Application Object の Visible プロパティを設定するものです。 CreateObject は Excel を不可視で起動するため、起動時の Visible プロパティが False になっています。

外部からゴールシークを使う

Sum 関数のためだけにわざわぜ Excel を起動するのも気が引けますから、もう少し Excel らしい使い方をしてみましょう。次のコードは、外部の VBScript から、 Excel のゴールシーク機能を利用して、方程式の解を求めます。
MsgBox calc("x^3-4*x*sin(x)+2", 0, 1)

Function calc(a, b, c)
    Dim XL, x, y
    Set XL = CreateObject("Excel.Application")
'    XL.Visible = True
    XL.Workbooks.Add
    Set x = XL.ActiveCell
    Set y = x.Next
    x.Name = "x"
    x.FormulaR1C1 = c
    y.FormulaR1C1 = "=" & a
    y.GoalSeek b, x
    calc = x.Value
    XL.ActiveWorkbook.Saved = True
    XL.Quit
    Set XL = Nothing
End Function
x^3-4*x*sin(x)+2 = 0 の解を、x=1 を初期値として求めます。

History

2002/3/24
URL移転
2001/4/7
初版
本文を折り畳む back to home index of VBA