ブログに戻る

Excel でリアルタイム為替レートを取得する方法:Power Query、WEBSERVICE、通貨 API

V
Vlado Grigirov
August 18, 2026
Currency API Exchange Rates Excel Power Query Tutorial Finexly

Excel でリアルタイム為替レートを取得する方法を説明するチュートリアルは、どれも同じことを約束しながら、こっそり別のものを渡してきます。手順どおりに進めるとセルに数値が表示され、いかにもリアルタイムに見える。しかし、たいていはそうではありません。実際には 1 日 1 回公表される参照レートだったり、遅延クオートだったり、次の更新で黙って別の通貨を返してくるスクレイピング済みの HTML テーブルだったりします。

本ガイドでは、実際に機能する 4 つの方法 — Excel 組み込みの通貨データ型、WEBSERVICE 関数、Power Query、そして再利用可能な LAMBDA — を取り上げます。さらに重要な点として、あなたのバージョンの Excel でどれが動くのか、各方式のデータが実際どれほど新しいのか、そしてどこでエラーを出さずに誤った数値を返すのかを示します。

以下のすべての数式とクエリは、ドキュメント化された Finexly API のレスポンス形式に基づいて記述し、公開前に正しさを検証しています。

4 つの方法と、実際に使えるのはどれか

Excel の通貨機能は、バージョン依存の度合いが際立って高いのが特徴です。このテーマのチュートリアルの半分は、読者の環境には存在しない方法を勧めています。まずはここから確認してください。

方法動作環境実際の更新頻度API キーを安全に送信できるか適した用途
通貨データ型Microsoft 365(Windows + Mac)、Excel for the web。2016/2019/2021/2024 は非対応遅延あり、更新間隔の公表なし。手動またはファイルを開いたときの更新該当なし — API を使わないちょっとした確認、少数の通貨ペア
WEBSERVICEWindows デスクトップのみ:M365、2024、2021、2019、2016。Mac・web・モバイルは非対応API が返すとおり。ただし関数自体が揮発性❌ 不可。キーを URL に含めるしかない1〜2 セル、手早いプロトタイプ
Power QueryWindows 版 Excel 2016 以降。Mac 版 M365 には Power Query はあるが Web コネクタがないAPI が返すとおり、更新時に反映✅ 可能。M の Headers を使用レート表、一括変換、本番運用
LAMBDA ラッパーWindows 版 Excel 2021 以降/M365(WEBSERVICE の制約をそのまま継承)WEBSERVICE と同じ❌ 不可表計算ユーザー向けのすっきりした =FXRATE()
この表から、直接導かれる帰結が 2 つあります。

  1. Mac では、Power Query の Web コネクタが利用可能なソースの一覧に出てこず、WEBSERVICE はまったく動作しません。 Microsoft は明確にこう述べています。WEBSERVICE は「Excel for Mac の関数ギャラリーに表示されることがありますが、Windows オペレーティング システムの機能に依存しているため、Mac では結果を返しません」。Microsoft 365 を使う Mac ユーザーは、現実的には通貨データ型に限られます。
  2. 買い切り版の Excel 2019、2021、2024 を使っている場合、通貨データ型は利用できません — リンクされたデータ型は Microsoft 365 と Excel for the web 専用です。選択肢は WEBSERVICE か Power Query になります。

方法 1:Excel 組み込みの通貨データ型

コードを一切書かない選択肢であり、多くの記事が最初に紹介する方法です。

  1. ISO 4217 コードをスラッシュまたはコロンで区切って、通貨ペアを 1 列に入力します — USD/EURGBP:JPY。(どのコードを使えばよいか迷う場合は、ISO 4217 リファレンスにすべて掲載しています。)
  2. セルを選択し、データ → データ型 → 通貨を選びます。
  3. 各セルが小さな通貨アイコン付きのリンクされたレコードになります。アイコンをクリックするか、データの挿入ボタンを使い、価格を選ぶと隣のセルにレートが展開されます。
  4. データ → すべて更新で更新します。

