Excel VBA で写真を貼り付ける API には、Pictures.Insert・Shapes.AddPicture・Shapes.AddPicture2 の 3 つがあります。さらに AddPicture には LinkToFile と SaveWithDocument の 4 通り組み合わせ(うち 1 つは実行時エラー)があり、外部リンク・埋め込み・リンクと埋め込みのハイブリッドの 3 種類の保存実態に分岐します。本記事では、3 API の引数・戻り値・既定動作の違い、4 通り組み合わせの OOXML 実態と元ファイル削除・更新後の挙動、画像形式別のファイルサイズ実測、そして仕様だけでは判断しにくい AddPicture2 の Compress 引数まで、Excel 2024 build 19929 での実機検証つきで整理します。コピペで動く配布用 xlsm も用意しました。
サンプルファイル(xlsm)
7 シート入りの検証用ブックです。3 API + 4 通り組み合わせ + AddPicture2 の Compress 引数比較 + 自分の画像で試せるサンドボックスを収録しています。
- 3 API どれを使うか — 早見表
- Shapes.AddPicture の 4 通り組み合わせと保存実態
- Pictures.Insert と AddPicture(msoTrue, msoFalse) の違い
- AddPicture(False, True) と (True, True) — 配布向けの使い分け
- Shapes.AddPicture2 と Compress 引数の実機結果
- ファイルサイズと画像形式 — 入力画像種類別の保存結果
- よくあるつまずきと回避策(FAQ)
- Q1. Width:=-1, Height:=-1 で元のサイズになると思ったら、表示が小さい / 大きい
- Q2. 元ファイルを後で削除したら画像が見えなくなった
- Q3. マクロが急に動かなくなった / Pictures.Insert は廃止された?
- Q4. AddPicture2 で引数を省略するとエラーになる
- Q5. PNG を貼り付けたのに xlsx 内では JPEG になっている
- Q6. URL から画像を入れたい — IMAGE 関数
- Q7. 「セルに配置」UI を VBA から呼びたい
- Q8. PowerPoint・Word VBA の AddPicture と引数が違う?
- Q9. Mac 版 / Web 版でも動く?
- まとめ — 4 通り組み合わせと 3 種類の保存実態の選び方
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 で足ります。

| API / 引数 | Shape Type | OOXML 実態 | 元削除後 | 元更新時 | サイズ目安 | 推奨用途 |
|---|---|---|---|---|---|---|
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 と明記)。
FileName— 画像ファイルのパス(文字列)LinkToFile— 画像をファイルへのリンクとして扱うか(msoTrue/msoFalse)SaveWithDocument— ブックに画像のコピーを保存するか(msoTrue/msoFalse)Left/Top— 挿入位置(ポイント単位)Width/Height— 表示サイズ(ポイント単位、-1を渡すと元の寸法を保持)
Microsoft Learn には「LinkToFile が msoFalse のとき SaveWithDocument は msoTrue でなければならない」と明記されています。 この仕様により、4 通りある組み合わせのうち msoFalse × msoFalse だけがエラーになります。

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

