VBA技術解説画像「セルに配置」のVBAについて(365の新機能)
Excel365の新機能として、画像をセルに配置することが出来るようになりました。従来の画像の挿入は、シートに対して画像を挿入するもので、表示位置がセルに重なっているだけでした。今回の「セルに配置」は、画像をセルの中にデータとして入れることが出来るようになったものです。
=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の画像を入れられます。 画像そのものをセルに入れるのでファイルサイズは大きくなります。
「挿入」→「図」→「画像」→「セルに配置」 「セルの上に配置」は従来通りのシートに挿入(セルに重ねて表示しているだけ)するものになります。 画像が挿入されたセルを選択すると、 このように右上にインジケーターが表示されます。 数式バーには「画像」と表示されます。 この文字列の「画像」を再入力してしまうと単なる「画像」という文字列になってしまいます。 ※「セルに配置」された画像は、セルのクリア(Deleteキー)で消せます。 ※IMAGE関数の入ったセルを他のセルに値貼付けした場合、「セルに配置」された画像になります。 「セルに配置」⇔「セルの上に配置」 「セルに配置」でセルの中に入れた画像を、「セルの上に配置」でセルから取り出することが出来ます。 さらに、取り出した画像は再度「セルに配置」でセルの中に入れることが出来ます。 インジケーターで操作 このインジケーターをクリックすると「セルの上に配置」されます。 従来のようにセルの上にのっている状態です。 「セルの上に配置」された画像を選択するとインジケーターが表示されます。 このインジケーターをクリックすると、再び「セル内に配置」されます。 右クリックメニューから操作 画像の入ったセルの右クリックから、 「セル内の画像」→「セルの上に配置」 従来のようにセルの上にのっている状態に出来ます。 これは、IMAGE関数のセルでも同様です。 「セルの上に配置」された画像の右クリックから、 「セル内に配置」 これで画像はセル内に配置されます。 「セルに配置」「セルの上に配置」の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の公式に情報がないので断定はできません。 エラー発生条件もはっきりとは絞り込めません・・・ とんな画像でも図形でも構わないので、一度でもシートに配置した後は問題なく動作します。 現在の状況からすると、バグの可能性も結構ありそうにも思います。 今後変更されることを期待します。 「セルに配置」されている画像を「セルの上に配置」 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 これでも良さそうですが、これではエラーになってしまいます。
このエラー原因・発生条件等々も今のところ不明です。 画像が「セルに配置」されたセルのコピー セルそのもののコピー 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ではどうでしょうか?これはどういうことなのでしょうか. もちろん、Valueを省略してしまうとRangeになってしまいますし・・・ セルに画像が入っている状態、つまり「セルに配置」されている状態はどうやって判定したらよいのでしょうか・・・
IMAGE関数を入れたセルも同様の結果になります。 IMAGE関数が入っていればそれで判断できますが、手動やVBAで画像を「セルに配置」した場合はどのように判定したら良いのでしょうね。 これは継続調査とします。
同じテーマ「マクロVBA技術解説」の記事 新着記事 NEW ・・・新着記事一覧を見る アクセスランキング ・・・ ランキング一覧を見る このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。 掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。 本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。 This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.