Microsoft が実際に保証していること

チュートリアルが飛ばすのがこの部分です。Microsoft 自身のドキュメントは、通貨のページに注意書きを載せています。「通貨情報は『現状のまま』提供されるものであり、遅延する場合があります。したがって、このデータを取引の目的または助言のために使用しないでください。」 通貨ペアの更新間隔は公表されていません。基となる金融データは LSEG Data & Analytics(旧 Refinitiv)から提供され、Bing 経由で表示されています。

本格的なものを作るなら押さえておきたい制約が、さらに 3 つあります。

  • 利用可否はテナント単位で決まります。 Microsoft は「通貨ペアは Microsoft 365 アカウント(ワールドワイドのマルチテナント クライアント)でのみ利用できます」と明記しています。組織がソブリン クラウドや政府向けクラウドを使っている場合、通貨ボタンはグレーアウトし、どれだけトラブルシューティングしても変わりません。
  • サーバー側での更新は存在しません。 リンクされたデータ型が更新されるのは、ブックが Excel で開かれている間だけです。5 分間隔の自動更新オプションはありますが、現時点では Insider プログラム限定であり、Microsoft は「一部のリンクされたデータ型は手動でしか更新できません」と注記しています。
  • ペアの中身が見えません。 得られるのは数値だけです。タイムスタンプもソースもスプレッドも確認できません。請求やレポーティングには日付の付いた監査可能なレートが必要であり、それはまったく別の問題です。

この方法はレートをざっと確認する用途に使ってください。後で説明責任を負う対象の入力データには使わないことです。

方法 2:WEBSERVICE と通貨 API の組み合わせ

WEBSERVICE(url) は HTTP GET を実行し、レスポンス本文をテキストとして返します。引数はちょうど 1 つ、URL のみです。この一点が、この方法のあらゆる性質を規定しています。

API キーを URL に入れざるを得ない理由

WEBSERVICE にはヘッダー用の引数がないため、Authorization: Bearer … を送ることができません。WEBSERVICE から呼び出す API は、キーをクエリ パラメーターとして受け付ける必要があります。Finexly は両方に対応しています。

# Recommended everywhere else — but impossible from WEBSERVICE
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.finexly.com/v1/rate?from=USD&to=EUR"

# The query-parameter form, which is what WEBSERVICE needs
https://api.finexly.com/v1/rate?from=USD&to=EUR&api_key=YOUR_API_KEY

このトレードオフについては、自分に正直になってください。URL に含めたキーはサーバーのアクセス ログに記録され、HTTP リファラー ヘッダー経由で漏れる可能性があります。さらにキーはブック内に平文で保存されるため、ファイルをメールで送った相手にはキーが渡ります。表計算用には別枠の低クォータのキーを使い、本番キーを含む WEBSERVICE ブックは決して配布しないでください。

実際に動く数式

URL を A1 に、生のレスポンスを A2 に置きます。

A1:  ="https://api.finexly.com/v1/rate?from="&B1&"&to="&C1&"&api_key="&$D$1
A2:  =WEBSERVICE(A1)

A2 にはレスポンスのテキストがそのまま入ります。

{"pair":"USD_EUR","rate":0.9215}

次はこの数値を取り出します。競合するチュートリアルはほぼ例外なく位置指定で処理していますが — INDEX(TEXTSPLIT(...), 1, 6) — API にフィールドが追加された瞬間、あるいはエンドポイントを切り替えた瞬間に、無言で壊れます。位置ではなくキー名を起点にしてください。

