MOS VBAエキスパート対策 | APIとOLEオートメーション | MOS Excel VBAエキスパート対策です



最終更新日:2018-03-11

APIとOLEオートメーション


・OLEオートメーションの概念
・OLEオートメーションの使い方
・OLEオートメーションの注意点
・APIの概念
・APIの使い方


【ここでのポイント】

OLEオートメーションは、Excel以外のアプリケーションを操作するものなので、対象となるアプリケーションは多数あります。
また、
APIは、それこそ膨大に存在します、その数さえ不明なほど沢山あります。


Excel以外のアプリケーションやAPIの細部を問う問題は出しようがありませんし、それは既にVBAの範疇ではありません。
従って、この章の内容で出題されるのは、「概念」と「使い方」に絞られます。
試験対策としてはあまり重要視する必要はないと思います。

概念として覚えるのは、どのような仕組みで、どのような機能なのかということです。
使い方として覚えるのは、VBAの記述方法ということです。

覚えるべき項目としては
・参照設定
・CreateObject関数
・Declareステートメント
これだけ覚えれば十分です。


OLEオートメーションの概念

OLEはObject Linking and Embedding(オブジェクトのリンクと埋め込み)の略です。
アプリケーションから、別のアプリケーションを操作するための規格です。

つまり、
各アプリケーションに別のアプリケーションから操作・連携できる仕組みを用意しておき、
その仕組みを、他のアプリケーションが使う事でアプリケーション連携が出来るという事です。

簡単なイメージとしては、
Excelから、Word、PowerPoint、OutLook、InternetExplorerなどを操作するために用意された機能と考えて良いです。

OLEオートメーションで操作するオブジェクトはExcelではないので、
そのオブジェクトが用意しているプロパティ・メソッドを使って操作することになります。

注意
ExcelからOLEオートメーションでEXcelを操作するという事も可能です。
いま動作しているExcelアプリケーションとは別に、Excelアプリケーションを起動して操作するという事です。
さすがに、試験に出るとは思えませんが、
正否を問う選択肢の中に、
・ExcelからOLEオートメーションでEXcelを操作できる
このような文章が出ないとも限りませんので念のため。


OLEオートメーションの使い方

OLEオートメーションを利用する方法として、大きく2つの方法があります。

・事前バインディング
・実行時バインディング(遅延バインディングという言い方もある)

この2通りがあります。

事前バインディング
特定のオブジェクト型として宣言された変数に代入される場合、事前に(コンパイル時に)バインディングされます。
事前バインディングされたオブジェクトでは、アプリケーションが実行される前に、コンパイラによってメモリの割り当てとその他の最適化が実行されます。
ただし、外部オブジェクトの場合は参照設定が必要になります。

参照設定の方法
VBEの画面で、「ツール」→「参照設定」
ここで必要なオブジェクトにチェックを付けます。

非常に多くのライブラリがあります。
正式な名称を知らずに、その場で探すことは困難です。
事前に正式なライブラリ名称を調べておく必要があります。


実行時バインディング

Object 型として宣言された変数に代入される場合は、実行時にバインディングされます。
この型のオブジェクトは、任意のオブジェクトへの参照を保持できますが、事前バインディングされたオブジェクトの利点をほとんど持ちません。

VBA記述の違い

以下のVBAサンプルは、FileSystemObjectを利用する場合です。
FileSystemObjectは、ドライブ・フォルダ・ファイルなどを操作できるWindowsに用意されているオブジェクトです。

実行時バインディング
Dim objFSO As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
事前バインディング
「ツール」→「参照設定」で
「Microsoft Scripting Runtime」にチェックを付ける。

Dim objFSO As New FileSystemObject
または、
Dim objFSO As FileSystemObject
Set objFSO = New FileSystemObject


単純な見分け方としては、変数宣言の型が、

Objectが遅延バインディング
特定のオブジェクト型が事前バインディング


ということになります。


事前バインディングの利点

事前バインディングによって、コンパイラは、アプリケーションをより効率的にする重要な最適化を実行できます。
使用されているオブジェクトの種類が明確になるため、コードがより読みやすくなり、保守も簡単になります。
その他の利点として、自動コード補完機能が有効になり、プロパティ・メソッドの一覧を見る事が出来ます。

Dim objFSO As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
If Not objFSO.FolderExist(strDir) Then
  MsgBox ("指定のフォルダは存在しません")
  Exit Sub
End If

上のコードには、スペルミスがあります。
探すのは困難ですね。

実行時バインディングの場合
実行時には、





実行時にバインディングしているので、実行してみないとエラーが分かりません。
事前バインディングの場合
実行時には、



もとより、事前バインディングの場合は、



このように入力候補がでるので、スペルミスはほとんどなくなります。


OLEオートメーションの注意点

OLEオートメーションを使う事で、Excel以外のアプリケーションを操作できることは、
VBAで実現可能な事が大幅に増えるという事です。

これはとても魅力的な事ですが、それに伴う難しさもあります。

Excelとは別のアプリケーションですので、
そもそも、そのアプリケーションがPCにインストールされていなければなりません。
当たり前のことですが、
OLEオートメーションでマクロを作成して動いているとしても、他のPCで動作するかどうかは別問題だという事です。
例えば、
OLEオートメーションでAccessを操作するマクロを作成したとして、
そのマクロを使うPCに、Accessがインストールされていなければ動作しないという事です。

