VBA入門
APIについて(Win32API)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2022-02-22

第123回.APIについて(Win32API)


一般的にはAPIは、アプリケーションプログラミングインタフェースのことです。
ソフトウェアコンポーネントが互いにやりとりするのに使用するインタフェースの仕様です。


ここでは、Windows標準のWin32APIについて解説します。
APIを使用するには、
まず、Declareステートメントで宣言が必要となります。


Declare ステートメン

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

構文1
[ Public | Private ]Declare****Sub名前Lib"libname" [ Alias "aliasname"] [([ arglist ])]

構文2
[ Public | Private ]Declare****関数名前Lib"libname" [ Alias "aliasname"] [([ arglist ])] [ **** 型]

構文を見ても、結局何をどうしたら良いのか分からないと思います。
APIごとに引数の指定が違いますし、つまりは引数の指定方法が知りたいはずです。
使いたいAPIのサンプルを書籍やネットで探して、基本的にはそのまま使えば良いでしょう。

Excel 64Bit版の場合
PtrSafe キーワードが必要になります。
ネット等のサンプルは、その多くが32Bit版ですので、適宜PtrSafeキーワードを追加します。
また、
アドレス参照(ポインターおよびハンドルを格納する場合) の引数は、
32Bit版では、Long型ですが、
64Bit版では、LongPtr型 または Longlong型になります。

LongPtr型について
32 ビット環境と64 ビット環境で それぞれ以下に変換されます。
32ビットシステムでは、符号付き32ビット (4 バイト) の数値
64ビットシステムでは、符号付き64ビット (8 バイト) の数値

Longlong型について
Longlongは、64ビットでのみ有効な宣言型で、64ビット (8 バイト) の符号付き数値になります。
APIの中には、LongPtr型ではなくLonglong型を指定しなければならないものもあるようです。

Excel2010以降では、32BitでもPtrSafe キーワードを入れることができます。
つまり、2010以降でしか使わないのであれば、
PtrSafe キーワードは必ず入れておけば良いことになります。
条件付きコンパイル(32ビット64ビットの互換性)
条件付きコンパイルは、VBAの特定のコードブロックを選択してコンパイルします、VBAの他の部分は無視されます、条件付きコンパイルステートメントは、実行時ではなくコンパイル時に実行されます。条件に基づいてコンパイルするコードのブロックを指定するには #If...Then...#Elseディレクティブを使用します。


APIの使用例

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ミリ秒待機させています。


いろいろなAPIについて

マイクロソフトのmsdnで、
よく使われる一部の Windows API をリストし、日本語ドキュメントと英語ドキュメントへのリンクを案内しています。
Windows API リスト
良く使うと書かれていても、膨大な数になっています。
この中から目的の機能を持ったAPIを探すというのは厳しいとは思いますが、いつか役に立つこともあるかと思い掲載しておきます。

以下は、サイト内でAPI使用しているページです。

ConnectToConnectionPoint

イベントプロシージャーの共通化(Enter,Exit)|ユーザーフォーム入門
・イベントプロシージャーの共通化の問題点 ・問題解決した経緯 ・API:ConnectToConnectionPointについて ・ConnectToConnectionPointの使用例 ・イベントと対応するVB_UserMemIdの一覧とインポート用雛形 ・イベントプロシージャーの共通化の最後に

GdiplusStartup,GdiplusShutdown,
GdipLoadImageFromFile,GdipGetImageDimension

画像サイズ(横x縦)の取得について|VBA技術解説
・LoadPictur 関数 ・AddPictureしてから取得 ・APIを使用

SetTimer,KillTimer

VBAでのタイマー処理(SetTimer,OnTime)|VBA技術解説
・Application.OnTime メソッド ・WindowsAPI:SetTimer関数 ・最後に

OpenClipboard,EmptyClipboard,CloseClipboard,IsClipboardFormatAvailable,
GetClipboardData,SetClipboardData,GlobalAlloc,GlobalLock,GlobalUnlock,GlobalSize,lstrcpy

クリップボードに2次元配列を作成してシートに貼り付ける|VBA技術解説
・クリップボードのデータ取得/クリップボードへデータ送信 ・エクセルの行・列のデータ ・クリップボードに2次元配列を作成してシートに貼り付けるVBA ・クリップボードに2次元配列の最後に

RtlMoveMemory

VBAにおける変数のメモリアドレスについて|VBA技術解説
・メモリアドレスを取得する関数とメモリコピーのWindowsAPI ・メモリアドレスを確認するために使用したVBA ・文字列型Stringのメモリアドレス ・Integer, Long, Single, Double, Dateのメモリアドレス ・Variantのメモリアドレス ・配列のメモリアドレス ・オブジェクトのメモリアドレス ・ByRef,ByValのメモリアドレス

GetSystemMetrics