=LET(
   raw,  A2,
   p,    FIND("""rate"":", raw) + 7,
   e,    MIN(IFERROR(FIND(",", raw, p), 9999), IFERROR(FIND("}", raw, p), 9999)),
   IFERROR(VALUE(MID(raw, p, e - p)), NA())
 )

この数式はリテラルの "rate": を探し、その 7 文字分を進み、カンマか閉じ波かっこのうち先に現れるほうまでを読み取ります。2 フィールドの /v1/rate レスポンスからも、4 フィールドの /v1/convert-amount レスポンスからも 0.9215 を返し、呼び出しが失敗した場合は誤った数値ではなく #N/A を返します。LET には Excel 2021 か Microsoft 365 が必要です。Excel 2016/2019 では、可読性を犠牲にして同じ FIND 呼び出しをインラインで書けます。

揮発性の落とし穴

WEBSERVICE は揮発性関数です。F9 を押したときだけでなく、ワークシートに変更が加わるたびにほぼ毎回再計算されます。1 行に 1 つの WEBSERVICE を置いた 40 行の変換表を作れば、キーを 1 回叩くだけで 40 件の HTTP リクエストが飛びます。

月 1,000 リクエストの無料プランなら、およそ 25 回のキー入力で打ち止めです。対策は 2 つ。WEBSERVICE を 1 セルだけにとどめ、他のすべてのセルからそのセルを参照する。あるいは、作業中は計算方法を手動に切り替える(数式 → 計算方法の設定 → 手動)。さらに良いのは、揮発性ではない Power Query を使うことです。

方法 3:Power Query — スケールする唯一の方法

Power Query は、ここで挙げた中で唯一、Authorization ヘッダーを送信でき、スケジュールに沿って更新でき、5 万行のテーブルを破綻なく扱える方法です。同時に、どのチュートリアルも GUI のクリック操作だけで説明するため、肝心の M コードがどこにも見当たらない方法でもあります。ここに掲載します。

データ → データの取得 → Power Query エディターの起動を開き、新しいソース → 空のクエリ、続いてホーム → 詳細エディターを選び、次を貼り付けます。

let
    ApiKey = "YOUR_API_KEY",
    Pairs  = "USD_EUR,USD_GBP,USD_JPY,USD_CHF",
    Source = Json.Document(
        Web.Contents(
            "https://api.finexly.com",
            [
                RelativePath = "v1/convert",
                Query        = [ q = Pairs ],
                Headers      = [ #"Authorization" = "Bearer " & ApiKey ]
            ]
        )
    ),
    ToTable  = Record.ToTable(Source),
    Expanded = Table.ExpandRecordColumn(ToTable, "Value", {"rate"}, {"rate"}),
    Split    = Table.SplitColumn(
                   Expanded, "Name",
                   Splitter.SplitTextByDelimiter("_", QuoteStyle.None),
                   {"Base", "Quote"}
               ),
    Typed    = Table.TransformColumnTypes(
                   Split,
                   {{"Base", type text}, {"Quote", type text}, {"rate", type number}}
               )
in
    Typed

FxRates という名前を付け、ワークシートに読み込みます。BaseQuoterate の 3 列からなるきれいなテーブルが得られます。

このクエリの中で実際に効いている要素が 3 つあり、そのすべてが GUI 解説には欠けています。

  • Headers がキーを URL の外に保ちます。 これが WEBSERVICE に対する Power Query 最大のセキュリティ上の利点です。
  • RelativePathQuery はベース URL からあえて切り離しています。 URL 全体を 1 つの文字列として連結すると、Power Query はそれを動的データ ソースと分類し、Power BI サービスでの無人更新ができなくなります。パスとクエリを分けて渡すことで、ソースは静的なまま更新可能に保たれます。
  • 1 リクエストで複数ペア。 /v1/convert は要求したすべてのペアを 1 回の呼び出しで返します。営業日 22 日、1 日 8 時間のあいだ 1 時間ごとに更新するブックなら、この方式で月 176 リクエストです。同じスケジュールで /v1/rate を 30 回個別に呼べば5,280 リクエスト — まったく同じデータのために、無料の月間枠の 5 倍を使うことになります。

再利用可能なレート関数

単一ペアをオンデマンドで取得したい場合は、M 関数にまとめます。

let
    FxRate = (baseCode as text, quoteCode as text) as number =>
        let
            ApiKey = "YOUR_API_KEY",
            Source = Json.Document(
                Web.Contents(
                    "https://api.finexly.com",
                    [
                        RelativePath = "v1/rate",
                        Query        = [ from = baseCode, to = quoteCode ],
                        Headers      = [ #"Authorization" = "Bearer " & ApiKey ]
                    ]
                )
            )
        in
            Source[rate]
in
    FxRate

他のクエリからは FxRate("USD", "EUR") として呼び出せます。

50,000 行を 50,000 回の検索なしで変換する

大きなテーブルに XLOOKUP をドラッグして埋めるのは遅く、壊れやすい方法です。しかも更新時にクエリの出力サイズが変わると、F:F のような列全体参照は静かにずれていきます。代わりに Power Query の内部で結合してください。

  1. トランザクションのテーブルを Power Query に読み込みます。
  2. ホーム → クエリのマージで、Currency 列を FxRates[Quote] に対応付けます。
  3. マージした列を展開し、rate を残します。
  4. 列の追加 → カスタム列で変換式を追加します。

これでテーブル全体に対する結合が 1 回、更新ごとに 1 度だけ評価され、ブックのどこにも揮発性の数式が残りません。

方法 4:再利用可能な =FXRATE() LAMBDA

ブックを使うのがクエリの作者ではなく表計算のユーザーであれば、ここまでの内容をすべて 1 つの関数の裏に隠してしまいましょう。数式 → 名前の管理 → 新規作成を開き、名前を FXRATE として、参照範囲に次を設定します。

=LAMBDA(from_code, to_code, key,
   LET(
     url,  "https://api.finexly.com/v1/rate?from=" & from_code &
           "&to=" & to_code & "&api_key=" & key,
     raw,  WEBSERVICE(url),
     p,    FIND("""rate"":", raw) + 7,
     e,    MIN(IFERROR(FIND(",", raw, p), 9999), IFERROR(FIND("}", raw, p), 9999)),
     IFERROR(VALUE(MID(raw, p, e - p)), NA())
   )
 )