また、
Excelとは別のアプリケーションなのですから、
そのアプリケーションの機能や、使えるプロパティ・メソッドは、アプリケーションごとに調べなければなりません。
そしてこれを調べる事は、Excelのプロパティ・メソッドを調べることに比べると時間を要するものになります。

さらに、
別のアプリケーションである以上、Excelとは全く別のタイミングでバージョンアップされてしまいます。
バージョンアップにより、今まで動いていたマクロが動かなくなることは、普通に起こり得ることです。


APIの概念

APIとは、アプリケーション プログラミング インターフェイス(Application Programming Interface)の略です。

一般的には、
ソフトウェアコンポーネントが互いにやりとりするのに使用するインタフェースの仕様になります。

APIは関数の集合体で、特定の機能を持つ1つまたは複数のDLLで構成されています。

DLLは、Dynamic Link Libraryの略で、
他のアプリケーションで使える機能や各機能にアクセスする関数が入っていて、VBA等から呼び出せるようにしてあるものです。

VBAで単にAPIと言う場合は、Windows APIを指す場合がほとんどです。

Windows APIは、
WindowsのOSにあらかじめ用意されている各種の機能を呼び出す手段として用意されているものです。


APIの使い方

APIを使用するには、Declareステートメントで宣言が必要です。

Declare ステートメント

ダイナミック リンク ライブラリ (DLL) の外部プロシージャへの参照を宣言します。

モジュール レベルで宣言します。

引数はAPIごとに違うため、使いたいAPIのサンプルや専門書を見るしかありません。

Excel 64Bit版の場合
PtrSafe キーワードが必要になります。

ネット等のサンプルのほとんどは32Bit版ですので、適宜PtrSafeキーワードを追加します。

また、
アドレス参照(ポインターおよびハンドルを格納する場合) の引数は、
32Bit版では、Long型ですが、
64Bit版では、LongPtr型 または Longlong型になります。

Excel2010以降では、32BitでもPtrSafe キーワードを入れることができます。
つまり、2010以降でしか使わないのであれば、
PtrSafe キーワードは必ず入れておけば良いことになります。


使用例.

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'64bit版のExcelの場合は、以下のようにPtrSafeを付けて下さい。
'Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub untilReady(objIE As Object)
  Dim starttime As Date
  starttime = Now()
  Do While objIE.Busy = True Or objIE.ReadyState <> READYSTATE_COMPLETE
    Sleep 100
    DoEvents
    If Now() > DateAdd("S", 10, starttime) Then
      Exit Do
    End If
  Loop
End Sub

Sleepはプログラムを任意の時間だけ待機させることができ ます。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
これで定義し、

Sleep 100
これで、100ミリ秒待機させています。


【業務改善の実務】

OLEオートメーションは、
同じMicrosoft Office製品であれば、ネットの情報も豊富ですし、書籍も多数あります。
Office製品以外をOLEオートメーションで操作する場合は細心の注意が必要です。
資料の入手だけでも結構苦労する場合が多く、開発に多大な時間を要します。

Windows APIは、EXcelVBAだけでは実現できないWindowsの機能を使いたい場合には必要不可欠なものです。
しかし利用する時には、よくよく検討してからにしましょう。
・その機能は、本当にVBAだけでは実現できないのか
・そもそも、そんな機能が本当に必要なのか
ちょっとした体裁の為にわざわざWindows APIを使う事は、時に自己満足でしかない場合もあります。

以上の事を分かった上で、正しく使うのであれば、
VBAで実現できる事が大幅に増え、今まで出来なかったことができるようになります。
実際に使うかどうかは、その時々で判断するとして、いつでも使えるように最低限の事は覚えておきましょう。


【本サイト内の関連ページ】





同じテーマ「MOS VBAエキスパート対策」の記事

プロシージャ
イベント
ステートメント(スタンダード)
関数
エラーへの対処
APIとOLEオートメーション
変数と配列
レジストリの操作
ファイルの操作
ユーザーフォームとメニューの操作
VBAスタンダード試験対策まとめ

新着記事 ・・・新着記事一覧を見る

VBAの省略可能な記述について|ExcelマクロVBA技術解説(8月11日)
複数条件判定を行う時のコツ|ExcelマクロVBA技術解説(7月11日)
For Next の使い方いろいろ|VBA技術解説(6月14日)
VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)
ファイルの操作|MOS VBAエキスパート対策(3月14日)
ユーザーフォームの各種イベント|Excelユーザーフォーム(3月13日)
レジストリの操作|MOS VBAエキスパート対策(3月12日)
変数と配列|MOS VBAエキスパート対策(3月12日)

アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.変数とデータ型(Dim)|ExcelマクロVBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.マクロって何?VBAって何?|ExcelマクロVBA入門
6.RangeとCellsの使い方|ExcelマクロVBA入門
7.とにかく書いて見よう(Sub,End Sub)|VBA入門
8.繰り返し処理(For Next)|ExcelマクロVBA入門
9.定数と型宣言文字(Const)|ExcelマクロVBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門



  • >
  • >
  • >
  • APIとOLEオートメーション

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。





    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。

    本文下部へ

    ↑ PAGE TOP