エクセルQRコード作成マクロ|IMAGE関数・一括生成・文字化け対策

Web APIとVBAを活用して文字化けやエラーを防ぐエクセルQRコード自動作成のイメージ図

こんにちは、SkillStack Lab運営者のスタックです。

Excelに並んだURLや管理番号から、「QRコードをまとめて作りたい」「数百件を1つずつWebサイトで作るのは面倒」と感じていませんか。

結論から言うと、現在のExcelでQRコードを作る方法は、大きくIMAGE関数・VBA+Web API・Python in Excelの3つに分けて考えると分かりやすくなります。

最も手軽なのはIMAGE関数ですが、対応するExcel環境やインターネット接続が必要です。

生成したQRコードを画像としてExcelファイルへ埋め込みたい場合は、VBAでWeb APIから画像を取得して貼り付ける方法があります。

ただし、外部のQRコード生成APIを使う場合は、QRコード化するデータが外部サービスへ送信される点を忘れてはいけません。

この記事では、QRコードを大量作成する方法、日本語やURLを正しく渡すためのURLエンコード、読み取れない場合の確認ポイント、ActiveXを新規利用しない方がよい理由まで順番に解説します。

ExcelでQRコードを大量作成するときに発生する手作業、文字化け、互換性の課題

顧客情報や機密情報を外部QR APIへ無条件に送信しないでください。
公開URLや外部送信して問題のない管理番号なら利用しやすい一方、氏名、メールアドレス、会員情報、社内限定URLなどをQRコード化する場合は、利用するAPIの規約・プライバシーポリシーと勤務先のセキュリティルールを確認してください。

先に結論
  • 手軽に表示:IMAGE関数+QRコードAPI
  • 画像として埋め込み:VBA+QRコードAPI
  • Microsoft 365内でPython利用:Python in Excelも候補
  • 日本語・URL:文字列をURLエンコードしてAPIへ渡す
  • 個人情報・機密情報:外部APIへ送信してよいか先に確認する
  • ActiveX:新規構築では基本的に避ける
目次

ExcelでQRコードを作る3つの方法を比較

最初に、現在使いやすい方法を比較しておきましょう。

方法向いているケース主な注意点
IMAGE関数+Web APIQRコードをセル内へ一覧表示したい対応Excel・ネット接続・外部コンテンツ許可が必要
VBA+Web API大量生成して画像をブックへ埋め込みたいWindows環境・マクロ管理・API利用条件を確認する
Python in Excel対応Microsoft 365環境でPythonを利用したいクラウド実行で、ローカルPCやVBAへ直接アクセスできない
ActiveX既存ファイルの保守現在のOfficeでは既定無効化が進んでいる

単にQRコードを一覧表示したいだけなら、最初からVBAを書く必要はありません。

一方、QRコードを印刷帳票へ固定配置したい、別のPCへ渡しても表示できるよう画像をブックへ埋め込みたい、といった場合はVBAを検討します。

IMAGE関数でQRコードを作る最も簡単な方法

対応するExcelを利用しているなら、最初に試したいのがIMAGE関数です。

IMAGE関数はHTTPSで公開されている画像をセル内へ表示できます。

たとえばA2へQRコード化したいURLや文字列が入力されている場合、Windows版ExcelではENCODEURL関数と組み合わせて次のように作れます。

=IF(A2="","",IMAGE("https://api.qrserver.com/v1/create-qr-code/?size=200x200&qzone=4&ecc=M&data="&ENCODEURL(A2),"QRコード",0))

この式を下へコピーすれば、A列の内容に応じたQRコードをB列などへ一覧表示できます。

ExcelのIMAGE関数とQRコードAPIを組み合わせてQRコードをセル内へ表示する方法

IMAGE関数はMicrosoft 365やExcel 2024などの対応環境で利用できます。一方、上の数式で使用しているENCODEURL関数はExcel for the webやMac版Excelでは利用できません。

ENCODEURLを入れる理由

QRコード化する内容が単純な英数字だけなら、そのままでも動く場合があります。