これで誰でも =FXRATE("USD","EUR",$D$1) と書けば 0.9215 が得られます。キーは D1 に一度だけ格納してそのセルを保護すれば、ブックの他の部分がキーに触れることはありません。ただし、この方法は WEBSERVICE の制約をすべて引き継ぐ点に注意してください — Windows 限定、揮発性、キーは URL の中。つまり使いやすさの改善であって、セキュリティやスケーラビリティの改善ではありません。

Excel の通貨換算が静かに狂う 5 つのパターン

これらはエラー メッセージではなく、正しさそのものの不具合です。赤くなるものは何もありません。数値が、あなたの思っているものと違うだけです。

1. 割るべきところで掛けてしまう

これは公開されている Excel 通貨チュートリアルで最も多い誤りであり、被害の大きさを正確に把握しておく価値があります。0.9215 という USD_EUR レートは、USD を EUR に換算するものです。逆方向 — EUR から USD — に進むには割り算を使います。

  • 正しい:100 / 0.9215 = 108.52 USD
  • 誤り:100 × 0.9215 = 92.15 USD

結果はレートの 2 乗ぶんだけずれます。0.9215² = 0.8492 — つまり15.1% の過小評価であり、レポート上ではまったくもっともらしく見えてしまいます。列見出しに方向を書き込んでおけば(Rate ではなく USD→EUR rate)、この誤りは起こしにくくなります。

2. JSON を位置で解析する

