Article

【Excel VBA】画像貼り付け3 APIと保存方式|AddPicture実機検証

この記事で分かること

Excel VBA の画像貼り付け 3 API と 4 通りの保存方式を、Excel 2024 の実機検証と配布 xlsm 付きで解説します。

Excel VBA で写真を貼り付ける API には、Pictures.InsertShapes.AddPictureShapes.AddPicture2 の 3 つがあります。さらに AddPicture には LinkToFileSaveWithDocument の 4 通り組み合わせ(うち 1 つは実行時エラー)があり、外部リンク・埋め込み・リンクと埋め込みのハイブリッドの 3 種類の保存実態に分岐します。本記事では、3 API の引数・戻り値・既定動作の違い、4 通り組み合わせの OOXML 実態と元ファイル削除・更新後の挙動、画像形式別のファイルサイズ実測、そして仕様だけでは判断しにくい AddPicture2Compress 引数まで、Excel 2024 build 19929 での実機検証つきで整理します。コピペで動く配布用 xlsm も用意しました。

サンプルファイル(xlsm)

7 シート入りの検証用ブックです。3 API + 4 通り組み合わせ + AddPicture2Compress 引数比較 + 自分の画像で試せるサンドボックスを収録しています。

xlsm 形式 ・ 約 24 KB ・ 7 シート ・ Excel 2024 build 19929 で動作確認。

excel-vba-picture-insert-methods-sample.xlsm

  1. 3 API どれを使うか — 早見表
  2. Shapes.AddPicture の 4 通り組み合わせと保存実態
    1. 引数の意味と Learn 仕様
    2. 4 通り組み合わせマトリクス
    3. msoFalse × msoFalse はエラー
  3. Pictures.Insert と AddPicture(msoTrue, msoFalse) の違い
    1. 違い 1: Pictures.Insert はサイズ指定引数がない
    2. 違い 2: Pictures.Insert は picLocks noChangeAspect を自動付与
    3. 結論: Pictures.Insert は新規コードの第一候補ではない
  4. AddPicture(False, True) と (True, True) — 配布向けの使い分け
    1. 配布向けの基本: AddPicture(msoFalse, msoTrue)
    2. 元更新も追従させたい場合: AddPicture(msoTrue, msoTrue) ハイブリッド
  5. Shapes.AddPicture2 と Compress 引数の実機結果
    1. 今回の検証範囲では Compress 引数の効果が確認できなかった
    2. 8 引数明示が必須(Learn と実機の乖離)
    3. 本記事の Compress 検証条件
  6. ファイルサイズと画像形式 — 入力画像種類別の保存結果
  7. よくあるつまずきと回避策(FAQ)
    1. Q1. Width:=-1, Height:=-1 で元のサイズになると思ったら、表示が小さい / 大きい
    2. Q2. 元ファイルを後で削除したら画像が見えなくなった
    3. Q3. マクロが急に動かなくなった / Pictures.Insert は廃止された?
    4. Q4. AddPicture2 で引数を省略するとエラーになる
    5. Q5. PNG を貼り付けたのに xlsx 内では JPEG になっている
    6. Q6. URL から画像を入れたい — IMAGE 関数
    7. Q7. 「セルに配置」UI を VBA から呼びたい
    8. Q8. PowerPoint・Word VBA の AddPicture と引数が違う?
    9. Q9. Mac 版 / Web 版でも動く?
  8. まとめ — 4 通り組み合わせと 3 種類の保存実態の選び方
    1. 参考リンク(Microsoft 公式ドキュメント)
    2. 関連記事

3 API どれを使うか — 早見表

1 行結論:配布したいなら AddPicture(LinkToFile:=msoFalse, SaveWithDocument:=msoTrue)。元ファイルと一緒に使うなら AddPicture(LinkToFile:=msoTrue, SaveWithDocument:=msoFalse)。元更新も反映したいが配布もしたいなら AddPicture(LinkToFile:=msoTrue, SaveWithDocument:=msoTrue)(リンクと埋め込みコピーの両方を持つハイブリッド)。Pictures.Insert は既存コード読解とリンク専用の簡易挿入用途、AddPicture2 は今回の Excel 2024 build 19929 の検証範囲では AddPicture との保存サイズ差を確認できなかったため通常用途は AddPicture で足ります。

