えくせるちゅんちゅん

ことりがエクセルをちゅんちゅんするブログ

APIって何?と聞かれた時に答える内容

いつでもどこでもえくせるちゅんちゅん!Excelがおやつのことりちゅんです。

先日 Excel-Fun.* コミュニティ Discordボイスチャットで雑談しているときに「APIって何?」と聞かれたのですが、自分の手元にAPIについて解説する優しい資料が無いことに気がついたので、質問されたことをベースに書いてみました。

APIとは

APIApplication Programming Interface)とは、あるアプリケーションの情報を、プログラミングによって外部から取得したり、変更したりするための接続点のことですが、実際にAPIを使う場面においては特定の関数を呼び出すという意味合いで使われることが多いです。

この説明だけだと、何がなんだかイメージしづらいと思いますので、身近なものから順に説明していきます。

※当ブログはExcel VBAの解説を主としています。今回は、VBAの文脈で最も使われることが多い Windows API を使う状況を例に紹介し、WEB APIとの関係性までを説明します。

GUI)アプリケーションを操作する状況とは?

まず、「アプリケーションを操作する」という状況について確認しましょう。人間であるユーザーの皆さんは、日常的にアプリケーションを使っていますよね。(もしロボットの読者の方がいたらすみません)

一概にアプリケーションと言っても、Excelとか、Chromeとか、メモ帳などがあります。フォルダを開く「エクスプローラー」だって、OSに組み込まれているだけで1つのアプリケーションであることには変わりません。また、Twitter(X)などのWebサービスも「WEBアプリ」なんて呼ばれたりします。

こういったアプリには画面があって、画面にはボタンやテキストボックスなどが並んでいます。人間は画面に表示された情報を見て、マウスやキーボードを操作して、情報の取得や変更を行います。

このように「画面に映っているものを、人間が、操作するための仕組み」なので GUI(グラフィカル・ユーザー・インターフェース) と呼ばれています。

GUIの対極にある概念として、CUICLIと呼ばれるコマンドラインアプリケーションもありますが、本題とはそれるため割愛します。

GUIAPIの違い

人がアプリをGUIを通して操作するのと同じように、外部のプログラム……例えば、自作したツールからアプリを操作するために必要となるのがAPI(アプリケーション・プログラミング・インターフェース)です。


GUIアプリを人間が操作するためには、色んなボタンやテキストボックスなどを画面に並べる必要があります。

例えば、ユーザーが画面上をクリックしたら、マウスポインタの座標にあったボタンが反応して、予約したプロシージャ(Sub)が実行され、DBやテキストボックス等のデータを活用して処理されます。


一方で、プログラムがアプリを操作する場合は、わざわざ画面にコントロールを表示する必要がありません。実行したいロジックの名前と、必要なパラメータと、どんな結果を返すのか。これだけ揃っていれば、プログラムから呼び出すのに必要な情報としては十分です。

アプリはプログラムによって出来ていますので、外部からプログラミングによって動かすための繋ぎ(インターフェース)が必要です。この接続点を呼びたすために、VBAや多くの言語では「プロシージャ(Sub、Functionなど。以下:関数)」という形で実装します。

つまり、プログラムからAPIを使うというのは、関数を呼び出すことに他なりません。身近な関数呼び出し:VBAの場合 Call API関数名v = API関数名(引数1,2) といった記述をすることが「APIを使う」という行為に相当します。

APIは関数?関数群?

ここまでの説明を読んで、「API」と聞いたときは「関数」と解釈したら良いと認識をされたかと思います。しかし、APIについて語る文脈によっては、関数ではなくライブラリ(関数機能の集まり)のことを指しているように感じることもあると思います。

これは、アプリが提供する機能が1つではないからで、普通は機能ごとに様々な関数が用意されています。例えばWindows OSそのものを操作する「Windows API」には、数万個の関数が内包されているとされています。これらをひっくるめて「WinAPIを使う」なんて表現されたりします。

逆に関数を自作したら、なんでもAPIと呼ぶようなことはありません。

あくまでアプリやプラットフォームの開発者が、利用するプログラムへ機能を提供するために用意した関数がAPIです。

VBAでも汎用的ツールを開発して、他のブックからApplication.Runで呼べるように関数を整備した場合は、APIを自作したと言っても過言ではないかもしれません)

APIはライブラリか?

