【マクロVBA】写真・図を変数や配列のように格納して、様々なサイズ・位置に貼り付ける方法

写真・図

写真や図を変数や配列のように格納して活用したいと思ったことはないでしょうか。

通常であれば、写真・図を貼り付けたい場合はコピーペーストして対応すると思いますが、
貼り付け位置が多い場合や、貼り付けのパターンが多ければコピペでの貼り付けは面倒です。

そこで今回はマクロVBAで変数・配列のように図を格納して好きな位置に

貼り付ける方法を紹介します。
是非参考にしてみてください。それではみていきましょう。




⬛︎忙しい人向けのコピぺ用プログラム

黄色の蛍光ペンの部分をお好みで打ち換えてください。

Sub 図を格納して貼り付け()

Dim WideValue, HighValue, PhotoName As String

For Each TARGET In ActiveSheet.Shapes '写真を繰り返し選択
 If Not Intersect(TARGET.TopLeftCell, Range("切り取り範囲")) Is Nothing And _
  Not Intersect(TARGET.BottomRightCell, Range("切り取り範囲")) Is Nothing Then
   TARGET.Select False '指定範囲に入っていない写真は除外
 End If
Next TARGET

With Selection
 WideValue = .Width '幅を格納
 HighValue = .Height '高さを格納
 .Copy '対象をコピー
End With 

ActiveSheet.ChartObjects.Add(0, 0, WideValue, HighValue).Name = "Targerpicture" 'チャートの作成
ActiveSheet.ChartObjects("Targerpicture").Activate '作成したチャートをアクティブに
ActiveChart.Paste 'チャートに写真を貼り付ける
ActiveChart.ChartArea.Format.Line.Visible = msoFalse 'チャートの外枠をなくす

PhotoName = "保存するパス" & "\" & "貼り付け用写真.jpg"

With ActiveSheet.ChartObjects("Targerpicture")
 .Chart.Export PhotoName '写真を名前をつけて保存
 .Delete
End With

Set OBJSHAPE = ActiveSheet.Shapes.AddPicture( _
          FileName:=PhotoName, _
                          LinkToFile:=False, _
          SaveWithDocument:=True, _
          Left:=ActiveSheet.Range("貼り付け位置").Left, _
          Top:=ActiveSheet.Range("貼り付け位置").Top, _
          Width:=ActiveSheet.Range("貼り付けサイズ").Width, _
          Height:=ActiveSheet.Range("貼り付けサイズ").Height) '貼り付け

Kill PhotoName '写真を消す

End Sub

⬛︎プログラムの考え方について

まず結論から言うと配列や変数などに写真・図を格納することは不可能です。
しかし、似たような事をすることは出来ます

様々な方法があるのかもしれませんが今回紹介する方法は
写真・図を一旦保存して、そのファイル名を変数に書き込み
その変数を用いて指定位置に貼り付け
ます。

なので手順としては

①指定範囲内にある写真・図を選択する
②写真・図を保存して、そのパスを変数に格納する
③指定位置に貼り付ける
④プログラム終了後は写真・図ファイルを削除する

と言った流れになります。
では実践編をみていきましょう。

⬛︎実践編:写真・図を格納して貼り付ける方法

では①から④の順に見ていきましょう。

・①指定範囲内にある写真・図を選択する

まずは格納したい写真・図を名前をつけて保存したいと思います。
注意点としてVBAで保存できるのは「Chart」となります。
「Chart」はグラフを意味します。

なのでイメージとして「Chart」を作成して
そこに指定した写真・図を貼り付けて写真・図ごと「Chart」を保存する

といった流れです。

ではまず、保存したい写真・図を選択します。
見本の写真は下図の通りです。

今回は指定範囲内にある写真・図を登録してみましょう。

構文はこちらです。

For Each TARGET In ActiveSheet.Shapes '写真を繰り返し選択

If Not Intersect(TARGET.TopLeftCell, Range("A1:D5")) Is Nothing And _
Not Intersect(TARGET.BottomRightCell, Range("A1:D5")) Is Nothing Then
TARGET.Select False '指定範囲に入っていない写真は除外
End If
Next 
TARGET

今回は見本でA1からD5」にある写真・図を対象にしました。
なので「Range(“A1:D5”)) Is Nothing」で範囲をしぼっています。

仕組みとして「TopLeftCell」で写真の左上、「BottomRightCell」で写真の右下を検知し、
対象範囲内にあるか確認
しています。

その後、範囲内に該当する写真・図については選択した状態を維持するようになります。
実行した結果はこちら。

これで選択は出来ましたが、選択した写真・図を
Chart」に貼り付ける必要があります。
しかし、通常の状態で「Chart」を生成すると選択した写真・図のサイズとは
異なってしまいます。

そこで現在の写真・図のサイズを格納し、そのサイズに見合った
「Chart」を生成
する必要があります。

ではプログラムを見ていきましょう。

Dim WideValue, HighValue

With Selection
WideValue = .Width '幅を格納
HighValue = .Height '高さを格納
.Copy '対象をコピー

End With