Excel VBA 写真貼り付け 3 API 4 通り組み合わせの早見表
3 API・4 通り組み合わせの早見表。表中の Shape Type / OOXML / 元削除後 / 元更新時 / サイズ目安はすべて Excel 2024 build 19929 の実機検証ログに基づいています。
API / 引数Shape TypeOOXML 実態元削除後元更新時サイズ目安推奨用途
ws.Pictures.Insert(filePath)11 (msoLinkedPicture)外部リンクのみ + picLocks 自動付与表示不可開き直し時に表示更新(参照側のみ)約 10 KB既存コード読解 / 簡易リンク挿入
AddPicture(file, msoTrue, msoFalse, ...)11 (msoLinkedPicture)外部リンクのみ表示不可開き直し時に表示更新約 10 KB元ファイルと一緒に配る
AddPicture(file, msoFalse, msoTrue, ...)13 (msoPicture)埋め込みのみ埋め込みコピーで表示維持反映されない数十 KB〜数 MB配布向け (推奨)
AddPicture(file, msoTrue, msoTrue, ...)11 (msoLinkedPicture)外部リンク + 埋め込み (ハイブリッド)埋め込みコピーで表示維持開き直し・保存時に埋め込み media も更新数十 KB〜数 MB元更新を追従させたい配布
AddPicture(file, msoFalse, msoFalse, ...)実行時エラー com_error -2146827284「指定された値は境界を超えています」
AddPicture2(file, ..., compress) (8 引数明示)13 (= AddPicture(F, T) と同じ)埋め込みのみ埋め込みコピーで表示維持反映されないAddPicture と同じ今回の検証範囲では Compress 引数の保存サイズ差なし

以下、3 API の特徴と 4 通り組み合わせの実機挙動を h2-2〜h2-7 で順に見ていきます。

Shapes.AddPicture の 4 通り組み合わせと保存実態

Microsoft Learn の Shapes.AddPicture ページでは 7 引数すべてが必須と明記されています。 LinkToFile(リンクするか)×SaveWithDocument(ブックに保存するか)の 4 通り組み合わせのうち 3 通りが有効、1 通り msoFalse × msoFalse が実行時エラーになります。

引数の意味と Learn 仕様