しかし、日本語、空白、記号、URL内の「?」「&」「=」などが含まれると、APIのパラメータとQRコードへ格納したい内容の境界が正しく判定されない場合があります。

そのため、QRコードへ格納したい文字列全体をURLエンコードしてからAPIへ渡します。

Microsoft公式のENCODEURL関数を確認する

IMAGE関数で表示されない場合の確認点

  • IMAGE関数に対応したExcelを使用しているか
  • インターネットへ接続できるか
  • 組織のセキュリティ設定で外部画像がブロックされていないか
  • APIのURLがHTTPSになっているか
  • 参照先URLが認証を要求していないか
  • QRコード化する文字列をURLエンコードしているか

IMAGE関数は、認証が必要な画像URLやリダイレクトされるURLでは表示できない場合があります。

また、会社のMicrosoft 365では外部コンテンツへの接続自体が管理者によって制限されている場合があります。その場合は、利用者が独断でセキュリティ設定を変更せず、情シスへ確認してください。

VBAでQRコードを一括生成して画像を埋め込む

IMAGE関数は便利ですが、外部URLから画像を読み込んで表示する仕組みです。

QRコード画像そのものをExcelブックへ埋め込みたい場合は、VBAで画像を一度取得し、Shapes.AddPictureで貼り付ける方法があります。

ExcelからQRコードAPIへリクエストし、取得したQR画像をブックへ貼り付ける仕組み

次のVBAはWindows版のデスクトップExcelを前提としたサンプルです。元ファイルを複製し、公開して問題のないダミーデータでテストしてください。

A列からQRコードを作りB列へ貼り付けるコード

次の例では、「QR一覧」シートのA2以降にある文字列からQRコードを作り、同じ行のB列へ貼り付けます。

Option Explicit

Private Const QR_SHEET As String = "QR一覧"
Private Const FIRST_ROW As Long = 2
Private Const SOURCE_COLUMN As String = "A"
Private Const QR_COLUMN As String = "B"

Sub CreateQRCodes()

    Dim ws As Worksheet
    Dim lastRow As Long
    Dim r As Long
    Dim sourceText As String
    Dim apiUrl As String
    Dim tempFile As String
    Dim qrShape As Shape

    Set ws = ThisWorkbook.Worksheets(QR_SHEET)

    lastRow = ws.Cells(ws.Rows.Count, SOURCE_COLUMN).End(xlUp).Row

    If lastRow < FIRST_ROW Then
        MsgBox "QRコード化するデータがありません。", vbExclamation
        Exit Sub
    End If

    If MsgBox("A列のデータを外部QR APIへ送信してQRコードを作成します。" & vbCrLf & _
              "送信して問題のないデータであることを確認しましたか?", _
              vbYesNo + vbQuestion) <> vbYes Then
        Exit Sub
    End If

    Application.ScreenUpdating = False
    Application.StatusBar = "QRコードを作成しています..."

    On Error GoTo ErrorHandler

    For r = FIRST_ROW To lastRow

        sourceText = Trim$(CStr(ws.Cells(r, SOURCE_COLUMN).Value))

        If Len(sourceText) > 0 Then

            DeleteExistingQR ws, "QR_" & r

            apiUrl = _
                "https://api.qrserver.com/v1/create-qr-code/" & _
                "?size=300x300" & _
                "&qzone=4" & _
                "&ecc=M" & _
                "&data=" & UrlEncodeUtf8(sourceText)

            tempFile = Environ$("TEMP") & _
                       Application.PathSeparator & _
                       "excel_qr_" & r & ".png"

            DownloadFile apiUrl, tempFile

            Set qrShape = ws.Shapes.AddPicture( _
                Filename:=tempFile, _
                LinkToFile:=msoFalse, _
                SaveWithDocument:=msoTrue, _
                Left:=ws.Cells(r, QR_COLUMN).Left, _
                Top:=ws.Cells(r, QR_COLUMN).Top, _
                Width:=-1, _
                Height:=-1)

            With qrShape

                .Name = "QR_" & r
                .LockAspectRatio = msoTrue
                .Height = Application.Min( _
                    ws.Cells(r, QR_COLUMN).Height - 4, _
                    ws.Cells(r, QR_COLUMN).Width - 4)

                .Left = ws.Cells(r, QR_COLUMN).Left + _
                        (ws.Cells(r, QR_COLUMN).Width - .Width) / 2

                .Top = ws.Cells(r, QR_COLUMN).Top + _
                       (ws.Cells(r, QR_COLUMN).Height - .Height) / 2

                .Placement = xlMoveAndSize

            End With

            If Len(Dir(tempFile)) > 0 Then
                Kill tempFile
            End If

        End If

        Application.StatusBar = _
            "QRコード作成中: " & r - FIRST_ROW + 1 & _
            " / " & lastRow - FIRST_ROW + 1

        DoEvents

    Next r