INDEX(TEXTSPLIT(response, ":", "}"), 1, 6) は、API にフィールドが 1 つ追加されるまでは問題なく動きます。追加された途端、インデックス 6 はエラーも出さずに別の値を返します。上の LET 数式のようにキー名を起点にするか、正しく解析してくれる Power Query の Json.Document を使ってください。

3. 何でも小数点以下 2 桁に丸める

Excel の既定は小数点以下 2 桁ですが、ISO 4217 はそうではありません。JPY、KRW、VND の補助単位は 0 桁です — ¥250.75 は有効な金額ではありません。BHD、KWD、OMR、TND は 3 桁です。JPY の合計を 2 桁に丸め、下流でさらに丸め直す。これが照合結果が数単位ずれる典型的な経路です。ルールの全体像は、通貨の丸めと小数桁数のガイドで解説しています。

4. ミッドマーケット レートを実際に請求されるレートだと思い込む

この記事に登場するレートは — そして無料 API が返すレートはすべて — ミッドマーケット レート、つまりビッドとアスクの中間値です。銀行、カード ネットワーク、決済事業者が提示するレートではありません。実際のスプレッドはおおむね 0.5% から数パーセントに及びます。商品の価格設定や顧客への見積もりを行うなら、ミッドマーケット レートを決済レートとみなすのではなく、明示的なマークアップ列を追加してください。為替レート API のデータはどこから来るのかの解説記事で、これらのフィードが何を表し、何を表さないのかを扱っています。

5. ライブなブックに先月の数値を書き換えさせる

これは深刻でありながら、ほとんど語られない問題です。レートのセルがライブ更新される設定なら、誰かがファイルを開くたびに、ブック内のすべての過去行が当日のレートで再評価されます。3 月の売上が 4 月に変わってしまう。照合が二度と一致することはありません。

取引がいったん発生したら、そのレートはライブな値ではなく、その日付に関する事実です。固定してください。一度だけ換算し、使用したレートと日付を添えて結果を値として貼り付け、ライブ クエリは新規行専用にとどめます。これは多通貨請求経費管理のシステムがデータベース レベルで強制しているのと同じ規律です。

補足:クロスレート

API がすべてのレートを単一の基準通貨に対して返す場合、EUR→GBP の換算は一方のレートをもう一方で割ることになります。

EUR→GBP  =  USD_GBP / USD_EUR  =  0.7892 / 0.9215  =  0.856430
1,000 EUR  =  856.43 GBP

丸めるのは最後の 1 ステップだけにしてください。途中のクロスレートを小数点以下 4 桁に丸めてから掛けると、大きなテーブル全体で積み上がっていく誤差が生じます。詳細はクロス為替レートのガイドで解説しています。

自動更新、レート制限、無料プランの範囲に収めるコツ

Power Query のレート表を自動で更新させるには、クエリと接続 → プロパティでクエリを右クリックし、ファイルを開くときにデータを更新するN 分ごとに更新するのいずれか、または両方にチェックを入れます。

誰も警告してくれない点が 2 つあります。

  • 開いたときの更新は、Excel の外部データに関するセキュリティ確認を発生させます。 ユーザーには黄色いバーが表示され、有効化をクリックするまで「自動」更新は何も行いません。フォルダーをトラスト センター → 信頼できる場所に追加すれば回避できます。
  • 1 日 1 回公表されるレートを 15 分ごとに更新するのは純粋な無駄です。 更新間隔は、ソースが実際に変わる頻度に合わせましょう。請求やレポーティングの大半の用途では、開いたときに 1 回で十分です。

消費量は Finexly が返すレスポンス ヘッダー — X-RateLimit-LimitX-RateLimit-UsedX-RateLimit-Units — で監視してください。無料プランではクレジット カードなしで月 1,000 リクエストが利用でき、開いたときに更新するブックには余裕があり、揮発性の WEBSERVICE グリッドには厳しい水準です。上限に常時近づいているなら、解決策はほぼ確実に、有料プランへの移行ではなく /v1/convert へのバッチ化です。キャッシュとエラー処理のガイドでは、Excel の外でも通用する同じ原則を扱っています。