現状は対象の写真を選択している状態です。
その選択した写真を対象にWideValue = .Width」で写真・図の幅を格納し、HighValue = .Height 」で写真・図の高さを格納します。
さらに貼り付けるため、対象をコピーしています。

では、チャートを作成して、対象の写真を貼り付けてみましょう。
プログラムはこちら

ActiveSheet.ChartObjects.Add(0, 0, WideValue, HighValue).Name = "Targerpicture" 'チャートの作成
ActiveSheet.ChartObjects("Targerpicture").Activate '作成したチャートをアクティブに
ActiveChart.Paste 'チャートに写真を貼り付ける
ActiveChart.ChartArea.Format.Line.Visible = msoFalse 'チャートの外枠をなくす

まずはチャートの作成の構文はこちらです。

ActiveSheet.ChartObjects.Add(左端からの距離, 上端からの距離, , 高さ).Name = "チャートの名前"

左端からの距離と上端からの距離については今回は写真として保存するだけなので
それぞれ「0」
とします。
高さについては、先ほど変数に格納した「WideValue」「HighValue」が該当します。

そして今回はチャートの名前を「Targerpicture」としました。
こちらを2行目のプログラムでアクティブ状態にします。

さらに3行目の「ActiveChart.Paste」でチャートに写真を貼り付けます。
そして最後にチャートの外枠を無くしました。外周に黒い線が残ってもいい場合はこちらは省略してください。

ではこれでChart形式の写真・図ができました。

・②写真・図を保存して、そのパスを変数に格納する

ではChart形式で保存できるようになったので、
指定フォルダに保存&変数にパスを格納していきましょう。

プログラムはこのようになります。

Dim PhotoName As String

PhotoName = "C:\検証ファイル\" & "貼り付け用写真.jpg"

With ActiveSheet.ChartObjects("Targerpicture")
.Chart.Export PhotoName
.Delete
End With

では仕組みを紹介します。
現在は①でチャート形式にした写真・図を作成している状態です。

まず変数で写真・図を保存する名前をフルパスを含めて決めています。
つまり、フルパスで指名したフォルダ・ファイル名で一旦
写真・図を保存する
ようになります。

見本では「ローカルディスクC」の「検証ファイル」に保存して、
写真・図名を「貼り付け用写真」としました。
写真・図なので拡張子を「.jpg」としています。

そして「Chart.Export先程のフルパス変数」で
写真・図として保存を実行します。

つまり、このフルパスが入った変数「PhotoName」が
画像を貼り付ける変数になります。

ちなみにここまでのプログラムを実行してみましょう。
指定ファイルにファイルが追加されました。

・③指定位置に貼り付ける

では実際に指定位置に貼り付けてみましょう。
まず構文から紹介したいと思います。

Set OBJSHAPE = ActiveSheet.Shapes.AddPicture( _
FileName:=ここにファイル名, _
LinkToFile:=False, _
SaveWithDocument:=TrueかFalse, _
Left:=左端からの貼り付け位置, _
Top:=上端からの貼り付け位置, _
Width:=写真・図の幅, _
Height:=写真・図の高さ)

では構文に当てはめていきましょう。
まず「FileName」は先程のフルパスが格納された変数「PhotoName」になります。

次に「LinkToFile」ですが図をグラフィック ファイルとリンクするかどうかを指定します。
今回は「False」にします。

「SaveWithDocument」については文書を保存するときに図も一緒に保存するかどうかを指定します。
今回は「True」にしておきましょう。

次に貼り付け位置についてです。
ここでは左端からの貼り付け位置が「Left」上端からの貼り付け位置が「Top」となります。
ここには数値でもいいですが、セルを指定しても構いません。

今回は見本で「E7」に貼り付けたいと思います。

最後に写真のサイズを指定します。
写真の幅は「Width」、高さは「Height」で指定します。

通常のサイズを維持する場合は「-1を入力します。
もちろん、直接サイズを入力しても構いません。

今回は見本で「E7」のセルのサイズに合わせて貼り付けます。

すべて足したプログラムはこちらです。

Set OBJSHAPE = ActiveSheet.Shapes.AddPicture( _
FileName:=PhotoName, _
LinkToFile:=False, _
SaveWithDocument:=True, _
Left:=ActiveSheet.Range("E7").Left, _
Top:=ActiveSheet.Range("E7").Top, _
Width:=ActiveSheet.Range("E7").Width, _
Height:=ActiveSheet.Range("E7").Height)

・④プログラム終了後は写真・図ファイルを削除する

写真・図を貼り付け終わったら最後に元の状態に戻すため
保存した写真・図を削除します。

削除する構文はこちら。

kill フルパス

では当てはめていきましょう。

フルパスは見本では「PhotoName」に格納しているので
Kill PhotoName」だけで写真・図ファイルを削除できます。

これで一連の動作は完了です。

・プログラムまとめ

では①から④を組み合わせてみます。
結果はこちらです。

Sub 図を格納して貼り付け()

Dim WideValue, HighValue, PhotoName As String