VBAでWEBカメラ操作する|VBA技術解説
・ActiveMovie Windowを起動する ・メインのユーザーフォーム ・WEBカメラを選択するユーザーフォーム ・上記ユーザーフォームの使い方 ・APIを使いキャプチャをとる ・VBAでWEBカメラ操作の最後に

GetDesktopWindow,GetDC,GetDeviceCaps,ReleaseDC

列幅・行高をDPI取得しピクセルで指定する|VBA技術解説
・列幅・行高をピクセルで指定するVBA ・列幅・行高をピクセルで指定するVBAの使い方と解説

keybd_event

全シートの画面キャプチャを取得する(keybd_event)|VBAサンプル集
資料等の作成で、画面キャプチャすることがあると思います。そこで、全シートの画面キャプチャを、新規シートに全て取得するプログラムです。Alt+PrntScrnで、エクセルのウインドウのみキャプチャしています。

Sleep,Beep

Beep音で音楽(Beep,Sleep)|VBAサンプル集
時々検索されるので、Beep音で音楽を演奏してみましょう。プログラムはほぼAPIをCALLするだけです。まずは、シートです。こんな感じです。ドレミの周波数は結構適当なので、詳しい方は自分で調整して下さい。

GetInputState

DoEvents関数|VBA関数
DoEvents関数は、発生したイベントがOSによって処理されるように、プログラムで占有していた制御をOSに渡します。DoEvents関数 構文 DoEvents 説明 開かれているフォームの数を返します。開かれているフォームが無ければ0返します。
他ブックへのリンクエラーを探し解除するマクロ|VBAサンプル集
リンクエラーが見つけられない… 「リンクの編集」で、「リンクの解除」を選択してもリンクが削除できない… こんな経験をした人は多いのではないでしょうか。エクセルをいろいろと操作していると、意図せずに参照先が別ブックになってしまい、かつ、その参照先のブックが無くなってしまっている… こんな場合に、リンクエラーとなります。

URLDownloadToFile

GoogleスプレッドシートをExcelにインポートする|VBAサンプル集
・スプレッドシートのURLを取得 ・ブラウザで直接ダウンロードする ・Power Queryで取り込む ・VBAでGoogleスプレッドシートをインポートする

SHCreateDirectoryEx,MakeSureDirectoryPathExists

多階層フォルダ(ディレクトリ)の作成|VBAサンプル集
・多階層フォルダ(ディレクトリ)の作成 の具体例 ・Dir関数とMkDirステートメントで多階層フォルダの作成 ・FileSystemObjectで多階層フォルダの作成 ・Win32 APIで多階層フォルダの作成

mciGetErrorString,mciGetErrorString

VBAで音楽再生するクラスを作成|VBAサンプル集
・APIの解説 ・VBAで音楽再生するクラスのVBAコード ・VBAで音楽再生するクラスの使用例 ・音楽プレーヤーを作成 ・VBAで音楽再生するクラスの最後に

GetCursorPos

エクセルVBAで15パズルを作ってみた
・Excel 15パズルの動作 ・Excel囲碁の全VBAコード ・Excel 15パズルのダウンロード




同じテーマ「マクロVBA入門」の記事

第120回.OnTimeメソッド
第121回.SendKeysメソッドとAppActivateステートメント
第122回.Shell関数
第123回.APIについて(Win32API)
第124回.Workbookのイベントプロシージャー
第125回.Worksheetのイベントプロシージャー
第130回.テーブル操作の概要(ListObject)
第131回.テーブル操作のVBAコード(ListObject,DataBodyRange)
第142回.テーブル全件処理とデータ最終行(ListObject,DataBodyRange)
第127回.他のブックのマクロを実行(Runメソッド)
第128回.マクロをショートカットで起動(OnKeyメソッド)


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

数字(1~50)を丸付き数字に変換するVBA|VBA技術解説(2022-11-15)
TEXTAFTER関数(テキストの指定文字列より後ろの部分を返す)|エクセル入門(2022-11-14)
TEXTBEFORE関数(テキストの指定文字列より前の部分を返す)|エクセル入門(2022-11-14)
TEXTSPLIT関数(列と行の区切り記号で文字列を分割)|エクセル入門(2022-11-12)
LAMBDA以降の新関数はVBAで使えるか|VBA技術解説(2022-11-11)
WRAPCOLS関数(1次元配列を指定数の列で折り返す)|エクセル入門(2022-11-08)
WRAPROWS関数(1次元配列を指定数の行で折り返す)|エクセル入門(2022-11-08)
EXPAND関数(配列を指定された行と列に拡張する)|エクセル入門(2022-11-07)
TAKE関数(配列の先頭/末尾から指定行/列数を取得)|エクセル入門(2022-11-06)
DROP関数(配列の先頭/末尾から指定行/列数を除外)|エクセル入門(2022-11-06)


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

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




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


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



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