同じ 1024×1024 px の不透明 PNG(7 KB)を 4 通りの引数組み合わせで挿入し、保存後の xlsx を ZIP 解凍して OOXML を確認した結果が次の表です。表中の Shape Type・xlsx サイズ・<a:blip> 属性・xl/media/ はすべて同一の実機検証ログに基づきます。
| 組み合わせ | Shape Type | xlsx サイズ | OOXML 実態 (<a:blip>) | xl/media/* |
|---|---|---|---|---|
(msoTrue, msoFalse) 外部リンクのみ | 11 (msoLinkedPicture) | 約 10 KB | r:link="rId1" | なし |
(msoTrue, msoTrue) ハイブリッド | 11 (msoLinkedPicture) | 約 17 KB | r:embed="rId1" r:link="rId2" | image1.png 7,271 B |
(msoFalse, msoTrue) 埋め込みのみ | 13 (msoPicture) | 約 17 KB | r: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 はエラー

Microsoft Learn の仕様どおり、AddPicture(filePath, msoFalse, msoFalse, ...) を実機 VBA で呼び出すと HRESULT -2146827284(0x800a07ec)「指定された値は境界を超えています。」で実行時エラーが発生します。 「画像を埋め込まずブックにも保存しない」つまり「どこにも残らない」組み合わせは禁止されています。 エラー番号自体は HRESULT 形式(負の整数)でわかりにくいので、On Error Resume Next + Err.Number で捕捉してログ化するか、4 通りのうち有効な 3 通りだけを呼ぶようマクロ側で守るのが現実的です。
Pictures.Insert と AddPicture(msoTrue, msoFalse) の違い
どちらも外部リンク参照(Shape Type=11 / msoLinkedPicture)で xlsx 内に画像本体を持たず、保存サイズも約 10 KB と近くなります。 ただし読者向けには「同じではない」2 つの違いがあります。
違い 1: Pictures.Insert はサイズ指定引数がない
Pictures.Insert は FileName と省略可能な 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) で Width と Height に -1 を渡すと、Microsoft Learn の注記どおり元寸が保持され、 1024 px × 72/96 = 768 pt × 768 pt に展開されます。
つまり、新規コードでサイズや位置を明示したいなら AddPicture を使うのが素直です。Pictures.Insert で挿入位置を制御したい場合は、戻り値の Picture オブジェクトに対して .Top / .Left / .Width / .Height を後から代入する 2 段階の書き方になり、AddPicture の 1 行呼び出しに比べて冗長になります。
違い 2: Pictures.Insert は picLocks noChangeAspect を自動付与

<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.Insert と AddPicture(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) ハイブリッド

AddPicture(msoTrue, msoTrue) は OOXML 上で外部リンク(r:link)と埋め込みコピー(r:embed)の両方を持つハイブリッド形式です。 「配布もしたいが、元画像が更新されたらブック側にも反映させたい」というニッチな要件にちょうど合います。Excel 2024 build 19929 での実機挙動は次の通りです(v4 再レビュー追加検証で SHA を比較確定)。
- 元画像を変更してから開き直し・保存すると、xlsx 内の埋め込み
image1.pngも新しい画像に更新される。今回の検証では赤画像(SHA458b...d6/ 1,104 B)から青画像(SHA4a08...08/ 1,071 B)への置き換えをUpdateLinks=0/UpdateLinks=3の両設定で確認できた。 - 元画像を削除した状態で開き直し・保存しても、埋め込みコピーは残るため表示は維持される(赤画像のまま)。
リンク更新のタイミングや「ファイルを開くときの警告」の出方は Excel の設定(信頼できる場所、リンクの自動更新など)と起動経路に左右されます。配布前に実ブックを開いて挙動を確認してください。UpdateLinks=0 でも更新されるという結果は、「リンク更新を無効にすれば配布後の追従を止められる」とは限らないことを意味します。
Shapes.AddPicture2 と Compress 引数の実機結果
Microsoft Learn の Shapes.AddPicture2 ページによれば、AddPicture2 は AddPicture に Compress 引数を追加した派生メソッドです。 MsoPictureCompress 列挙体は 3 値(msoPictureCompressDocDefault=-1・msoPictureCompressFalse=0・msoPictureCompressTrue=1)です。
今回の検証範囲では Compress 引数の効果が確認できなかった

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 ページでは Width・Height・compress を Optional 記載としています。 しかし Excel 2024 build 19929 の実機 VBA では 5 引数・7 引数呼び出しが「実行時エラー 450(引数の数が一致していません)」になり、8 引数を明示した場合だけ成功しました。 本記事のサンプルコードはすべて 8 引数で統一します。
本記事の Compress 検証条件
上記 12 ケースの実測は、次の環境・前提で取得しました。読者が再現する際に条件を揃えてください。
- Excel 2024 build 19929 / Windows 11 25H2
- Excel オプション「画像のサイズと品質」は 既定値(特定ファイルへのオーバーライドなし)
- 保存後の
xl/workbook.xmlにautoCompressPictures属性は出力されない - 入力画像: 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 になる」という記述を他サイトで見かけますが、これは入力画像の種類によって結論が変わります。本記事の実機検証では次の通りでした。

image1.* の拡張子はすべて同一の実機検証ログに基づきます。| 入力画像 | xlsx 内の保存ファイル名 | サイズ変化 | 備考 |
|---|---|---|---|
| 1024×1024 px 不透明 PNG (7 KB) | xl/media/image1.png | 7,271 B (ほぼ同じ) | JPEG 化されない |
| 512×512 px 透明 PNG (4 KB) | xl/media/image1.png | 4,132 B | 透過情報を保持 |
| 1024×1024 px 写真系ノイズ PNG (2 MB) | xl/media/image1.jpeg | 2,039 KB → 442 KB (約 22 %) | JPEG 化・圧縮あり |
| 4000×4000 px 写真系ノイズ PNG (28 MB) | xl/media/image1.jpeg | 28 MB → 1.7 MB (約 6.2 %) | JPEG 化・圧縮あり |
| 1024×1024 px JPG (80 KB) | xl/media/image1.jpg | 80,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.Insert と AddPicture(msoTrue, msoFalse) の違い」を参照。
Q4. AddPicture2 で引数を省略するとエラーになる
実機 VBA では 5 引数・7 引数呼び出しがエラー 450(引数の数が一致していません)になります。8 引数を明示すると成功します(本記事のサンプルコードはすべて 8 引数で統一)。 → 詳細は 「Shapes.AddPicture2 と Compress 引数の実機結果」を参照。
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.InsertPictureInCell・Shape.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.AddPicture や Word の Shapes.AddPicture・InlineShapes.AddPicture では引数構成が異なります。詳細な引数差は本記事では検証対象外なので、各 Microsoft Learn ページを参照してください。
Q9. Mac 版 / Web 版でも動く?
本記事は Windows Excel 2024 build 19929 のみ検証しました。Mac 版・Web 版での挙動は検証対象外です。VBA の AddPicture2 や Pictures.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 と AddPicture2 の Compress 3 値ボタンを 7 シートに分けて収録しています。読者の手元の画像で代表的な挙動を実機で再現できます。
参考リンク(Microsoft 公式ドキュメント)
- Shapes.AddPicture method (Excel) — Microsoft Learn — 7 引数の Required 記載、
SaveWithDocument条件、-1による元寸保持 - Shapes.AddPicture2 method (Excel) — Microsoft Learn —
Width/Height/compressの Optional 記載(実機 VBA では 8 引数明示が必要) - MsoPictureCompress enumeration (Office) — Microsoft Learn —
DocDefault=-1/False=0/True=1の 3 値 - Pictures.Insert(String, Object) Method — Microsoft Learn (.NET Interop) — VBA 公式リファレンスからは外れた旧 API
- IMAGE 関数 — Microsoft Support — Excel 2024 / Microsoft 365 / Web 版に適用、構文と制限
- Insert Picture in-cell in Excel — Microsoft Support — Applies To に Excel 2024 / Microsoft 365 / Excel 2021 / Excel 2019 / Microsoft365.com / Web 版
- Shapes.AddPicture method (PowerPoint) — Microsoft Learn — クロスアプリの引数差確認用
- Shapes.AddPicture method (Word) — Microsoft Learn — クロスアプリの引数差確認用
関連記事
- 【PowerPoint VBA】全スライドの指定位置にロゴ画像を一括配置するマクロ — PPT 版
AddPictureの引数違いと座標指定の罠 - 【Word VBA】文書内の画像を一括でサイズ変更するマクロ — Word VBA での画像サイズ操作
- Excel ワークシートの一部を画像(PNG・JPEG・SVG)として保存する 3 つの方法 — Excel から画像を書き出したい場合
- 【PowerPoint】ファイルサイズが大きすぎるときの画像圧縮と最適化手順 — 画像圧縮の一般論
- 【PowerPoint】PDF や PNG にエクスポートすると画質が落ちるときの設定と対処法 — エクスポート画質の制御
コメント