For Each TARGET In ActiveSheet.Shapes '写真を繰り返し選択
 If Not Intersect(TARGET.TopLeftCell, Range("A1:D5")) Is Nothing And _
  Not Intersect(TARGET.BottomRightCell, Range("A1:D5")) Is Nothing Then
   TARGET.Select False '指定範囲に入っていない写真は除外
 End If
Next TARGET

With Selection
 WideValue = .Width '幅を格納
 HighValue = .Height '高さを格納
 .Copy '対象をコピー
End With 

ActiveSheet.ChartObjects.Add(0, 0, WideValue, HighValue).Name = "Targerpicture" 'チャートの作成
ActiveSheet.ChartObjects("Targerpicture").Activate '作成したチャートをアクティブに
ActiveChart.Paste 'チャートに写真を貼り付ける
ActiveChart.ChartArea.Format.Line.Visible = msoFalse 'チャートの外枠をなくす

PhotoName = "C:\検証ファイル\" & "貼り付け用写真.jpg"

With ActiveSheet.ChartObjects("Targerpicture")
 .Chart.Export PhotoName '写真を名前をつけて保存
 .Delete
End With

Set OBJSHAPE = ActiveSheet.Shapes.AddPicture( _
          FileName:=PhotoName, _
                          LinkToFile:=False, _
          SaveWithDocument:=True, _
          Left:=ActiveSheet.Range("E7").Left, _
          Top:=ActiveSheet.Range("E7").Top, _
          Width:=ActiveSheet.Range("E7").Width, _
          Height:=ActiveSheet.Range("E7").Height) '貼り付け

Kill PhotoName '写真を消す

End Sub

長いですが、これで写真・図を格納して貼り付けるプログラムができました。
では実践してみましょう。

今回は「A1からD5」内の写真・図を格納して
「E7」に貼り付けます。

実行した結果はこちら。

狙い通り、貼り付けることができていますね。
サイズもセルの大きさに合わせて貼り付けてくれています。

⬛︎応用:見本のプログラム

ここからは先程のプログラムを応用したプログラムの事例を紹介します。

・格納した写真・図をブック内の全てのシートに貼り付ける。

まずは写真・図を格納して、ブック内のシート全ての指定位置に
貼り付け
てみましょう。

今回は先頭のシートの「A1からD5」の中の写真・図を
他の全てのシートの「E7」に貼り付けるプログラムを見てみましょう。

Sub 図を格納して貼り付け()

Dim WideValue, HighValue, PhotoName As String, SheetNo, cycle

For Each TARGET In ActiveSheet.Shapes '写真を繰り返し選択
  If Not Intersect(TARGET.TopLeftCell, Range("A1:D5")) Is Nothing And _
     Not Intersect(TARGET.BottomRightCell, Range("A1:D5")) Is Nothing Then 
     TARGET.Select False '指定範囲に入っていない写真は除外
  End If
Next TARGET

With Selection
  WideValue = .Width '幅を格納
  HighValue = .Height '高さを格納
  .Copy '対象をコピー
End With

ActiveSheet.ChartObjects.Add(0, 0, WideValue, HighValue).Name = "Targerpicture" 'チャートの作成
ActiveSheet.ChartObjects("Targerpicture").Activate '作成したチャートをアクティブに
ActiveChart.Paste 'チャートに写真を貼り付ける
ActiveChart.ChartArea.Format.Line.Visible = msoFalse 'チャートの外枠をなくす

PhotoName = "C:\検証ファイル\" & "貼り付け用写真.jpg"

With ActiveSheet.ChartObjects("Targerpicture")
  .Chart.Export PhotoName '写真を名前をつけて保存
  .Delete
End With

SheetNo = Sheets.Count

For cycle = 2 To SheetNo Step 1
  Sheets(cycle).Activate
  Set OBJSHAPE = ActiveSheet.Shapes.AddPicture( _
                           FileName:=PhotoName, _
                           LinkToFile:=False, _
                           SaveWithDocument:=True, _
                           Left:=ActiveSheet.Range("E7").Left, _
                           Top:=ActiveSheet.Range("E7").Top, _
                           Width:=ActiveSheet.Range("E7").Width, _
                           Height:=ActiveSheet.Range("E7").Height) '貼り付け
Next cycle

Kill PhotoName '写真を消す

End Sub

SheetNo」に全体のシート数をカウントして
「For Next」で貼り付けてシート数分貼り付けるようにしています。

通常、シートを繰り返し選択する場合は「For Each 変数 In Worksheets」
を使用しますが、貼り付けるシートを変則的に応用するために
今回はシート番号で対象シートをアクティブにさせています。

⬛︎公式の説明

わかりやすいように説明したため公式と使用する語句が異なりますが
マイクロソフト公式の説明については下記のリンクを参照してください☟

Shapes.AddPicture メソッド (PowerPoint) | Microsoft Learn

⬛︎まとめ

いかがだったでしょうか。
本記事の内容を活用すると、図を変数のように活用することができます。

エクセル内で図を定期的に指定位置に貼り付けたりする際には便利です。
署名の貼り付けなどにも活用できますね!

是非参考にしてみてください。
それでは次回の記事でお会いしましょう。

コメント