先日、XでフォローしているVBAerであるちゅんさんがこんな記事を書いていました。
APIはいろいろ種類がありますが、この記事は主にWindows APIを利用するVBA利用者を前提に書かれたものです。VBAでは「Windows API」を用いて、VBAが標準で提供する機能以外にWindows OSが提供する機能を利用できます。
このAPIという言葉は、ソフトウェア開発者であればイメージはつくのですが、そうでない方には非常にイメージしにくいものです。
そこで今回は、「VBAを少し触っている」「プログラミングを初めたばかり」「自分でプログラミングしないがちょっとだけITに関わっている人」くらいのITリテラシーの人に向けてこのAPIのイメージをもう少し噛み砕いて説明しようと思います。
一般人向けに説明する「API」の意味
まず、VBA利用者ではなく、一般人向けに厳密でないざっとした定義を書くと、APIとは
「あるシステムやアプリの機能や情報を他のシステムやアプリが利用したり参照できるようにすること」
です。
例えばタクシー配車アプリでも何でも良いですが、アプリにはよくGoogleマップが埋め込まれています。なぜGoogleのサービスでもない配車アプリが他社のサービスであるGoogleマップを使えるのか。
これはGoogleマップがその機能を他でも使えるように「API」というものを提供していて、それを別のアプリが利用しているからです。Googleが勝手に使っていいよ、としているわけです(もちろん、API使用料を払う、認証するなどもろもろのルールに則っている前提で)
APIの説明としては以上です。一般人にAPIとは何かを聞かれたらこのくらいで良いと思います。
ただ、今回は少しその先の話をします。
上にもあるように、「APIが提供されている」「APIを利用する」という表現が使われています。そこでプログラミングを少し経験した昔の私は疑問に思ったわけです。それって具体的に何をしているのか、と。
アプリを利用するといったとき、そこには当たり前ですが「アプリ」という実体があります。それはプログラミングのコードによってでき上がったものです。
ただ、「APIを利用する」といったとき、それはプログラミングにおいて具体的に何を指しているのか。
一般人はそんなことを気にしないかもしれません。しかし、まだ当時APIを触ったことのなかった昔の私みたいに、多少プログラミングをかじった人は少し気になる人がいるかもしれません。
以下、それを見ていきます。
APIとは「仕組みや仕様」を指す概念である
APIとは具体的に何なのかという答えに近づくために、上に書いたAPIの定義をもう少しだけ厳密に書いてみます。よく一般的に言われている辞書的な定義を私なりに噛み砕くと、APIとは
あるソフトウェア(プログラム)の機能やデータを、外部のプログラムから呼び出して利用するための『仕様や仕組み』
です。最後の部分『仕様や仕組み』これが大事です。
先に結論を言うと、APIとは実体として何かを指す言葉というよりも、そのルールや決め事を指す「概念」です。
しかし、この定義を読んだとしても、まだ多くの人はぼんやりしているはずです。言葉では何となくはわかってもプログラミングをしたことない人には明確にイメージできないと思います。
というのも、私も自分がAPIを利用してプログラミングを行うまでイメージができていなかったからです。
なので次から例え話を交えて説明します。
API連携を「実世界のもの」例えたらどうなるか
ここで例え話を出します。APIとはプログラムが別のプログラムを使うということではありますが、わかりやすいように実世界の物理的な連携に例えてみましょう。
ある公園サービスを運営しているAさんがいます。ここでは、広場、遊具、ベンチなどいろんなものがあります。(ちょっとリッチな公園でいろんな設備や機材もあるとします)
次にイベントサービスを運営しているBさんがいるとします。このBさんは、Aさんの公園という場所を使って「お祭り」を企画しました。
当然、この公園はAさんのものであり、Bさんのものではありません。この公園でお祭りイベントをやるには、Aさんに公園の物や設備を借りるなど、BさんはAさんと連携する必要があります。(このように、2社が連携するのは物理的なサービスでもアプリでも同じことですね)
例えば、Bさんはお祭りを運営するにあたって公園の管理物である「水道」を使いたい、「テーブル」を使いたい、とします。
さて、このときどうすれば事がうまく回るでしょうか。
とてもシンプルに考えればBさんはAさんと会話し、「テーブルはどんな種類があるの?」「水はどれだけ使っていいの?」「何時まで使えるの」とか打ち合わせした上で利用許可をもらい、お祭りを当日運営していきます。
ではここで、Bさんだけでなく、別のイベント事業者Cさん、行事で使う学校関係者Dさんも公園のサービスを利用したい場合どうでしょうか。Aさんはまたゼロから交渉したりするのは非常に面倒です。
ここでAさんはこう考えます。
もともとは自分の公園サービスのために用意しているインフラや設備、備品だけど、
・「第三者の事業者が使えるように」
・「ルールや値段など条件をあらかじめ決めておいて」
・「申請方法とか利用の仕方を決めておいて」
・「あとは勝手に利用してもらえるように」
しておけば、いちいちAさん、Bさん、Cさん…とか今後利用したい人と個別に交渉しなくて済むのではと。そこで、Aさんはこんな書類を用意しました。

