VBAと日々のこぼれ話

  1. VBA

【VBA】WindowsAPIの宣言について

前回、好きな画像で動きのあるボタンを作る際に使ったSleep関数はWindows APIを利用しています。

さらっとそう説明しましたが、そもそもWindows APIってなんでしょうか?
字面からWindowsに関連した何らかのことだとは薄っすらと分かると思います。

個人的に、APIが何かがはっきりと分からないからぼんやりとしたイメージしかつかめずに何かよくわからないものになっているのではないのかと思います。

要はAPIとは何者なのか

APIは、Application Programming Interfaceの略です。

OSやアプリケーションソフトが、他のアプリケーションソフトに対し、機能の一部を利用できるよう提供するインターフェイスのことです。

とあるアプリケーションの機能の一部を別のアプリケーションで使えるようにするルール

と言い換えたほうがいいでしょうか。APIには、その対象によって色々種類がありますが、初めから色々と手を出すと訳が分からなくなるためひとまずWindows APIに絞って考えてみます。

Windows APIのお話

Windows APIとは、Windowsの機能の一部を別アプリで使うためのルールのこと

ルールを使ってとある処理を実行する方法はDLLファイルに含まれています。
この「とある処理を実行する方法」が、先に出ているSleep関数のような関数を指しています。

VBAからDLL内の関数の利用するための方法

参照:Office VBA と Windows API

参照記事(MicroSoftコラム)によると、Windows APIを利用する方法として挙げられているのは

DLL のタイプ ライブラリへの参照を設定する方法。
モジュール内で Declare ステートメントを使用する方法。

え、DLLへ参照設定できるの!?

そちらの方が簡単じゃない?と思ったそこのあなた。

私もそう思ってたよ。

ですが、残念ながらこの話には続きがあって「Windows API を形成する DLL はタイプ ライブラリを提供しない」そうです。つまり、参照設定しても関数の呼び出しはできません。

VBAで「kernel32.dll」を参照設定しようとしてもエラーになります。
ちょっと疑り深く、試してみました。

「kernel32.dll」を選択して、開くボタンを押す

はい、見事に参照設定に失敗します。

あくまでDLLの呼び出しは二種類あるよという意味です。
VBAでは必ず「Declare ステートメントを使用する方法」を採用しなくてはいけません。

Windows APIの利用宣言

Sleep関数を例に挙げます。

無理やり私たちが使用する日本語に訳すと

kernel32.dll内のSleep関数の使用を宣言をするからね。
勿論、VB7環境で安全に実行できるの。
それでね。
このプロジェクト内では、戻り値不要なSubプロシージャーとするわ。
言わなくても分かっていると思うけど、レベルはPublicよ。
そうそう。
忘れないようにちゃんと言っておくと、引数は値渡しだからね。
名前はdwMillisecondsのLong型に決めたから、どうぞよろしく。

です。

VBA側がこんなにフランクにコードを受け取ってくれているのかは分かりませんが、意味は大体こんな感じです。口調が迷走していますし、何がどのステートメントやキーワードに当たるのか分かりにくいので、整理してみます。

Declareステートメント

DLL関数を利用するよという定義宣言

PtrSafeキーワード

Declare ステートメントをVBA 7 開発環境(※)で安全に実行できることを示す
※Office2010以降の開発環境(32ビット or 64 ビット)

Subステートメント

使用する関数をSubプロシージャとして定義
SubでなくてもFunctionプロシージャとして定義することも可
利用範囲(アクセスレベル)は、省略すると規定値「Public」が適用される

Lib キーワード

利用するDLLの指定(使いたいDLL関数がどのDLLに含まれているかを指定)
DLL名は、拡張子なしで文字列として設定
使用したいDLL関数によって、Libキーワード以下に設定する文字列(DLLファイル名)は異なる

kernel32.dllは「メモリ管理やリソース処理などの低レベルのオペレーティング システム関数」ファイル

引数

DLL関数の多くの引数は値渡し。
VBAでの引数は既定では参照渡し(ByRef)(※)なので、DLL関数が値渡しの引数を必要とするときは明示的にByValキーワードを書く必要がある
※「ByVal」「ByRef」を省略して記載すると、規定値である値渡し「ByRef」と認識する

おまけ:関数名を変えたいとき

ちなみにWindows APIでの関数名から任意で名前を変えることも可能
その際はAliasキーワードを使用

こうすると、同プロジェクト内であればSleep関数を利用する際は

SleepingBeauty XX(ミリ秒)で使うことになります。

なお、こちらのネーミングセンスのお問い合わせは受け付けません(笑)

【スポンサーリンク】



よく使われるWindows APIリスト

極論、使いたいものだけ知っておけばいいのですが、Windows API(の関数)は、どんなものがあるの?と聞かれると答えに窮します。そんな時には、このリストがお役に立つのではないかなと。

よく使われるWindows APIをMicroSoftがまとめたリストです。
嬉しいことに日本語解説。

Windows APIリスト

リストの説明にもあるように一部の良く使われるものリストだそうです。ですので、ここに記載されていないWindows APIももちろん存在します。
ちなみに、Sleep関数については、プロセス/スレッドに分類されています。

VBAの最近記事

  1. Excelシートの最終行を取得したい その1

  2. 【VBA】未だに苦手としていること

  3. 【VBA】モジュール先頭に記述する4種類のOption キーワード ステートメント

  4. 【VBA】同じ階層体系のフォルダを量産したい

  5. VBAの腕を知るための3つの短い質問を考える

関連記事

【スポンサーリンク】




PAGE TOP