おしゃれにいけてる?

散歩やお買い物のことなどを書いています・・・

Entries

 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. もし、この記事が役に立ったら、「拍手」で知らせて下さい。

スポンサードリンク

Comment

Comment_form

管理者のみ表示。

左サイドメニュー

プロフィール

Author:ジョニー

ゆるゆると日々を過ごしてしまう、ダメダメ野郎の航海日記。



クリック (・。・)yoro

このブログ内を検索

最近の記事

カテゴリー

QRコード

QRコード

最近のコメント

月別アーカイブ

右サイドメニュー

カレンダー

02 | 2024/03 | 04
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

スポンサードリンク

FC2カウンター

#1414