• 締切済み

Excel VBA クリップボードの処理方法

お世話になります。 以下の処理について教えて下さい。 1つ目のブックを開いて Workbooks.Worksheets(1).Shapes(1).Copy でクリップボードにコピーして、 UserFormのImage1に Set Image1.Picture = CreatePictureFromClipboard()で貼り付け、 2つ目のブックを開いて Workbooks.Worksheets(1).Shapes(1).Copy でクリップボードにコピーして、 UserFormのImage2に Set Image2.Picture = CreatePictureFromClipboard()で貼り付け、 3つ目のブックを開いて Workbooks.Worksheets(1).Shapes(1).Copy でクリップボードにコピーして、 UserFormのImage3に Set Image3.Picture = CreatePictureFromClipboard()で貼り付ける処理をしています。 この一連の流れを実行すると、image3だけ画像が貼られてます。 また、image1だけを生かして処理すると、image1に貼り付けられます。 image2だけ、image3だけでも同様で、2つのimageを処理するとダメでした。 全部のimageに貼り付けることは可能なのでしょうか? また、無理であれば違う方法で可能でしょうか? よろしくご指導お願いします。

みんなの回答

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.3

https://soudan1.biglobe.ne.jp/qa2885043.html にある CreatePictureFromClipboard を使っていますか? ならば、 Private Sub CommandButton1_Click()  Dim MyWB As Workbook  Dim cbData As New DataObject    Set MyWB = Workbooks.Open(ThisWorkbook.Path & "\BookA.xlsx")  MyWB.Worksheets(1).Shapes(1).Copy  Set Image1.Picture = CreatePictureFromClipboard()  MyWB.Close False    'DoEvents    Set MyWB = Workbooks.Open(ThisWorkbook.Path & "\BookB.xlsx")  MyWB.Worksheets(1).Shapes(1).Copy  Set Image2.Picture = CreatePictureFromClipboard()  MyWB.Close False  'DoEvents    Set MyWB = Workbooks.Open(ThisWorkbook.Path & "\BookC.xlsx")  MyWB.Worksheets(1).Shapes(1).Copy  Set Image3.Picture = CreatePictureFromClipboard()  MyWB.Close False End Sub といったコードで再現します。 先の説明と重複しますが  'DoEvents これを有効にすれば解決できるようです。

katsu4429
質問者

お礼

コメント有難うございます。 具体的なコードも提示して頂き、有難うございました。 提示して頂いたコードで上手くいっているならば、 私のコードがどこか間違っているのでしょうね。 DoEvents含め、もう少し確認してみます。 有難うございました。

  • kon555
  • ベストアンサー率51% (1842/3559)
回答No.2

具体的な環境などにもよると思いますが、個別でやればいけるなら、その原因の切り分けからですね。 ブックを開く、閉じるの動作が入る場合、その処理時間の間にマクロ側が次の処理を開始してしまう場合がよくあります。 一度ステップインなりブレークポイントなりstopなりで、時間をかけてやった場合はどうなるか確認してはいかがでしょうか。

katsu4429
質問者

お礼

コメント有難うございます。 仰るとおり、もう少しデバッグをしっかりとしてみます。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.1

CreatePictureFromClipboard これがよくわかりませんが... >2つ目のブックを開いて この直前に DoEvents を実行することで解決できるかもしれません。

katsu4429
質問者

お礼

コメント有難うございます。 DoEventsを入れてたんですが上手くいかなかったのでした。 もしかしたら処理を入れる箇所が違ったかもしれないので 再度確認してみます。