Shapes.AddPicture の 7 引数は次の通りで、すべて省略不可です(Microsoft Learn の VBA リファレンスで Required と明記)。

  1. FileName — 画像ファイルのパス(文字列)
  2. LinkToFile — 画像をファイルへのリンクとして扱うか(msoTrue / msoFalse
  3. SaveWithDocument — ブックに画像のコピーを保存するか(msoTrue / msoFalse
  4. Left / Top — 挿入位置(ポイント単位)
  5. Width / Height — 表示サイズ(ポイント単位、-1 を渡すと元の寸法を保持)

Microsoft Learn にはLinkToFilemsoFalse のとき SaveWithDocumentmsoTrue でなければならない」と明記されています。 この仕様により、4 通りある組み合わせのうち msoFalse × msoFalse だけがエラーになります。

Pictures.Insert、AddPicture、AddPicture2 の VBA サンプルコードを VBE で並べた画面
本記事で扱う Pictures.Insert / AddPicture / AddPicture2 のサンプルコードを VBE に並べた画面 (Excel 2024 build 19929)。AddPicture2 は 5/7 引数だとエラー 450 になるため、8 引数すべて明示しています。

4 通り組み合わせマトリクス

LinkToFile × SaveWithDocument の 4 通り組み合わせマトリクス
1024×1024 px の不透明 PNG (7 KB) を題材にした 4 通り組み合わせの実機結果 (Excel 2024 build 19929)。

同じ 1024×1024 px の不透明 PNG(7 KB)を 4 通りの引数組み合わせで挿入し、保存後の xlsx を ZIP 解凍して OOXML を確認した結果が次の表です。表中の Shape Type・xlsx サイズ・<a:blip> 属性・xl/media/ はすべて同一の実機検証ログに基づきます。

組み合わせShape Typexlsx サイズOOXML 実態 (<a:blip>)xl/media/*
(msoTrue, msoFalse) 外部リンクのみ11 (msoLinkedPicture)約 10 KBr:link="rId1"なし
(msoTrue, msoTrue) ハイブリッド11 (msoLinkedPicture)約 17 KBr:embed="rId1" r:link="rId2"image1.png 7,271 B
(msoFalse, msoTrue) 埋め込みのみ13 (msoPicture)約 17 KBr:embed="rId1"image1.png 7,271 B
(msoFalse, msoFalse) 禁止実行時エラー

注目したいのは (msoTrue, msoTrue)ハイブリッド形式です。OOXML 上で r:embed(埋め込みコピー)と r:link(外部リンク)の両方を持ち、Shape Type は (msoTrue, msoFalse) と同じ 11 ですが、xlsx 内に image1.png のコピーも入ります。 これは「元ファイルの更新を後から反映させる余地を残しつつ、ブック内にもコピーを持たせたい」場合の唯一の選択肢になります(詳細は h2-4 で扱います)。

msoFalse × msoFalse はエラー

On Error で取得した実行時エラー -2146827284 を検証用 MsgBox で表示したダイアログ
On Error で取得した実行時エラー -2146827284 を検証用 MsgBox で表示 (Excel 2024 build 19929)。Excel 標準のエラーダイアログそのものではなく、本文用に同じ HRESULT 値・本文を再現したものです。

Microsoft Learn の仕様どおり、AddPicture(filePath, msoFalse, msoFalse, ...) を実機 VBA で呼び出すと HRESULT -21468272840x800a07ec)「指定された値は境界を超えています。」で実行時エラーが発生します。 「画像を埋め込まずブックにも保存しない」つまり「どこにも残らない」組み合わせは禁止されています。 エラー番号自体は HRESULT 形式(負の整数)でわかりにくいので、On Error Resume Next + Err.Number で捕捉してログ化するか、4 通りのうち有効な 3 通りだけを呼ぶようマクロ側で守るのが現実的です。

Pictures.InsertAddPicture(msoTrue, msoFalse) の違い

どちらも外部リンク参照(Shape Type=11 / msoLinkedPicture)で xlsx 内に画像本体を持たず、保存サイズも約 10 KB と近くなります。 ただし読者向けには「同じではない」2 つの違いがあります。

違い 1: Pictures.Insert はサイズ指定引数がない

Pictures.InsertFileName と省略可能な Converter の 2 引数のみで、Left / Top / Width / Height を指定する手段がありません(Microsoft Learn の .NET Interop ページを参照)。 そのため挿入後の表示サイズは Excel の既定値に左右されます。実機検証では、1024×1024 px の PNG を Pictures.Insert で挿入すると 612 pt × 612 pt(Excel 既定の縮小表示)になりました。 一方、Shapes.AddPicture(file, msoTrue, msoFalse, ..., -1, -1)WidthHeight-1 を渡すと、Microsoft Learn の注記どおり元寸が保持され、 1024 px × 72/96 = 768 pt × 768 pt に展開されます。

つまり、新規コードでサイズや位置を明示したいなら AddPicture を使うのが素直です。Pictures.Insert で挿入位置を制御したい場合は、戻り値の Picture オブジェクトに対して .Top / .Left / .Width / .Height を後から代入する 2 段階の書き方になり、AddPicture の 1 行呼び出しに比べて冗長になります。

違い 2: Pictures.InsertpicLocks noChangeAspect を自動付与

Pictures.Insert と AddPicture(True, False) の挿入直後サイズと OOXML 上の picLocks 差
同じ 1024×1024 px PNG を挿入した直後の表示サイズと、xlsx 内 OOXML (<a:picLocks> 要素) の差。図中の青いハンドルは Excel の選択ハンドルを模した装飾で、ドラッグ後の変形結果そのものではありません。

もう一つの差は xlsx 内部の OOXML にあります。Pictures.Insert で挿入した画像は <a:picLocks noChangeAspect="1"/> という アスペクト比固定の属性が自動で付きます。一方、AddPicture(msoTrue, msoFalse) で挿入した画像は <a:picLocks/> という属性なしの空タグになります。 表面上はどちらも Shape Type=11(msoLinkedPicture)で同じに見えますが、xlsx を ZIP で解凍した xl/drawings/drawing1.xml を見ると違いが明確です。

この noChangeAspect="1" 属性は、Excel UI 上のサイズ変更ハンドル操作で縦横比を維持するかどうかの制御にも関係します。実 UI 操作での挙動差は本記事の主軸とずれるため、上の図ではハンドル位置のみを示し、ドラッグ後の変形結果そのものまでは検証範囲に含めていません。

結論: Pictures.Insert は新規コードの第一候補ではない

このように Pictures.InsertAddPicture(msoTrue, msoFalse) は OOXML 構造が近く、xlsx サイズも約 10 KB で同程度ですが、挿入後のサイズ・picLocks の自動付与・引数による制御性の 3 点で挙動が異なります。Pictures.Insert は Excel 2024 build 19929 でも動作し、廃止されたわけではありません が、Microsoft Learn の VBA 公式リファレンスからは外れており、.NET Interop の Pictures インターフェイスは「Reserved for internal use」と表示されます。 サイズや保存方式を明示したい新規コードでは AddPicture の方が制御しやすく、Pictures.Insert は既存コードの読解や、サイズを気にしない簡易リンク挿入で使うのが妥当です。

AddPicture(False, True)(True, True) — 配布向けの使い分け

配布向けの基本: AddPicture(msoFalse, msoTrue)

「ブックを別の PC や別ユーザーに配布する」「元画像のフォルダごと渡せない」というケースで使うのが AddPicture(msoFalse, msoTrue) です。xlsx 内部に画像本体を埋め込み(Shape Type=13 / msoPicture)、元ファイルが削除・移動されても表示が維持されます。 本記事冒頭の配布用 xlsm に同梱したサンプル Sub UseAddPicture_EmbedOnly がこの方式の最小例です。

ファイルサイズは元画像によって決まり、1024×1024 px の不透明 PNG(7 KB)で約 17 KB、写真系の大きい PNG(2 MB)で約 442 KB になります。 大きい画像で Excel が自動 JPEG 化する挙動については h2-6 で扱います。

元更新も追従させたい場合: AddPicture(msoTrue, msoTrue) ハイブリッド

4 通り保存方式 × 元ファイル削除・変更前後の表示比較
4 通り保存方式の表示挙動 (Excel 2024 build 19929)。After 行の条件は列ごとに異なります: Pictures.Insert / AddPicture(T,F) / AddPicture(F,T) は元ファイル削除後、AddPicture(T,T) は元ファイル変更後 (赤→青) の状態です。

AddPicture(msoTrue, msoTrue) は OOXML 上で外部リンク(r:link)と埋め込みコピー(r:embed)の両方を持つハイブリッド形式です。 「配布もしたいが、元画像が更新されたらブック側にも反映させたい」というニッチな要件にちょうど合います。Excel 2024 build 19929 での実機挙動は次の通りです(v4 再レビュー追加検証で SHA を比較確定)。

  • 元画像を変更してから開き直し・保存すると、xlsx 内の埋め込み image1.png も新しい画像に更新される。今回の検証では赤画像(SHA 458b...d6 / 1,104 B)から青画像(SHA 4a08...08 / 1,071 B)への置き換えを UpdateLinks=0 / UpdateLinks=3 の両設定で確認できた。
  • 元画像を削除した状態で開き直し・保存しても、埋め込みコピーは残るため表示は維持される(赤画像のまま)。

リンク更新のタイミングや「ファイルを開くときの警告」の出方は Excel の設定(信頼できる場所、リンクの自動更新など)と起動経路に左右されます。配布前に実ブックを開いて挙動を確認してください。UpdateLinks=0 でも更新されるという結果は、「リンク更新を無効にすれば配布後の追従を止められる」とは限らないことを意味します。

Shapes.AddPicture2Compress 引数の実機結果

Microsoft Learn の Shapes.AddPicture2 ページによれば、AddPicture2AddPictureCompress 引数を追加した派生メソッドです。 MsoPictureCompress 列挙体は 3 値(msoPictureCompressDocDefault=-1msoPictureCompressFalse=0msoPictureCompressTrue=1)です。

今回の検証範囲では Compress 引数の効果が確認できなかった

Compress 引数 12 ケースで xlsx 内 media バイト数が完全同一になることを示す表

Excel 2024 build 19929 で xlsx・xlsm × PNG・JPG × Compress 3 値 = 12 ケースを実機検証したところ、すべての組み合わせで xl/media/image1.* のバイト数が完全に同一でした(PNG=7,271 B / JPG=80,507 B)。 よって、通常用途では AddPicture で足ります。

8 引数明示が必須(Learn と実機の乖離)

Microsoft Learn の AddPicture2 ページでは WidthHeightcompress を Optional 記載としています。 しかし Excel 2024 build 19929 の実機 VBA では 5 引数・7 引数呼び出しが「実行時エラー 450(引数の数が一致していません)」になり、8 引数を明示した場合だけ成功しました。 本記事のサンプルコードはすべて 8 引数で統一します。

本記事の Compress 検証条件

上記 12 ケースの実測は、次の環境・前提で取得しました。読者が再現する際に条件を揃えてください。

  • Excel 2024 build 19929 / Windows 11 25H2
  • Excel オプション「画像のサイズと品質」は 既定値(特定ファイルへのオーバーライドなし)
  • 保存後の xl/workbook.xmlautoCompressPictures 属性は出力されない
  • 入力画像: 1024×1024 px 不透明 PNG (7 KB) と 1024×1024 px JPG (約 80 KB) の 2 種類
  • 保存形式: xlsx (FileFormat=51) と xlsm (FileFormat=52) の 2 種類
  • 挿入時の Width / Height には固定値(300 pt)を指定(-1 ではない)

Excel オプションでブック単位の圧縮設定を有効にした場合や、別バージョン・別チャネルでは挙動が変わる余地があります。

ファイルサイズと画像形式 — 入力画像種類別の保存結果

「PNG を貼り付けたら xlsx 内では JPEG になる」という記述を他サイトで見かけますが、これは入力画像の種類によって結論が変わります。本記事の実機検証では次の通りでした。

代表 7 ファイルのサイズをエクスプローラー風の実測比較で並べた図
代表 7 ファイルのサイズをエクスプローラー風の実測比較で並べた図 (Excel 2024 build 19929)。表中の入力サイズ・保存後サイズ・image1.* の拡張子はすべて同一の実機検証ログに基づきます。
入力画像xlsx 内の保存ファイル名サイズ変化備考
1024×1024 px 不透明 PNG (7 KB)xl/media/image1.png7,271 B (ほぼ同じ)JPEG 化されない
512×512 px 透明 PNG (4 KB)xl/media/image1.png4,132 B透過情報を保持
1024×1024 px 写真系ノイズ PNG (2 MB)xl/media/image1.jpeg2,039 KB → 442 KB (約 22 %)JPEG 化・圧縮あり
4000×4000 px 写真系ノイズ PNG (28 MB)xl/media/image1.jpeg28 MB → 1.7 MB (約 6.2 %)JPEG 化・圧縮あり
1024×1024 px JPG (80 KB)xl/media/image1.jpg80,507 B (同じ)JPG のまま

小さい不透明 PNG・透明 PNG は image1.png のまま、写真のような大きい PNG では Excel が JPEG 化・圧縮することがあります。JPG は JPG のままです。透過情報を保持したいときは透明 PNG を使い、ファイルサイズ最適化が必要なときは事前に画像最適化ツールで縮小しておくと安全です。

よくあるつまずきと回避策(FAQ)

Q1. Width:=-1, Height:=-1 で元のサイズになると思ったら、表示が小さい / 大きい

Excel 内部は 96 DPI 換算です。Width(pt) = 元 px × 72 / 96 で計算されます。例:1024 px → 768 pt。

Q2. 元ファイルを後で削除したら画像が見えなくなった

外部リンクのみ(AddPicture(msoTrue, msoFalse) / Pictures.Insert)は元ファイル削除で表示不可になります。配布向けは AddPicture(msoFalse, msoTrue)。元更新も追従させたいならハイブリッド AddPicture(msoTrue, msoTrue) です。 → 詳細は AddPicture(False, True)(True, True) — 配布向けの使い分け」

Q3. マクロが急に動かなくなった / Pictures.Insert は廃止された?

廃止されていません。Excel 2024 build 19929 でも動作します。 → 新規コードで AddPicture を選ぶべき理由は Pictures.InsertAddPicture(msoTrue, msoFalse) の違い」を参照。

Q4. AddPicture2 で引数を省略するとエラーになる

実機 VBA では 5 引数・7 引数呼び出しがエラー 450(引数の数が一致していません)になります。8 引数を明示すると成功します(本記事のサンプルコードはすべて 8 引数で統一)。 → 詳細は Shapes.AddPicture2Compress 引数の実機結果」を参照。

Q5. PNG を貼り付けたのに xlsx 内では JPEG になっている

写真のような大きい PNG では Excel が JPEG 化・圧縮することがあります。小さい不透明 PNG・透明 PNG は image1.png のまま残ります。 → 入力画像種類別の結果は 「ファイルサイズと画像形式 — 入力画像種類別の保存結果」を参照。

Q6. URL から画像を入れたい — IMAGE 関数

Microsoft Support の IMAGE 関数ページによれば、Excel 2024・Microsoft 365・Web 版で利用可能です。 =IMAGE("URL", "代替テキスト") 形式でセルに画像が表示されます。 VBA の Range.Value プロパティから画像オブジェクトを直接取り出すことはできない点に注意してください。

Q7. 「セルに配置」UI を VBA から呼びたい

Excel 2024 の型ライブラリには Range.InsertPictureInCellShape.PlacePictureInCell などのメソッドが存在することを確認しました。 本記事の調査範囲では Microsoft Learn の Excel VBA リファレンスでこれらのメソッドの解説までは確認できなかったため、セル内画像 API の詳細検証は別記事で扱う方針です。本記事の予備検証では Range.InsertPictureInCell(URI) は失敗、Shape.PlacePictureInCell() は対象 Shape を Select してから呼ぶと成功(xl/richData/*image1.png が保存される)でした。 なお Microsoft Support「Insert Picture in-cell in Excel」の Applies To には Excel 2024・Microsoft 365・Web 版に加え Excel 2021・Excel 2019・Microsoft365.com も含まれます。

Q8. PowerPoint・Word VBA の AddPicture と引数が違う?

Excel の Shapes.AddPicture は 7 引数すべて Required ですが、PowerPoint の Slide.Shapes.AddPictureWord の Shapes.AddPictureInlineShapes.AddPicture では引数構成が異なります。詳細な引数差は本記事では検証対象外なので、各 Microsoft Learn ページを参照してください。

Q9. Mac 版 / Web 版でも動く?

本記事は Windows Excel 2024 build 19929 のみ検証しました。Mac 版・Web 版での挙動は検証対象外です。VBA の AddPicture2Pictures.Insert を Mac で使う場合は別途環境ごとに確認してください。

まとめ — 4 通り組み合わせと 3 種類の保存実態の選び方

  • 配布が主目的: AddPicture(msoFalse, msoTrue) 一択(埋め込みのみ)
  • 元ファイルと一緒に運用: AddPicture(msoTrue, msoFalse) または Pictures.Insert(後者は既存コード読解向き)(外部リンクのみ)
  • 元更新も追従させたい配布: AddPicture(msoTrue, msoTrue) ハイブリッド(外部リンク + 埋め込み)
  • AddPicture2: 今回の検証範囲では AddPicture と保存サイズ差なし、Excel 2024 build 19929 で Compress 引数の保存サイズ差は確認できず。実機 VBA では 8 引数明示が必須

記事冒頭の配布用 xlsm には、3 API すべてのサンプル Sub と AddPicture2Compress 3 値ボタンを 7 シートに分けて収録しています。読者の手元の画像で代表的な挙動を実機で再現できます。

参考リンク(Microsoft 公式ドキュメント)

関連記事

Next Read

このあと読む記事

今の内容に近い記事から、次の1本と補助記事を続けて見つけられるようにしています。

Keep Exploring

このテーマをさらに探す

同じテーマの入口記事と更新記事を、一覧の形でまとめています。

コメント