EXCEL VBA TIPs. [ ワークシート上の画像を、コピーアンドペーストする方法。]
Date:2008.06.01(Sun)12:11 | Category:[EXCEL VBA TIPs]
[編集]
ワークシート上に、「挿入」→「図」→「ファイルから」で画像を貼り付けると、その画像は Shape オブジェクトとして扱われる。
マクロで、ワークシート上の画像を、ダイアログボックスの Picture コントロールに貼り付けたいという、無茶な要望に答えたもの。
まず、Shape オブジェクトを抽出する方法。ワークシート上の、画像、線、図形は、まとめて Shapes コレクションとして取得できる。
Dim shps As Shapes
Set shps = ThisWorkbook.Worksheets("Sheet1").Shapes
この shps の中から、目的の画像の含まれる Shape を取り出すわけだけど、画像を検索するキーがない。
そこで、画像が置かれているセルの情報を使う。例えば、画像が "A1" セルに置かれているとして、
Dim shp As Shape
For Each shp In shps
'Shape が Picture オブジェクト(画像)か?
If shp.Type = msoPicture Then
'範囲 A1 にある Shape を捜す
Set area _
= Intersect(Range(shp.TopLeftCell, _
shp.BottomRightCell), _
Worksheets("Sheet1").Range("A1"))
'重なる範囲がある → その範囲に画像がある
If Not (area Is Nothing) Then
'範囲 A1 に含まれる画像 Shape がある
shp.Copy '画像をクリップボードにコピー
Exit For
End If
End If
Next
これで、クリップボードに画像がコピーされる。
Intersect は二つのレンジオブジェクトの、重なっている範囲を返す関数。Shape と "A1" が重なっていなければ Nothing を返す。
これは、逆に、"A1"に一部でも重なっている Shape があるとその範囲を返してしまう。
画像を特定したいのなら、そのセルには、確実にその画像だけを置くようにしなければならない。それぐらいの制限はしないと、VBA マクロは成立しない。
ここで、この前の記事で紹介した関数 LoadPictureFromCB() を使って、画像を抜き出して利用する。
フォームの Image コントロールに貼り付けるなら、
Set Form1.Image1.Picture = LoadPictureFromCB()
こんな感じ。
※ 実際に使う場合は、クリップボードに確実に画像がある状態でペーストすること。
※ クリップボードに画像があるかどうかチェックする方法の例。
CBContents = Application.ClipboardFormats
For Each fmt In CBContents
If fmt = xlClipboardFormatPICT Then
MsgBox "クリップボードにあるのは、PICT です。"
End If
Next
PS. もし、この記事が役に立ったら、「拍手」で知らせて下さい。
スポンサードリンク
マクロで、ワークシート上の画像を、ダイアログボックスの Picture コントロールに貼り付けたいという、無茶な要望に答えたもの。
まず、Shape オブジェクトを抽出する方法。ワークシート上の、画像、線、図形は、まとめて Shapes コレクションとして取得できる。
Dim shps As Shapes
Set shps = ThisWorkbook.Worksheets("Sheet1").Shapes
この shps の中から、目的の画像の含まれる Shape を取り出すわけだけど、画像を検索するキーがない。
そこで、画像が置かれているセルの情報を使う。例えば、画像が "A1" セルに置かれているとして、
Dim shp As Shape
For Each shp In shps
'Shape が Picture オブジェクト(画像)か?
If shp.Type = msoPicture Then
'範囲 A1 にある Shape を捜す
Set area _
= Intersect(Range(shp.TopLeftCell, _
shp.BottomRightCell), _
Worksheets("Sheet1").Range("A1"))
'重なる範囲がある → その範囲に画像がある
If Not (area Is Nothing) Then
'範囲 A1 に含まれる画像 Shape がある
shp.Copy '画像をクリップボードにコピー
Exit For
End If
End If
Next
これで、クリップボードに画像がコピーされる。
Intersect は二つのレンジオブジェクトの、重なっている範囲を返す関数。Shape と "A1" が重なっていなければ Nothing を返す。
これは、逆に、"A1"に一部でも重なっている Shape があるとその範囲を返してしまう。
画像を特定したいのなら、そのセルには、確実にその画像だけを置くようにしなければならない。それぐらいの制限はしないと、VBA マクロは成立しない。
ここで、この前の記事で紹介した関数 LoadPictureFromCB() を使って、画像を抜き出して利用する。
フォームの Image コントロールに貼り付けるなら、
Set Form1.Image1.Picture = LoadPictureFromCB()
こんな感じ。
※ 実際に使う場合は、クリップボードに確実に画像がある状態でペーストすること。
※ クリップボードに画像があるかどうかチェックする方法の例。
CBContents = Application.ClipboardFormats
For Each fmt In CBContents
If fmt = xlClipboardFormatPICT Then
MsgBox "クリップボードにあるのは、PICT です。"
End If
Next
PS. もし、この記事が役に立ったら、「拍手」で知らせて下さい。
Comment
Comment_form