[VBA] 画像が選択されているか判定する

今回は、画像が選択されているかどうかを判定するコードを紹介します。

ご依頼では、ご依頼いただいた会社様の写真つきのカタログ文書や、案内文書を作成するご依頼をいただくことが多いです。
基本的には画像は1つに対して1つの処理を行って、正確に反映されるかの検証を行いますが、
今回は、別のエクセルファイルに、複数枚重ねて作成した画像をそのままコピーして、作成された通りの重ね具合(位置や見栄え)を保ったまま、テンプレートファイルの規定の枠内に大きさや位置を調整して、自動で貼り付け転記をしてほしいというご依頼をいただいたので、記事にしてみました。

この、複数画像を一度に処理する場合は、オブジェクト変数に代入するより、Selectionを使用した方が、適切な結果が得られるのですが、処理速度によっては、適切に貼り付けられていないことがあり、そのチェックを行わなければなりません。

その際に必ず、貼り付けられたかどうかチェックを行うための確認コードを紹介してきます。

VarType関数で画像が選択されているか判定しよう

基本的にはVarType関数が使いやすいので、VarType関数を使って行いましょう。
VarType関数は、下記のようなコードで記述を行います。

Sub 画像が選択されているか判定()

 If VarType(Selection) = vbObject Then
  MsgBox "図形が選択されています!"
 Else
  MsgBox "図形は選択されていせん。"
 End If

End Sub

画像は、vbObjectで判定を行いしましょう。

複数の画像を貼り付けできたか確認しよう

今回は、上記のVarType関数がどのタイミングでよく使われるのかという実例も併せて紹介していきます。

今回使用したい関数は、「Selection」と「VarType」を使用したいので、複数の画像を選択してコピペを行い、正しく貼り付けができるのかというコードも記載しておきます。

コピペを行う画像がひとつの場合には、オブジェクト変数を使用した方が操作がしやすいので、その点も併せて覚えてください。

ここでは、複数選択するという例を基に、Aシートの画像を全て選択した場合を記述します。

Sub 複数画像がただしく貼り付けられたか判定()

Dim Sp As Object
Dim Cnt As Long

 SheetA.Activate
 Cnt = 0

 For Each Sp In SheetA.Shapes
   If Cnt = 0 Then
     Sp.Select Replace:=True
   Else
     Sp.Select Replace:=False
   End If
 Next

 If Cnt = 0 Then
    MsgBox "Aシートに画像がありませんでした"
    Exit Sub
 End

 Selection.Copy
 
 SheetB.Activate
 Range("A1").Select  '←画像の選択を解除しておく
 Range("A1").PasteSpecial xlPasteAll


 If VarType(Selection) = vbObject Then
  MsgBox "複数画像は正しく貼り付けられました"
 Else
  MsgBox "複数画像は正しく貼り付けられませんでした"
 End If

End Sub


実際のご依頼では、「1つのセルの中に重ねられた画像」を順にVBAコードで処理していくのが本題ですが、今回は簡潔に要点だけをコードを紹介させていただきました。
条件式を追加すれば、1つのセルの中の重ねれた画像を選択することができます。

実際のエクセルマクロツールで画像を扱う場合は、下記のようなところにも詳細に注意した画像処理を行ってエクセルマクロツールの開発を行っています。

*ループ処理の中で使用されている
*貼り付けられなかった時の再実行処理
*時間調整
*何が原因で貼り付けられなかったのかの特定処理

ぜひ、ご参考になれば幸いです。