VBA練習問題
VBA100本ノック 64本目:リンクされた図(カメラ機能)

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

VBA100本ノック 64本目:リンクされた図(カメラ機能)


「元表1」「元表2」の2シートの表範囲を「リンクされた図」として「まとめ」シートに貼り付ける問題です。


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

VBAテスト用のサンプルデータは、VBA100本ノックの目次ページ よりダウンロードできます。
マクロVBA情報を中心に、エクセル関数・基本操作までサンプルとともに解説。初心者向けの基本から上級者向けの高度な内容までVBAサンプルコードを掲載解説しています。


出題

出題ツイートへのリンク

#VBA100本ノック 64本目
「元表1」「元表2」の2シートのA1からの表範囲を「リンクされた図」として「まとめ」シートに貼り付けてください。
貼り付け位置
・「元表1」はA1:J20の範囲へ
・「元表2」はA21:J40の範囲へ
※範囲内の縦横位置は任意
※再実行を考慮し、前回貼り付け分は削除してください。

マクロ VBA 100本ノック


手動での操作
セル範囲をコピーした後に、貼り付けるときに「貼り付けオプション」の右下の「リンクされた図」で貼りつけます。
カメラ機能とも呼ばれています。

マクロ VBA 100本ノック


頂いた回答

解説

いわゆるカメラ機能になります。
印刷レポート作成の時には重宝する機能です。
WorksheetのPicturesは、オブジェクトブラウザでも隠しメンバーとなっていて調べづらいですね。
こういう処理は「マクロの記録」があるのがとても助かります。

Sub VBA100_64_01()
  Dim wsまとめ As Worksheet: Set wsまとめ = Worksheets("まとめ")
  Dim ws元表1 As Worksheet: Set ws元表1 = Worksheets("元表1")
  Dim ws元表2 As Worksheet: Set ws元表2 = Worksheets("元表2")
  
  Call delLinkPictutr(wsまとめ)
  Call setLinkPicture(wsまとめ.Range("A1:J20"), ws元表1)
  Call setLinkPicture(wsまとめ.Range("A21:J40"), ws元表2)
End Sub

Sub delLinkPictutr(ByVal ws As Worksheet)
  Dim sp As Picture
  For Each sp In ws.Pictures
    'リンクされた画像のみ削除
    On Error Resume Next
    If sp.Formula <> "" Then
      If Err.Number = 0 Then sp.Delete
    End If
  Next
End Sub

Sub setLinkPicture(aRng As Range, ByVal ws元表 As Worksheet)
  Dim ws As Worksheet: Set ws = aRng.Worksheet
  ws元表.Range("A1").CurrentRegion.Copy
  With ws.Pictures.Paste(link:=True)
    '縦横比を固定(されているけど)してサイズ調整
    .ShapeRange.LockAspectRatio = msoTrue
    If .Width > aRng.Width - 2 Then .Width = aRng.Width - 2
    If .Height > aRng.Height - 2 Then .Height = aRng.Height - 2
    '上に揃えて、左右は真ん中
    .Top = aRng.Top
    .Left = aRng.Left + ((aRng.Width - .Width) / 2)
  End With
  Application.CutCopyMode = False
End Sub


前回分の図の削除は、ShapesやPicturesを全て削除しても構わないと思いますが、
上記ではリンクされているものだけ削除するようにしました。
サイズ・位置調整については「29本目:画像の挿入」でやったものがそのまま使えます。
指定の画像をアクティブセル内に収まるように貼り付ける問題です。ツイッター連動企画です。ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。VBAテスト用のサンプルデータはご自身でご用意ください。
補足はありません。


補足

補足はありません。


サイト内関連ページ

第97回.図形オートシェイプ(Shape)
マクロVBAで、オートシェイプ(図形)を扱う場合の解説です。オートシェイプ(図形)はShapeオブジェクトであり、ShapeオブジェクトのコレクションがShapesコレクションになります。Shapeオブジェクトは、多くのオブジェクトをメンバーに持った複雑なオブジェクトとなっています。
図をセル内に強制的に収める(Shape)
図(画像等)をエクセルに貼り付けた後、セルの移動と一緒に動かない場合があります。もちろん、図の書式のプロパティでは、「セルに合わせて移動」にしてある場合の話です。図がセルを大きくはみ出しているいる場合(隣のセルよりさらにはみだしている場合)は、セルのコピー、移動にくっていてきません。
写真の取込方法について(Pictures.Insert,Shapes.AddPicture)
写真を取り込んで、アルバムのようにしたり、各種の資料を作ったりと、写真をエクセルに取り込む機会は多いようです。しかし、最近は写真のサイズも大きくなり、手動で取り込んだままではスクロールもままならない状態となってしまいます。そこで写真ファイルを指定し、A列に上から順番に貼り付け、さらにセル内に収まるように縮小するVBAになります。
写真をサムネイルに変換して取り込む(Shapes.AddPicture)
写真を取り込んだ場合、リンクすると元のファイルが無いと画像が見られず、リンクせずに取り込むとファイルサイズが巨大化してしまいます。そこで、サムネイルを作成しそれをセルに貼り付け、元のファイルへのハイパーリンクを付けておくようにします。写真の取込方法の基本については以下をご覧ください。




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

61本目:「ふりがな」の取得と設定
62本目:独自のZLOOKUP関数を作成
63本目:複数シートの連結
64本目:リンクされた図(カメラ機能)
65本目:固定長テキスト出力
66本目:全サブフォルダからファイルを探す
67本目:ComboBoxとListBox
68本目:全テキストボックスの転記
魔球編:組み合わせ問題
魔球編:閉領域の塗り潰し
迷宮編:巡回セル問題


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

VBA100本ノック 68本目:全テキストボックスの転記|VBA練習問題(1月16日)
VBA100本ノック 67本目:ComboBoxとListBox|VBA練習問題(1月15日)
VBA100本ノック 66本目:全サブフォルダからファイルを探す|VBA練習問題(1月13日)
VBA100本ノック 65本目:固定長テキスト出力|VBA練習問題(1月12日)
VBA100本ノック 64本目:リンクされた図(カメラ機能)|VBA練習問題(1月11日)
VBA100本ノック 63本目:複数シートの連結|VBA練習問題(1月9日)
VBA100本ノック 62本目:独自のZLOOKUP関数を作成|VBA練習問題(1月8日)
VBA100本ノック 61本目:「ふりがな」の取得と設定|VBA練習問題(1月6日)
VBA100本ノック 60本目:「株式会社」の表記ゆれ置換|VBA練習問題(1月5日)
VBA100本ノック 59本目:12ヶ月分のシートを四半期で分割|VBA練習問題(1月4日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.繰り返し処理(Do Loop)|VBA入門




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


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



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