VBA技術解説
画像「セルに配置」のVBAについて(365の新機能)

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2023-11-13 最終更新日:2023-11-14

画像「セルに配置」のVBAについて(365の新機能)


Excel365の新機能として、画像をセルに配置することが出来るようになりました。
従来の画像の挿入は、シートに対して画像を挿入するもので、表示位置がセルに重なっているだけでした。
今回の「セルに配置」は、画像をセルの中にデータとして入れることが出来るようになったものです。


先にIMAGE関数がリリースされていましたが、IMAGE関数は関数を通してセルに画像を入れるものです。
これに対して今回の「セルに配置」は手動でセルに画像を入れることが出来るようになったものです。

「セルに配置」でセルの中に入れた画像は、「セルの上に配置」でセルから取り出することが出来ます。
当然セルから取り出した画像は再度「セルに配置」でセルの中に入れることが出来ます。

IMAGE関数

構文

=IMAGE(ソース, [代替テキスト], [サイズ], [高さ], [幅])

引数

ソース 必須。
"https" プロトコルを使用した画像ファイルの URL パス。
サポートされているファイル形式には、BMP、JPG/JPEG、GIF、TIFF、PNG、ICO、WEBP があります (WEBP は Web および Android ではサポートされていません)。
代替テキスト 省略可能
アクセシビリティのために画像を説明する代替テキスト。
サイズ 省略可能。
画像の寸法を指定します。
いくつかの可能な値があります。
0:画像をセルに合わせ、縦横比を維持します。※省略時の既定値
1:セルを画像で埋め、縦横比を無視します。
2:元の画像サイズを維持します。セルの境界を超える可能性があります。
3:高さと幅の引数を使用して、画像のサイズをカスタマイズします。
高さ 画像のカスタムの高さ (ピクセル単位)。 省略可能。
画像のカスタム幅 (ピクセル単位)。 省略可能。
※引数の高さ/幅の 1 つだけを指定した場合、画像の縦横比は指定された引数に従って保持されます。


使用例

引数「サイズ」の指定により画像の表示が変わる事を確認してください。

VBA マクロ 画像 セルに配置 セルの和えに配置
=IMAGE("https://excel-ubara.com/images/logo.png")
=IMAGE("https://excel-ubara.com/images/logo.png",,1)
=IMAGE("https://excel-ubara.com/images/logo.png",,2)
=IMAGE("https://excel-ubara.com/images/logo.png",,3,100,150)

※引数による表示画像の違いに注意してください。
※IMAGE関数の入ったセルを他のセルに値貼付けした場合、「セルに配置」された画像になります。


手動で画像を「セルに配置」

IMAGE関数は「"https" プロトコルを使用した画像ファイルの URL パス。」でしたが、
この「セルに配置」はローカルPCの画像を入れられます。
画像そのものをセルに入れるのでファイルサイズは大きくなります。

「挿入」→「図」→「画像」→「セルに配置」

VBA マクロ 画像 セルに配置 セルの和えに配置

「セルの上に配置」は従来通りのシートに挿入(セルに重ねて表示しているだけ)するものになります。

VBA マクロ 画像 セルに配置 セルの和えに配置

画像が挿入されたセルを選択すると、

VBA マクロ 画像 セルに配置 セルの和えに配置

このように右上にインジケーターが表示されます。
数式バーには「画像」と表示されます。
この文字列の「画像」を再入力してしまうと単なる「画像」という文字列になってしまいます。

VBA マクロ 画像 セルに配置 セルの和えに配置


※「セルに配置」された画像は、セルのクリア(Deleteキー)で消せます。
※IMAGE関数の入ったセルを他のセルに値貼付けした場合、「セルに配置」された画像になります。


「セルに配置」⇔「セルの上に配置」

「セルに配置」でセルの中に入れた画像を、「セルの上に配置」でセルから取り出することが出来ます。
さらに、取り出した画像は再度「セルに配置」でセルの中に入れることが出来ます。

インジケーターで操作

VBA マクロ 画像 セルに配置 セルの和えに配置

このインジケーターをクリックすると「セルの上に配置」されます。
従来のようにセルの上にのっている状態です。

VBA マクロ 画像 セルに配置 セルの和えに配置

「セルの上に配置」された画像を選択するとインジケーターが表示されます。

VBA マクロ 画像 セルに配置 セルの和えに配置

このインジケーターをクリックすると、再び「セル内に配置」されます。

VBA マクロ 画像 セルに配置 セルの和えに配置


右クリックメニューから操作

VBA マクロ 画像 セルに配置 セルの和えに配置