公園設備利用申請書です。ここに必要なものを記入して特定の場所(公園管理事務所の受付)に提出してもらい、あと必要な物を受け取るなり使えるようにしておきます。
ただ、何時間、どれだけの量を使えるのか、どんな種類があるのかをあらかじめ利用者に分かるようにしなければいけません。そこでAさんは利用申請書のほかに、利用ガイドも用意しています。
以上です。これがAPIを例えたものなのですが、この例においてAPIは何を指しているかというと、この仕組み全体を指しています。
念のために書くと、申請書がAPIでもありませんし、利用ガイドがAPIなのではありません。APIとは、「仕様」などを含めてサービスを他の人に利用してもらい両者が連携するための仕組み全体を指す言葉なのです。
この「仕様」というのがポイントです。
例えば上記のように申請書をつくったとしますが、利用者Cさんが公園側で用意してないのに「ガスを借りたい」と書いても、利用できません。連携のためには「何をどんな条件で利用できるかというあらかじめの決め事」が必要です。
ここで、プログラムの話に戻ります。
例えば、あなたがもし何か新しいアプリを開発して、そこでGoogle Mapの機能を使いたいとします。
Google MapはAPIを提供する、つまりGoogle Mapの機能を別のプログラムから呼び出してもらうとき、「こういう情報を呼び出したいときは、こういう手順でプログラミングしてください。そういうふうにコードを書いてくれれば、こういう情報を教えてあげますよ」ということを「決め事」として用意しています。
それを沿ってプログラミングのコードをかけば、だれでもGoogle Mapや地図情報を自分のアプリの中に取り込めるわけです。あなたはわざわざゼロから地図機能をつくる必要はありません。
じゃあ「決め事」とは何かというと以下のコードを見てください。
--------------------------------------
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Google Maps サンプル</title>
<style>
#map {
width: 100%;
height: 500px;
}
</style>
</head>
<body>
<h1>Google Maps サンプル</h1>
<div id="map"></div>
<script>
function initMap() {
// マップの初期化
const map = new google.maps.Map(document.getElementById('map'), {
zoom: 15,
center: { lat: 35.6812, lng: 139.7671 },
mapTypeId: 'roadmap'
});
// マーカーを追加
const marker = new google.maps.Marker({
position: { lat: 35.6812, lng: 139.7671 },
map: map,
title: '東京駅',
animation: google.maps.Animation.DROP
});
}
</script>
<!-- APIキーを自分のものに置き換えてください -->
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=[APIキーが入る]&callback=initMap">
</script>
</body>
</html>
--------------------------------------
これは生成AIで出力したものを私が少しいじったものですが、HTML上にGoogle Mapで東京駅を中心に表示させるコードです。Google Map APIを使っています。Google Cloudでプロジェクトを作ってAPIキーを発行して、上記の[ここにAPIキーをいれる]にその値を入れてこのコードをコピペすればすぐに動きます。
ここでいう決め事とは、例えば
(こちらの部分:<script async defer src="https://maps.googleapis.com/maps/api/js?key=[ここにAPIキーをいれる]&callback=initMap">)
とか、
・マップを呼び出して描画する場合はnew google.maps.Map・・・・みたいに書くとか
・対象の地点は緯度と経度で書く(lat: 35.6812, lng: 139.7671)
とかそういうもろもろです。
例えば上に、”center:”という文字があり、これは描画する地図の中央がどこかを書く場所なのですが、”centre:”とか書いたらそれだけエラーになります。全部書き方が決まっているわけです。
APIと関数の関係
さて、ここからはもう少し突っ込んだ話です。
ちゅんさんのブログ記事には、
API(Application Programming Interface)とは、あるアプリケーションの情報を、プログラミングによって外部から取得したり、変更したりするための接続点のことですが、実際には特定の関数を指して使われることが多いです。
とあります。
これはあくまでVBA向けの文脈で語っているため、このように表現されています。
プログラミングの世界では、APIの仕組みを用いてなんらかの機能を利用する際は、「関数」を使うことが多く見られます。VBAがその例です。だから「API=関数」というイメージなのです。
しかし、厳密に言えば、APIは先述のように原義としては仕組みや仕様です。しかもAPIは必ずしも関数を用いません。詳しくは説明しませんが、必ずしも関数を用いないAPIの例としてWeb APIなどがあります。
Web APIの例に、zipcloudという郵便番号に関するAPIサービスがあります。これはURLでサーバーにアクセスしてほしい情報を得る(より厳密に言えばhttpリクエストによって情報をやり取りする)のですが、例えば、以下をブラウザのアドレスバーに入れてアクセスしてみてください。
https://zipcloud.ibsnet.co.jp/api/search?zipcode=1000001
結果には謎の形(JSONという形式です)でいろいろ書いてありますが、東京都千代田区という情報が返ってきていることがわかります。
APIは文字通り、ユーザーインターフェースでなくプログラミングインターフェースなので、このように人が手動でAPIを打つシーンはありえないのですが、「URLにアクセスして情報が取得できる」という意味がわかったと思います。
APIは、どう分類するかにもよりますが、整理するとこういう分け方が可能です。
API(呼び出し方法で分類)
├── HTTP経由で呼ぶ(Web API)
│ └── REST、SOAPなど
│
└── コード内で関数として呼ぶ
├── OSの API(Windows APIなど)←ちゅんさんが話しているのはここ
├── ハードウェアのAPI
APIとライブラリの関係
さらに、ちゅんさんの記事には、以下のようにAPIは関数なのかライブラリなのか。みたいな観点での解説がありました。
関数群をAPIと呼ぶならば、その関数群を内包しているライブラリもAPIと呼んでいいのではないか?と思ったかもしれません。
確かにVBAを利用する人にはそのようなイメージがわくかもしれません。これはちゅんさんが書いているように「同じと言えなくもないが、別物と捉える」が無難な回答です。
ライブラリは内部でAPIを呼ぶことがあるため、文脈や対象によっては間違いではありませんが、一般的にはAPIとは呼ばれません。
「別物と捉える」の根拠
別物と捉える理由は、扱ってみるといろいろと違うことがあるからです。どのように違うかは、これはちゅんさんの記事に書いてありますので読んでみてください。私はもう1つ別の観点から書きます。
使用しているライブラリがその裏側の処理で内部的にWindows APIを利用しているものは、API=ライブラリといえなくもないが、
「必ずしもすべてのVBAのライブラリがWindowsAPIを利用していないから」というのが、API=ライブラリとは言えない1つの回答です。
例えばVBAのライブラリには正規表現を利用できるライブラリがあるそうですが、あれは(調べたところ)特にWindows OSの機能を利用しているわけではなく、C++で書かれた文字列処理プログラムを呼び出しているだけです。
「同じと言えなくもないが」の根拠
これは先ほど言及した、「使用しているライブラリがその裏側の処理で内部的にWindows APIを利用している」からという理由に加えて、もう1つ別の理由があります。
例えば、上に挙げた正規表現を利用できるライブラリは、C++のプログラムをVBAで関数を呼び出し、実行結果がユーザーの操作しているVBAのプログラムに戻ってきているものです。
あれ、この話はどこかでみたような…
ここでもう一度APIの定義に振り返ってみてください。
あるソフトウェアの機能やデータを、外部のプログラムから呼び出して利用するための『仕様や仕組み』
あれ、VBAというプログラムがC++のプログラムを呼び出しているということは・・・
つまり、これも非常に広義に見ればAPIであると言えないでしょうか?
これはどう捉えるかの問題であり、賛否両論あると思います。(※ちなみに生成AIに聞くと、PythonやらJavaやらプログラミング言語が持っている標準ライブラリもAPIの一種と言えるとは言っています。
ただ、それでも別物と扱う理由は、APIが仕様や仕組みである、という原義はもちろんですが、「利便性」という理由もあるでしょう。
ちゅんさんの記事にもあるように、裏側の複雑な処理が隠蔽されているかいないかという点でライブラリの関数とWindowsAPIの関数はかなり違うので、「どっちも本質的には同じ」と広義で捉えるのでなく、「それは違うもの」ととらえて区別するほうがはるかに実用的です。
最後に
以上、APIとは何かというのを長々と書いてきましたが、なんとなくわかってもらえたでしょうか。
私はIT業界の編集者として長いだけで、自分自身がソフトウェア開発の仕事をしているわけではないので、もし間違っているところがあればぜひご指摘ください。

