SafeExit:

    Application.StatusBar = False
    Application.ScreenUpdating = True

    MsgBox "QRコードの作成が完了しました。", vbInformation
    Exit Sub

ErrorHandler:

    Application.StatusBar = False
    Application.ScreenUpdating = True

    MsgBox "QRコード作成中にエラーが発生しました。" & vbCrLf & _
           "行: " & r & vbCrLf & _
           Err.Description, vbExclamation

End Sub

Private Sub DownloadFile(ByVal fileUrl As String, _
                         ByVal savePath As String)

    Dim http As Object
    Dim stream As Object

    Set http = CreateObject("MSXML2.XMLHTTP.6.0")

    http.Open "GET", fileUrl, False
    http.Send

    If http.Status <> 200 Then
        Err.Raise vbObjectError + 1000, , _
            "QR APIから画像を取得できませんでした。HTTP " & http.Status
    End If

    Set stream = CreateObject("ADODB.Stream")

    With stream
        .Type = 1
        .Open
        .Write http.responseBody
        .SaveToFile savePath, 2
        .Close
    End With

End Sub

Private Function UrlEncodeUtf8(ByVal sourceText As String) As String

    Dim stream As Object
    Dim byteData() As Byte
    Dim i As Long
    Dim currentByte As Long
    Dim result As String

    Set stream = CreateObject("ADODB.Stream")

    With stream

        .Type = 2
        .Charset = "UTF-8"
        .Open
        .WriteText sourceText

        .Position = 0
        .Type = 1

        ' UTF-8 BOMの3バイトを読み飛ばす
        .Position = 3
        byteData = .Read

        .Close

    End With

    For i = LBound(byteData) To UBound(byteData)

        currentByte = byteData(i)

        Select Case currentByte

            Case 45, 46, 48 To 57, 65 To 90, _
                 95, 97 To 122, 126

                result = result & Chr$(currentByte)

            Case Else

                result = result & "%" & _
                         Right$("0" & Hex$(currentByte), 2)

        End Select

    Next i

    UrlEncodeUtf8 = result

End Function

Private Sub DeleteExistingQR(ByVal ws As Worksheet, _
                             ByVal shapeName As String)

    On Error Resume Next
    ws.Shapes(shapeName).Delete
    On Error GoTo 0

End Sub

自分のファイルに合わせて、コード冒頭の「QR一覧」「A列」「B列」を変更してください。

また、QRコードを大きく表示したい場合は、B列の列幅と対象行の行高を事前に広げておきます。

このコードのポイント
  • 日本語やURLをUTF-8でURLエンコードする
  • QRコード画像を一時ファイルとして取得する
  • SaveWithDocument:=msoTrueでブックへ埋め込む
  • 同じ行で再実行した場合は既存QRを削除する
  • APIエラー時は処理を停止して行番号を表示する

Excelへ画像を貼り付けるVBAそのものを詳しく知りたい場合は、写真を自動サイズ調整して貼り付けるExcelマクロで、Shapes.AddPictureや中央配置の仕組みを解説しています。

日本語QRコードが文字化けする原因

