VBAエキスパート対策
APIとOLEオートメーション

Excel VBAエキスパート対策です
最終更新日:2019-08-26

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

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

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

MOS VBA エキスパート スタンダート編

MOS VBA エキスパート スタンダート編

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

MOS VBA エキスパート スタンダート編

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

MOS VBA エキスパート スタンダート編

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

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で実現できる事が大幅に増え、今まで出来なかったことができるようになります。
実際に使うかどうかは、その時々で判断するとして、いつでも使えるように最低限の事は覚えておきましょう。

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

第123回.APIについて(Win32API)
・Declare ステートメン ・APIの使用例 ・いろいろなAPIについて
全シートの画面キャプチャを取得する(keybd_event)
資料等の作成で、画面キャプチャすることがあると思います。そこで、全シートの画面キャプチャを、新規シートに全て取得するプログラムです。Alt+PrntScrnで、エクセルのウインドウのみキャプチャしています。

事前バインディングと遅延バインディング(実行時バインディング)
・バインディングとは ・事前バインディング ・遅延バインディング(実行時バインディング) ・実装(VBA記述)の違い ・事前バインディングの利点

Dictionary(ディクショナリー)連想配列の使い方について
・Dictionaryを使って重複を除く ・Dictionaryの使い方その2 ・Dictionaryの使い方その3 ・Dictionaryの使い方サンプル ・サイト内のDictionary関連記事
Dictionary(ディクショナリー)のパフォーマンスについて
・Dictionaryの検証に使うシート ・ユニーク化(重複削除)の方法について ・Dictionaryでユニーク化1 ・Dictionaryでユニーク化2 ・Dictionaryでユニーク化3 ・Dictionaryでユニーク化4 ・最初のVBAはなぜ遅かったのか ・Dictionaryを使わない方法 ・サイト内の関連ページ
VBAでのInternetExplorer自動操作
・VBEの参照設定 ・InternetExplorerの開始と終了 ・HTMLオブジェクトの操作 ・VBAでのInternetExplorer操作例 ・WEBクローリング&スクレイピングのサイト内参考ページ
VBAでのSQLの基礎(SQL:Structured Query Language)
・SQL文 ・SELECT文 ・SQLの学習について ・実践例
VBAで正規表現を利用する(RegExp)
・メタ文字 ・正規表現 ・正規表現RegExpの使い方 ・RegExpオブジェクト ・RegExpの使用例 ・RegExp関連のオブジェクト ・Execute(Matches,Match,SubMatches)の使用例 ・Replaceの使用例 ・先読み:肯定先読み、否定先読み ・正規表現の実践例
VBAでメール送信する(CDO:Microsoft Collaboration Data Objects)
・バインディング方法 ・CDOを使ったメール送信のサンプルVBA ・CDOのプロパティ ・CDOのメソッド ・CDO.Configuration.Fields.Item ・CDO.Fields.Item ・ConstantやEnumについて
VBAでのOutlook自動操作
・Outlookインスタンスの生成と、ログオン、全て送受信 ・フォルダーの取得 ・メールの一覧を取得 ・メールを送信 ・メールを返信 ・最後に
ADO(ActiveX Data Objects)の使い方の要点
・データベースの種類 ・SQL(SQL:Structured Query Language) ・ADOを使う準備 ・ADOでのDB接続方法 ・ADODB.Recordsetの取得方法 ・ADODBのレコードセットの扱い方 ・ADODBのトランザクション処理 ・ADODB.Commandの使い方 ・VBA100本ノックでの実践例 ・最後に注意点等

Excelの表をPowerPointへ図として貼り付け
・Excelの表をPowerPointへ図として貼り付けるVBA ・Excelの表をPowerPointへ図として貼り付けるVBAの解説 ・グラフをPowerPointへ貼り付け ・既にパワーポイントを開いている場合

VBAエキスパート公式テキスト

2019/5/30発売リニューアル版


2019/7/26発売リニューアル版

こちらは必須として購入した方が良いでしょう。
ちょっと高いなーとは思いますが、
書籍を購入することで、学習用データが提供されています。
・サンプルブック
・VBAエキスパート模擬問題
これらが使えるようになります。
このシリーズでは、テキストを読みながら学習していることを前提とします。

VBAエキスパート公式テキスト

2019/5/30発売リニューアル版


2019/7/26発売リニューアル版

こちらは必須として購入した方が良いでしょう。
ちょっと高いなーとは思いますが、
書籍を購入することで、学習用データが提供されています。
・サンプルブック
・VBAエキスパート模擬問題
これらが使えるようになります。
このシリーズでは、テキストを読みながら学習していることを前提とします。



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

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


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

抜けている数値を探せ|エクセル雑感(2022-07-01)
.Net FrameworkのSystem.Collectionsを利用|VBA技術解説(2022-06-29)
迷路ネコが影分身の術を体得したら…|エクセル雑感(2022-06-27)
迷路にネコが挑戦したら、どうなるかな…|エクセル雑感(2022-06-26)
サロゲートペアに対応した自作関数(Len,Left,Mid,Right)|エクセル雑感(2022-06-24)
「マクロの登録」で登録できないプロシージャーは?|エクセル雑感(2022-06-23)
オブジェクトのByRef、ByVal、Variant|エクセル雑感(2022-06-22)
コメントから特定形式の年月を取り出す|エクセル雑感(2022-06-19)
4,9を使わない連番作成|エクセル雑感(2022-06-17)
連番を折り返して出力|エクセル雑感(2022-06-16)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.マクロって何?VBAって何?|VBA入門
8.並べ替え(Sort)|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.エクセルVBAでのシート指定方法|VBA技術解説




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


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



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