VBA練習問題
VBA100本ノック 29本目:画像の挿入

VBAを100本の練習問題で鍛えます
公開日:2020-11-20 最終更新日:2021-01-13

VBA100本ノック 29本目:画像の挿入


指定の画像をアクティブセル内に収まるように貼り付ける問題です。


ツイッター連動企画です。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。

VBAテスト用のサンプルデータはご自身でご用意ください。


出題

出題ツイートへのリンク

#VBA100本ノック 29本目
ファイル選択ダイアログで画像ファイルを指定し、その画像をアクティブセルにリンクしない図として貼り付けてください。
貼り付けた画像は、縦横比を維持したままセル内に収めてください。
セル内の位置はなるべく真ん中に。
※選択できる拡張子は適当に。

マクロ VBA 100本ノック


VBA作成タイム

この下に頂いた回答へのリンクと解説を掲載しています。
途中まででも良いので、できるだけ自分でVBAを書いてみましょう。


他の人の回答および解説を見て、書いたVBAを見直してみましょう。


頂いた回答

解説

ファイル選択は、ApplicationのGetOpenFilenameまたはFileDialogです。
今回はGetOpenFilenameを使いました。
画像の挿入は、マクロの記録ではPictures.Insertになりますが、これは元画像にリンクしてしまいます。
切り取り直せば良いですが、VBAには便利なShapes.AddPictureがあります。

Sub VBA100_29_01()
  Dim rng As Range
  Set rng = ActiveCell
  
  Dim FileName As Variant
  FileName = Application.GetOpenFilename(FileFilter:="画像ファイル,*.bmp;*.jpg;*.gif")
  If FileName = False Then
    Exit Sub
  End If
  
  With rng.Worksheet.Shapes.AddPicture(FileName:=FileName, _
                     LinkToFile:=False, _
                     SaveWithDocument:=True, _
                     Left:=rng.Left, _
                     Top:=rng.Top, _
                     Width:=0, _
                     Height:=0)
    .LockAspectRatio = msoTrue '縦横比固定
    .Placement = xlMoveAndSize '移動&サイズ変更
    .ScaleHeight 1, msoTrue '縦を元のサイズに
    .ScaleWidth 1, msoTrue '横を元のサイズに
    
    If .Width > rng.Width - 2 Then .Width = rng.Width - 2
    If .Height > rng.Height - 2 Then .Height = rng.Height - 2
    
    .Top = .Top + ((rng.Height - .Height) / 2)
    .Left = .Left + ((rng.Width - .Width) / 2)
  End With
End Sub


今回は特に補足することも無いのですが、上記VBAを書くときにサイズ指定のあたりで気を付けた事等を記事補足に記載しました。


補足

引数の、
LinkToFile:=False
SaveWithDocument:=True
これでリンクしない図になります。

縦横比を維持するには、
LockAspectRatio = msoTrue
これを指定してしまうのが簡単だと思います。
後は、縦横のサイズをセルのサイズ以下にするだけです。

マイナス2しているのは、見た目として枠線に重ならないようにするためです。

マクロ VBA 100本ノック
マクロ VBA 100本ノック

上がマイナス2している場合で、下がマイナスしていない場合です。
このあたりは好みの部分なので、今回はこのようにしてみたという事です。


サイト内関連ページ

第97回.図形オートシェイプ(Shape)
・図形オートシェイプ(Shape)関連のオブジェクト群 ・図形オートシェイプ(Shape)の追加 ・図形オートシェイプ(Shape)の削除 ・図形オートシェイプ(Shape)の編集 ・図形オートシェイプ(Shape)の全選択 ・図形オートシェイプ(Shape)の扱い方を工夫する ・オートシェイプ(Shape)を扱う実践例 ・図形オートシェイプ(Shape)に関連する記事
図をセル内に強制的に収める(Shape)
図(画像等)をエクセルに貼り付けた後、セルの移動と一緒に動かない場合があります。もちろん、図の書式のプロパティでは、「セルに合わせて移動」にしてある場合の話です。図がセルを大きくはみ出しているいる場合(隣のセルよりさらにはみだしている場合)は、セルのコピー、移動にくっていてきません。
写真の取込方法について(Pictures.Insert,Shapes.AddPicture)
・Pictures.Insertメソッド ・Shapes.AddPictureメソッド ・Shapesに関連する記事
写真をサムネイルに変換して取り込む(Shapes.AddPicture)
・写真をサムネイルに変換して取り込むVBA ・写真をサムネイルに変換して取り込むVBAの解説 ・Shapesに関連する記事




同じテーマ「VBA100本ノック」の記事

26本目:ファイル一覧作成
27本目:ハイパーリンクのURL
28本目:シートをブックに分割
29本目:画像の挿入
30本目:名札作成(段組み)
31本目:入力規則
32本目:Excel終了とテキストファイル出力
33本目:マクロ記録の改修
34本目:配列の左右回転
35本目:条件付き書式
36本目:列の並べ替え


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

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「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.



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