「英数字なら動くのに、日本語やURLを入れるとおかしくなる」という場合、まず確認したいのがAPIへ渡す文字列です。

日本語をQRコードAPIへ送る際にUTF-8とURLエンコードを行う流れ

Web APIのURLには、「&」や「=」などAPI側で意味を持つ記号があります。

QRコードへ保存したい文字列をそのままURLへ連結すると、その一部がAPIのパラメータとして解釈されたり、日本語や特殊文字が正しく渡らなかったりする場合があります。

重要なのは「VBAだからShift-JIS」という単純な問題ではなく、APIへ渡す文字列を適切な文字コードでURLエンコードすることです。

Windows版ExcelでIMAGE関数を使う場合はENCODEURL関数、VBAの場合は先ほどのようなUTF-8 URLエンコード関数を用意すると対応しやすくなります。

QRServerでは、入力文字列とQRコードへ格納する文字コードとしてUTF-8を指定できます。通常の日本語を扱う場合もUTF-8を基本にするとよいでしょう。

QRコードが読み取れないときの確認ポイント

QRコードが画面に表示されても、実際のスマートフォンや業務用スキャナーで読み取れるとは限りません。

特に印刷して利用する場合は、次の点を確認します。

  • QRコードを小さくしすぎていないか
  • 背景とQRコードのコントラストが十分か
  • 周囲に余白(クワイエットゾーン)があるか
  • 長すぎるURLや大量の文字を入れていないか
  • 印刷時に画像がぼやけたり変形していないか
  • 実際に使用するスマートフォン・スキャナーで読めるか

QRコードの周囲に余白を確保する

QRコードの周囲には、他の文字や罫線からQRコードを分離するための余白が必要です。

QRServerではqzoneパラメータで余白を指定できます。

この記事の例では次のように設定しています。

qzone=4

印刷帳票へQRコードを配置するときは、セルの罫線や周囲の文字がQRコードへ接近しすぎていないかも確認してください。

誤り訂正レベルは高ければよいわけではない

QRコードのL・M・Q・Hという誤り訂正レベルと復元能力の違い
レベル復元能力の目安考え方
L約7%情報量を抑えやすい
M約15%一般用途の候補
Q約25%汚れ・欠損をある程度想定
H約30%より高い復元性が必要な場合

誤り訂正レベルを上げるほど復元性は高くなりますが、その分だけQRコードへ必要な情報量も増え、同じデータでもコードが複雑になりやすくなります。

そのため、最初からすべてをHに固定するのではなく、用途に合わせて設定し、最終的には実物をスキャンして確認してください。

デンソーウェーブ公式でQRコードの誤り訂正機能を確認する

QRServerとQuickChartを使う場合の違い

外部APIを利用するなら、QRServerやQuickChartなどが候補になります。

サービス主な特徴注意点
QRServerURLがシンプルで、文字コード・ECC・余白などを指定できる利用条件・外部送信データを確認する
QuickChartQR生成、カスタマイズ、複数QRのバッチAPIなどがある利用条件・プラン・外部送信データを確認する

どちらを使う場合でも、日本語やURLなどの文字列は正しくURLエンコードします。

また、無料で利用できる状態が今後も永続することを前提に、会社の重要業務を設計しない方が安全です。

大量のQRコードを毎日継続して生成するような業務では、API事業者の利用規約、リクエスト数、障害時の代替手段まで確認してください。

顧客情報を外部QR APIへ送ってよいか確認する

業務利用で最も重要なのは、QRコードを「作れるか」だけではありません。

たとえばA列へ次のような情報が入っている場合は注意が必要です。

  • 顧客名や社員名
  • メールアドレスや電話番号
  • 会員番号と個人を結び付ける情報
  • 社内システムの認証付きURL
  • 未公開の商品情報
  • パスワードや秘密情報

外部APIを利用すると、QRコード化する文字列はAPI事業者のサーバーへ送信されます。

スタック

元情シスの視点では、「APIが無料だから使う」より先に「このデータを社外へ送ってよいか」を確認します。公開URLのQR化と、顧客・社員情報を含むQR化は、同じ方法で考えない方が安全です。