トラブルシューティング

症状原因対処
WEBSERVICE#VALUE! を返す未対応のプロトコル、2,048 文字を超える URL、またはセルの 32,767 文字上限を超えるレスポンスhttps を使う、クエリを短くする、1 回の呼び出しで要求するペアを減らす
Mac で WEBSERVICE が何も返さないWindows デスクトップ以外は非対応通貨データ型を使うか、ブックを Windows に移す
通貨ボタンがグレーアウトしているMicrosoft 365 ではない、またはマルチテナントでないアカウントライセンスを確認する。買い切り版 Excel にリンクされたデータ型はない
#BUSY! または #CONNECT!リンクされたデータ型がまだ解決中、または接続がない待ってからデータ → すべて更新
Power Query:更新時に「動的データ ソース」と表示されるURL 全体を 1 つの文字列として連結している上記のとおり RelativePathQuery に分割する
更新後に #N/Aレスポンスに通貨コードがない、または検索範囲がずれたIFNA で包み、F:F ではなく構造化テーブル参照を使う
401 UNAUTHORIZEDキーがない、形式が不正、またはクエリ パラメーターが必要な場面でヘッダーとして送っているその方法が対応している認証方式を確認する

よくある質問

Excel でリアルタイムの為替レートは取得できますか。 厳密な意味でのリアルタイムは無理です。通貨データ型は遅延があり更新間隔は非公表とドキュメントに明記されており、無料 API の多くは営業日ごとに 1 回公表します。取得できるのは現在値 — ライブなソースからオンデマンドで更新されるレートであり、それこそ通貨 API が提供するものです。真にティック単位の FX が必要なら、表計算ソフトではなくストリーミング フィードが必要です。

API キーなしで Excel に為替レートを取り込むには。 通貨データ型にキーは不要ですが、Microsoft 365 が必須で、タイムスタンプも監査証跡も得られません。あとで照合が必要になるものについては、キーを使う API のほうが良い答えです — そして無料の通貨 API プランなら費用はかかりません。

なぜ Excel for Mac では WEBSERVICE が動かないのですか。 Microsoft のドキュメントは、WEBSERVICE が Windows オペレーティング システムの機能に依存しているため、関数ギャラリーに表示されていても Mac では結果を返さないと述べています。FILTERXML についても同様です。Mac ユーザーは可能なら Power Query を、それが難しければ通貨データ型を使うべきです。

特定の日付の過去の為替レートを Excel で取得するには。 過去レートのソースから日付ごとに 1 行のレート表を作り、XLOOKUP の一致モード -1 で参照します。こうすれば週末や祝日は直近の営業日にフォールバックします。過去の取引を当日のレートで再評価してはいけません。

Power Query で取引テーブル全体を一度に換算できますか。 できますし、そうすべきです。取引のクエリとレートのクエリを通貨コードでマージし、レート列を展開して、換算後の金額を求めるカスタム列を追加します。1 回の結合が数万個の揮発性数式を置き換え、1 回のパスで更新されます。

結局どの方法を選ぶべきですか。 1 ペアをたまに確認するだけなら通貨データ型。Windows でのプロトタイプなら WEBSERVICE。他の人が依存するものなら、迷わず Power Query です。


現在のレートを、きちんとした形で表計算に取り込む準備はできましたか。無料の Finexly API キーを取得 — クレジット カードは不要です。170 以上の通貨に対して月 1,000 リクエスト、WEBSERVICE を成立させる api_key クエリ パラメーター、そして Power Query 向けのヘッダー認証が利用できます。エンドポイントの全リファレンスは API ドキュメントを、まだ比較検討の段階であれば通貨 API の比較をご覧ください。

Vlado Grigirov

Senior Currency Markets Analyst & Financial Strategist

Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...

View full profile →

この記事を共有する