関数群をAPIと呼ぶならば、その関数群を内包しているライブラリもAPIと呼んでいいのではないか?と思ったかもしれません。

ライブラリは内部でAPIを呼ぶことがあるため、文脈や対象によっては間違いではありませんが、一般的にはAPIとは呼ばれません。

Windows APIのDLL

例えば、VBAWindows APIを利用する場合、事前にモジュールの冒頭で以下のようにDeclare文を記述する必要があります。

Declare PtrSafe Function FindFirstFile _
    Lib "kernel32.dll" Alias "FindFirstFileW" _
    (ByVal lpFileName As LongPtr, _
    lpFindFileData As WIN32_FIND_DATA) As LongPtr

Declare文にある kernel32.dll のファイル形式「.dll 」の正式名が「ダイナミック・リンク・ライブラリ」なのですが、このようなDLLはライブラリでありながらOSが公開しているAPI関数の集合体なのでAPIと呼んでも違和感がありません。

使用例:Windows API の FindFirstFile関数 でファイルリストをイミディエイトウィンドウに出力する例(※AI生成コードから抜粋したものなので正確性は保証できません)

APIを使う大変さをイメージして頂ければ十分です。

Option Explicit

' ====== 型定義 ======
Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * 260      ' MAX_PATH
    cAlternate As String * 14      ' 8.3形式
End Type

' ====== 定数 ======
Private Const INVALID_HANDLE_VALUE As LongPtr = -1
Private Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10

' ====== API宣言(Unicode W版) ======
Public Declare PtrSafe Function FindFirstFile Lib "kernel32.dll" Alias "FindFirstFileW" ( _
    ByVal lpFileName As LongPtr, _
    ByRef lpFindFileData As WIN32_FIND_DATA) As LongPtr

Public Declare PtrSafe Function FindNextFile Lib "kernel32.dll" Alias "FindNextFileW" ( _
    ByVal hFindFile As LongPtr, _
    ByRef lpFindFileData As WIN32_FIND_DATA) As Long

Public Declare PtrSafe Function FindClose Lib "kernel32.dll" ( _
    ByVal hFindFile As LongPtr) As Long

' ====== ユーティリティ ======
Private Function ZTerm(ByVal s As String) As String
    ' 固定長文字列のヌル終端までを取り出す
    Dim p As Long
    p = InStr(1, s, vbNullChar)
    If p > 0 Then
        ZTerm = Left$(s, p - 1)
    Else
        ZTerm = s
    End If
End Function