機密性の高いデータを扱う場合は、社内で承認されたサービス、ローカルで動くQR生成ツール、あるいは会社が管理するシステム側でQRコードを生成する方法を検討してください。

ActiveXでQRコードを作る方法を新規採用しない理由

ExcelでActiveXを利用する際に発生する互換性とセキュリティの課題

古いExcel記事では、「Microsoft Barcode Control」などのActiveXコントロールを利用してQRコードやバーコードを作る方法が紹介されていることがあります。

既存ファイルを保守するためにActiveXの知識が必要になることはありますが、これから新しくQRコード生成の仕組みを作るためにActiveXを第一候補にすることはおすすめしません。

現在のOfficeではActiveXのセキュリティ制限が強化されており、Microsoft 365やOffice LTSC 2024では既定で無効化される環境があります。

そのため、「作成者のPCでは動くが、別の社員のPCではActiveXがブロックされる」という運用になりやすくなっています。

会社PCでActiveXがブロックされているからといって、利用者が独断でOfficeのセキュリティ設定を下げないでください。既存のActiveX業務が必要な場合は、管理者へ確認したうえで移行方法を検討します。

既存VBAやActiveXを今後も使い続けるべきか迷う場合は、VBAを残す業務と別の方法へ移行する業務の判断基準も確認してください。

Python in ExcelでQRコードを作る選択肢

ExcelでQRコードを作る方法としてVBA・Web API・Python in Excelを比較するイメージ

対応するMicrosoft 365環境では、Python in ExcelもQRコード生成の候補になります。

MicrosoftがPython in Excelへ用意しているライブラリには、QRコード画像を生成するqrcodeも含まれています。

また、Python in Excelは値だけでなく画像をExcelへ返すことができます。

一方で、一般的なローカルPythonとは仕組みが異なります。

  • PythonコードはMicrosoft Cloud上で実行される
  • Pythonコード自体には外部ネットワークへのアクセスがない
  • ローカルPCのファイルへ自由にアクセスできない
  • ExcelのVBAやマクロへ直接アクセスできない
  • 対応するMicrosoft 365環境が必要

そのため、「Python in ExcelならVBAの完全な代替になる」と考えるのではなく、ExcelのセルデータをPythonで分析・加工・画像化する新しい選択肢の1つとして使い分けるのが適切です。

PythonをExcel以外のファイル処理やAPI連携にも広げたい場合は、UdemyでPythonを学ぶ初心者向け講座の比較も参考にしてください。

大量のQRコードを作るときの実務上の注意点

100件程度で問題なく動いた仕組みでも、数千件になると別の問題が出てきます。

  • APIの利用規約・リクエスト数を確認する
  • 途中で通信エラーになった行を記録する
  • 同じデータを二重生成しない仕組みにする
  • QRコード生成後に元データ件数とQR件数を照合する
  • ランダムに数件ではなく一定数を実機で読み取る
  • 印刷する場合は実際のプリンターで確認する
  • QRコード化した文字列そのものも保存しておく

外部APIが応答しない場合や仕様が変わった場合に業務が停止する可能性もあります。

停止すると顧客対応や出荷、入退場管理へ影響するような業務なら、「Excelファイルが動けばよい」という設計ではなく、障害時の代替方法まで決めておきましょう。

実務で使えるVBAコードの安全な考え方は、Excel便利マクロ8選と安全なテスト方法でも解説しています。

ExcelでQRコードを作る方法のよくある質問

VBAを使わずExcelでQRコードを作れますか?

対応するExcelなら、IMAGE関数とQRコード生成APIを組み合わせて表示できます。Windows版Excelでは、QRコード化する文字列をENCODEURL関数でURLエンコードしてからAPIへ渡す方法があります。

IMAGE関数はExcel 2021でも使えますか?

IMAGE関数はMicrosoft 365やExcel 2024などの対応環境で利用できます。Excel 2021を前提に「IMAGE関数が使える」とは考えず、自分のExcelで関数が利用できるか確認してください。