画像の入ったセルの右クリックから、
「セル内の画像」→「セルの上に配置」
従来のようにセルの上にのっている状態に出来ます。
これは、IMAGE関数のセルでも同様です。

VBA マクロ 画像 セルに配置 セルの和えに配置

VBA マクロ 画像 セルに配置 セルの和えに配置

「セルの上に配置」された画像の右クリックから、
「セル内に配置」
これで画像はセル内に配置されます。


「セルに配置」「セルの上に配置」のVBA

新規に画像を選んで「セルに配置」

Sub sample1()
  Range("A1").Select
  Selection.InsertPictureInCell "https://excel-ubara.com/images/logo.png"
End Sub

セルの選択をわざわざする必要があるか?
Range("A1").InsertPictureInCell "https://excel-ubara.com/images/logo.png"
これだけで良さそうに思われます。
しかしRangeを指定してもそこに入るわけではなく、あくまでActiveCellに入ります。
ActiveCellに入る以上、事前にSelectする必要があるので、結局は上記のVBAコードに落ち着いてしまいます。
※このVBAで画像を入れたセルを数式バーで見ると入れた画像のURLが表示されます。

最大の問題点
一度も画像や図形を扱っていないシートではエラーが発生します。
ただし、Microsoftの公式に情報がないので断定はできません。
エラー発生条件もはっきりとは絞り込めません・・・

VBA マクロ 画像 セルに配置 セルの和えに配置

とんな画像でも図形でも構わないので、一度でもシートに配置した後は問題なく動作します。
現在の状況からすると、バグの可能性も結構ありそうにも思います。
今後変更されることを期待します。


「セルに配置」されている画像を「セルの上に配置」

Sub sample2()
  Range("A1").PlacePictureOverCells
End Sub

このVBAは、当該セルに画像が入っていなくてもエラーになりません。
当該セルを左上として画像が元の大きさでセルの上に配置されます。


「セルの上に配置」されている画像を「セルに配置」

Sub sample3()
  ActiveSheet.Shapes("Picture 3").Select
  ActiveSheet.Shapes("Picture 3").PlacePictureInCell
End Sub

これもSelectしないと正しく動作しません。
エラーにはならないのですが、何も変化せずに終わってしまいます。
また、2行目は、
Selection.PlacePictureInCell
これでも良さそうですが、これではエラーになってしまいます。

VBA マクロ 画像 セルに配置 セルの和えに配置

このエラー原因・発生条件等々も今のところ不明です。


画像が「セルに配置」されたセルのコピー

セルそのもののコピー

Sub sample4()
  Range("A1").Copy Destination:=Range("A2")
End Sub

当然ですが、これは何も問題ありません。


Valueプロバティの設定

Sub sample5()
  Range("A2") = Range("A1")
End Sub

これはコピー先のセルには、「#VALUE!」のエラー値が入ります。


形式を選択して貼付けで値のみ

Sub sample6()
  Range("A1").Copy
  Range("A2").PasteSpecial Paste:=xlPasteValues
End Sub

書式ごとコピーするなら最初のVBAで良いのですが、書式はコピーしたくない場合もあると思います。
そんな時はこのように値貼り付けで画像をコピーすることが出来ます。


画像が「セルに配置」されたセルのValueの型式

シート関数のTYPE関数の結果は「128」になります。
128は複合データです。
では、VBAではどうでしょうか?

VBA マクロ 画像 セルに配置 セルの和えに配置

これはどういうことなのでしょうか???
もちろん、Valueを省略してしまうとRangeになってしまいますし・・・
セルに画像が入っている状態、つまり「セルに配置」されている状態はどうやって判定したらよいのでしょうか・・・

IMAGE関数を入れたセルも同様の結果になります。
IMAGE関数が入っていればそれで判断できますが、手動やVBAで画像を「セルに配置」した場合はどのように判定したら良いのでしょうね。
これは継続調査とします。




同じテーマ「マクロVBA技術解説」の記事

Select Caseでの短絡評価(ショートサーキット)の使い方
RangeオブジェクトのFor EachとAreasについて
画像が行列削除についてこない場合の対処
新関数SORTBYをVBAで利用するラップ関数を作成
LAMBDA以降の新関数はVBAで使えるか
数字(1~50)を丸付き数字に変換するVBA
文字列のプロパティ名でオブジェクトを操作する方法
OneDrive使用時のThisWorkbook.Pathの扱い方
セル個数を返すRange.CountLargeプロパティとは
画像「セルに配置」のVBAについて(365の新機能)
VBAでクリップボードへ文字列を送信・取得する3つの方法


新着記事NEW ・・・新着記事一覧を見る

TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