Private Function IsDirectory(ByVal attrs As Long) As Boolean
    IsDirectory = ((attrs And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY)
End Function

Private Function IncludeTrailingBackslash(ByVal p As String) As String
    If Len(p) = 0 Then
        IncludeTrailingBackslash = ""
    ElseIf Right$(p, 1) = "\" Then
        IncludeTrailingBackslash = p
    Else
        IncludeTrailingBackslash = p & "\"
    End If
End Function

Public Sub DebugPrintFiles(ByVal pattern As String)
    ' 例: pattern = "C:\Temp\*.xlsx"
    Dim fd As WIN32_FIND_DATA
    Dim hFind As LongPtr
    Dim sPtr As LongPtr
    Dim found As Long
    Dim nameOnly As String
    Dim folderPath As String

    ' フォルダ部分(フルパス出力用)
    Dim i As Long
    i = InStrRev(pattern, "\")
    If i > 0 Then
        folderPath = Left$(pattern, i)
    Else
        folderPath = ""
    End If

    hFind = FindFirstFile(StrPtr(pattern), fd)
    If hFind = INVALID_HANDLE_VALUE Then
        Debug.Print "対象なし: " & pattern
        Exit Sub
    End If

    Do
        nameOnly = ZTerm(fd.cFileName)
        If Len(nameOnly) > 0 Then
            If Not IsDirectory(fd.dwFileAttributes) Then
                ' フルパスで出力(必要なら nameOnly のみでもOK)
                Debug.Print IncludeTrailingBackslash(folderPath) & nameOnly
            End If
        End If

        found = FindNextFile(hFind, fd)
        If found = 0 Then Exit Do
    Loop

    Call FindClose(hFind)
End Sub

' ====== 実行例 ======
Public Sub Example_Run()
    DebugPrintFiles "C:\Temp\*.xlsx"
End Sub

参照設定・ライブラリ

一方で、VBAでファイル探索やDictionaryの辞書データを作りたい時に「参照設定」を開いて「Microsoft Scripting Runtime」にチェックを入れて C:\Windows\System32\scrrun.dll を参照することもあります。

たまたまfsoの名称にはライブラリというが言葉が含まれていませんが、リストにある他の候補を見ると、多くに「Lib」や「Library」という文字が含まれているのが分かると思います。このように、参照設定に表示されるのはライブラリの一覧です。

これらのライブラリにも関数は含まれていますが、普通はこれを指してAPIを使ったとは言いません。

違い1:距離

両者のDLLの違いは、外部からアプリを操作するときの書き方が直接的か間接的かの違いになるかと思います。

例えば、前者(kernel32.dll)と後者(scrrun.dll) も、WindowsOSに最初から組み込まれていて、OSを操作するための関数の集合体ではありますが、前者はOSの機能へ直接アクセスするための関数の集まり(API)なのに対して、後者はAPIを便利な記述で実現できるように仲介する関数等の集まりになっています。

違い2:目的

APIとして提供される関数は、アプリ(又はアプリのデータ)を操作する機能を提供するのが目的で開発されています。(開発思想によりますが)対象機能を忠実に操作できるように機能と1:1になるくらい細かく用意しています。お陰で引数も戻り値も数値やポインタなど人間には優しくない記述が要求されがちです。

ライブラリの関数は、開発を楽にするのが目的で開発されます。API関数の難しい部分を覆い隠して、直感的な記述ができるように引数や戻り値を調整したり、複数のAPI関数を組み合わせて1行で書けるようにしたり、エラー処理を適度に吸収したり、関数名を利用頻度の高い直感的な名前にしたりと工夫がされています。

違い3:内包物

(これもライブラリによりますが、)ライブラリには関数だけではなくデータ型の定義も入っていて、プログラミングを助ける重要な役割を果たしています。

例えば、fsoではDictionary、Drive、Folder、File、TextStreamなどのクラスと、IOMode.ForReading、IOMode.ForWritingなどの列挙型などが含まれています。(クラスも列挙もデータ型です)

参考:fsoでファイルリストをイミディエイトウィンドウに出力する例

(約100行→5行)

Dim fl As File
For Each fl In fso.GetFolder(ssFolderPath).Files
    Debug.Print fl.Path
Next

これがライブラリの威力です。

ライブラリのおかげで、先ほどのAPIを使用したコードより大幅に短く書けるようになっています。ここまで短いとバグが入り込む心配もありません。

WEB API の話

ここまで Windows API を例に説明してきましたが、WEB API(例えば REST API など)だとしても考え方は同じです。

対象アプリがWEBサービスに変わっただけで、提供者が用意した外部のプログラムからの要求を受けて変更や結果を返すための接続点であることは変わりません。

  • 呼び出しがDeclare&Callの代わりにHTTPリクエストだったり
  • 引数がJSONという文字列だったり
  • 戻り値もJSON文字列で解析が必要だったり
  • dllの代わりにURLだったり
  • ユーザー認証やAPIキーが必要だったり
  • 呼び出し回数に制限があったり

VBAユーザーからすると使いたいときの難易度が高め・・・記述が難しくなりがちなだけで、引数と戻り値がある(無いときもある)ロジックを呼び出しているのは同じです。

そして、WEB APIも有志によってライブラリが整備されていると、直接APIを呼ぶより楽に使えることもあるかもしれません。

WEB APIのライブラリでは、ライブラリを使っているのにAPIキーの設定が求められたりAPI制限を受けたりとAPIという文言が出てきて、今自分が使っているのはAPIなのかライブラリなのかよく分からなくなるかもしれませんが、ライブラリを通してAPIを使っているという認識で大丈夫です。

参考:WEB APIを呼ぶコードのイメージ(AI生成のためバグが含まれている恐れがあります)

Option Explicit

Public Sub GetJson_WinHTTP()
    Dim http As WinHttp.WinHttpRequest
    Set http = New WinHttp.WinHttpRequest
    
    Dim url As String
    url = "https://api.example.com/v1/items?limit=10" ' ←適宜変更
    
    On Error GoTo ErrHandler
    
    ' タイムアウト(ミリ秒):解決/接続/送信/受信
    http.SetTimeouts 5000, 5000, 10000, 15000
    
    ' GET開始
    http.Open "GET", url, False
    
    ' 必要なヘッダー(JSON想定)
    http.SetRequestHeader "Accept", "application/json"
    ' Bearerトークンが必要なら
    ' http.SetRequestHeader "Authorization", "Bearer YOUR_ACCESS_TOKEN"
    
    ' 送信
    http.Send
    
    ' ステータスチェック
    If http.Status = 200 Then
        Dim body As String
        body = http.ResponseText
        Debug.Print "Response:", body
        
        ' --- JSONのパース例 ---
        ' VBA単体では標準JSONパーサが無いため、
        ' VBA-JSON (JsonConverter.bas) を使うのが一般的です。
        ' 例:
        ' Dim json As Object
        ' Set json = JsonConverter.ParseJson(body)
        ' Debug.Print json("items")(1)("name")
        
    Else
        Debug.Print "HTTP Error:", http.Status, http.StatusText
    End If
    
    Exit Sub
ErrHandler:
    Debug.Print "Error:", Err.Number, Err.Description
End Sub

APIを直接呼ぶか、ライブラリを使うか

ここまで聞いて、結局APIでいつ使うんだろう?使う必要あるんだろうか?勉強する必要あるんだろうか?と思ったかもしれません。

私の答えとしては、「必要になった時に勉強して使う」で十分です。

使いやすいライブラリが揃っている場合は、そちらを使うに越したことはありません。なぜならAPIを直接呼ぶ場合、様々な実行時エラーを予測してエラー処理を書かなければならず、正確に動くコードを書くスキルが必要ですし、書けたら書けたでコードが冗長になるからです。

しかし、どうしてもAPIが必要になる場面があります。ライブラリに目的に合致する関数が無かったり、そもそもライブラリを誰も作っていなかったりするためです。

例えば、VBAでファイルリストを作成するという場面においては、fsoは低速で、dirは文字化けして、PowerShell呼び出しは煩雑になるため、速度と万能性と安定性全てを満たすためにはWindowsAPIによる検索が最適解となります。

参考までに、以下が私の開発した高速ファイルリスト作成関数です。

www.excel-chunchun.com

APIはライブラリではない

今回はOS標準搭載のライブラリを例に上げましたが、ライブラリの中には有志開発のDLLもありますし、ユーザーがVBAのモジュールとして実装したものもライブラリと呼べます。API=ライブラリと呼ぶことは滅多にありません。

ただ、fsoにせよ自作ライブラリにせよ、内部的にはWindowsAPIを呼び出している事実には変わりはないため、例えば「このVBAはWindowsAPIで動いています」という言い方は、たとえライブラリを使っていたとしても必ずしも間違いとは言えないことになります。

まとめ

APIとは、アプリケーションの情報を外部のプログラムから取得したり、変更したりするための接続点のことである」という点を踏まえた上で、VBAユーザーの方がAPIとライブラリを使用するとき、以下のようにイメージしておけば、まず大丈夫だと思います。

  • APIを使う:
    • Declare ステートメント を定義してプロシージャを呼ぶ
    • HTTPリクエストWebサービスが提供するAPIを呼ぶ
  • ライブラリを使う:
    • 既存のライブラリを参照設定する
    • モジュールをプロジェクトに追加する

そして、APIを使う理由は「目的に適合したライブラリが無いから使う」という認識で、まず大丈夫です。

その目的とは、処理速度と、機能の網羅性と、動作の安定性などです。ライブラリを使おうとして問題が生じてAPIで書き直すという感じです。

この説明が会話中のAPIという言葉の理解の助けになれたなら幸いです。

※Declare、HTTPリクエストを使ったからと言って、全てがAPIとは限らないので注意。そんな場面は初心者のうちに出くわさないので無視して大丈夫なはず

宣伝

VBAAPIの64bit対応で困っているならこちら!

www.excel-chunchun.com


Win,Mac,Excel,Word,PowerPoint,CADなど、環境によってコンパイルされるコードを変化させたいならこちら!

www.excel-chunchun.com


Windows APIのSleep使えって言われたけど、何コイツ?と思っている人はこちら!

www.excel-chunchun.com


この記事は、先日 Excel-Fun.* コミュニティ Discordボイスチャットで雑談しているときに「APIって何?」と聞かれたのですが、自分の手元にAPIについて解説する優しい資料が無いことに気がついたので書いてみました。

チャットや通話で会話をしたり、質問したい人、Excel VBAの作品を紹介したい人などご参加お待ちしてます!

以上

プライバシーポリシー