日本語を入れると文字化けするのはなぜですか?

APIへ渡す文字列が正しくURLエンコードされていないことが代表的な原因です。日本語や特殊文字を含む場合は、UTF-8を前提にURLエンコードしてからAPIへ渡してください。

QRコードの誤り訂正レベルはHにすべきですか?

必ずHにする必要はありません。Hは高い復元性を持ちますが、冗長データが増えるためQRコードも複雑になりやすくなります。用途に応じてL・M・Q・Hを選び、最終的には実物で読み取りテストしてください。

顧客名やメールアドレスも無料APIでQRコード化できますか?

技術的に生成できることと、業務上送信してよいことは別です。外部APIを使うとQRコード化する文字列を外部サービスへ送るため、個人情報や機密情報の場合は勤務先のルール、APIの利用規約・プライバシーポリシーを確認してください。

ActiveXでQRコードを作る方法はもう使えませんか?

既存環境で利用しているケースはありますが、現在のMicrosoft 365やOffice LTSC 2024ではActiveXの既定無効化が進んでいます。新しくQRコード生成の仕組みを作るなら、IMAGE関数、Web API、VBAによる画像埋め込みなどを先に比較することをおすすめします。

Python in Excelなら外部QR APIは不要ですか?

Python in ExcelにはQRコード生成用のqrcodeライブラリが用意されているため、対応環境では外部QR APIを使わずQR画像を生成する選択肢があります。ただし、Python in Excel自体はMicrosoft Cloud上で実行される機能であり、利用可能なMicrosoft 365環境や組織のポリシーを確認してください。

まとめ|QRコードは作り方よりデータと運用まで設計する

ExcelからQRコードを大量作成する方法は、目的によって使い分けます。

  • 手軽な一覧表示ならIMAGE関数を検討する
  • 画像をブックへ埋め込むならVBAも候補
  • 日本語やURLはURLエンコードしてAPIへ渡す
  • QRコードの周囲に十分な余白を確保する
  • 誤り訂正レベルは用途に合わせて選ぶ
  • 顧客・社員・機密情報を外部APIへ送ってよいか確認する
  • ActiveXは新規構築の第一候補にしない
  • 対応環境ならPython in Excelも比較する

「QRコードを作れた」で終わらず、誰が使っても読み取れるか、外部へ送ってよいデータか、APIが停止しても業務を続けられるかまで確認することが実務では重要です。

QRコード以外にもExcelで繰り返している作業があるなら、VBAだけに決めず、Power Query、Office Scripts、Power Automate、Pythonなども比較してみてください。

\ 業務に合うExcel自動化を選ぶ /

Excel・Microsoft 365・外部APIの仕様、利用条件、セキュリティ設定は変更される可能性があります。本記事は2026年8月15日時点の公開情報を確認して更新しています。会社で使用する場合は、自社の情報セキュリティルールと各サービスの最新規約を確認してください。

参考:Microsoft IMAGE関数Python in Excel対応ライブラリQRServer APIQuickChart QR API


次は、仕事で使えるスキルをもう一段積み上げる

SkillStack Labでは、Excel・生成AI・自動化・オンライン学習を、実務で使うことを前提に解説しています。今の課題に近いテーマから次の記事へ進んでみてください。

生成AIを仕事で使いたい

ChatGPTなどを「触ったことがある」から、実際の仕事で使えるレベルへ進みたい方へ。

生成AIの勉強方法・学習順序を見る →

Excel作業を自動化したい

関数だけでは限界を感じてきたら、Power Query・VBA・Pythonなども含めて自動化を考えます。

Excel業務を自動化する方法を見る →

体系的にスキルを学びたい

Excel・VBA・Python・生成AIなどを、動画講座で効率よく学びたい方へ。

社会人向けUdemy講座の選び方を見る →

何から始めるか迷ったら、今の仕事で最も時間がかかっている作業や、身につけたいスキルに近いテーマから選んでください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次