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

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

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本ノック


サンプルファイルです。
https://excel-ubara.com/vba100sample/VBA100_64.xlsm
https://excel-ubara.com/vba100sample/VBA100_64.zip


VBA作成タイム

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


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


頂いた回答

解説

いわゆるカメラ機能になります。
印刷レポート作成の時には重宝する機能です。
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列に上から順番に貼り付け、さらにセル内に収まるように縮小するマク…
写真をサムネイルに変換して取り込む(Shapes.AddPicture)
写真を取り込んだ場合、リンクすると元のファイルが無いと画像が見られず、リンクせずに取り込むとファイルサイズが巨大化してしまいます。そこで、サムネイルを作成しそれをセルに貼り付け、元のファイルへのハイパーリンクを付けておくようにします。写真の取込方法の基本については以下をご覧ください。




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

61本目:「ふりがな」の取得と設定
62本目:独自のZLOOKUP関数を作成
63本目:複数シートの連結
64本目:リンクされた図(カメラ機能)
65本目:固定長テキスト出力
66本目:全サブフォルダからファイルを探す
67本目:ComboBoxとListBox
68本目:全テキストボックスの転記
69本目:ダブルクリックでセル結合を解除
70本目:ステータスバーに1秒ごとに時刻が表示
71本目:パワーポイントへグラフを貼り付け


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

還暦のVBA:VBAまでたどりつけるか… (2021-09-29)
VLOOKUPを使うことを基本としてシートを設計すべきか|エクセル雑感(2021-08-17)
コンピューターはブラックボックスで良い|エクセル雑感(2021-08-14)
小文字"abc"を大文字"ABC"に変換する方法|エクセル雑感(2021-08-13)
ADOでテキストデータを集計する|VBAサンプル集(2021-08-04)
VBA学習のお勧めコース|エクセル雑感(2021-08-01)
エクセル馬名ダービー|エクセル雑感(2021-07-21)
在庫を減らせ!毎日棚卸ししろ!|エクセル雑感(2021-07-05)
日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)
DXってなんだ? ITと何が違うの?|エクセル雑感(2021-06-24)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.並べ替え(Sort)|VBA入門




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


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



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