当サイトの一部にPR記事およびアフィリエイトリンクが含まれています
スポンサーリンク

【VBA】5行で対策可能。Excel2010でPictures.Insertで画像貼ったらリンクが付く不具合の対象法

スポンサーリンク
スポンサーリンク

Microsoft Excel 2010になってから急に仕様が変わったのか、Picture.Insertでエクセル上に画像を貼るマクロを実行したらリンクが付くようになった不具合的現象に対する対策法(コード)を紹介します。

スポンサーリンク

まえがき

 私はSEではないんですが、仕事柄Excelでマクロを組んだりすることがあります。

 先日、会社のOfficeが2003から2010にアップグレードしまして。GUIが大きく変わったものの2007でOffice Masterの資格を取っていた俺様に死角はない…と思っていたんですが、マクロで問題が発覚

 タイトルにあるとおり、Pictures.InsertメソッドでSheet内に画像を貼り付けると、2003ではなかった「画像に貼り付け元のファイルパスがリンク付けられる」というバグのようなものが起こります。

 その結果、自分のPCでマクロを使って画像を貼ったExcelファイルを他のPCで見ると、リンク切れの表示とともに画像が表示されないという困ったことになってしまいます…。

対策法はないのか…?

 対策法をググると「Shape.AddPictureメソッドを使うといいヨ」とだいたい出てくると思います。

 しかしこのShapes.AddPictureメソッド、シートへの貼り付け先の指定がポイント(左上を0,0とするピクセル)指定になっていて、セル指定(例えば「C列3行目」)ができないのです(実はできるのかもしれないけど)。

 しかも、Shapes.AddPictureメソッドで貼った直後の画像がアクティブな状態でないので、貼ったあとにマクロ的に移動させることができないのです(実はできるのかもしれないけど)。

対策法(たまたま発見しました)

 さて、この事態に対して一番手っ取り早い解決策がたまたま見つかりました。それは

Pictures.Insertで貼り付けた画像を一旦CutしてまたPasteするという方法です。

 たぶんこの案件を何も知らずにソースコードを見た人は「なにやってんだコイツ」と思われるでしょう。

 しかし、貼り付けた画像を切り取って再度貼り付けることで、何故かリンクは切れます

 要するに、他のPCでExcelファイルを見ても、画像がちゃんと表示されている本来の状態に戻るということですね。

例文

Sub test()
  ActiveSheet.Range("D10").Activate
  ActiveSheet.Pictures.Insert("C:\dack.jpg").Select
  Selection.cut
  ActiveSheet.Pictures.Paste
End Sub

簡単な解説

  • 2行目
    貼るところ(例文ではD列の10行目)を指定しています。
  • 3行目
    貼り付ける画像のパス(例ではCドライブ直下においているdack.jpg)を指定したセルに貼り付けています。
  • 4行目
    貼り付けたばかりの画像を切り取っています。
  • 5行目
    先程切り取ったばかりの画像を再度貼り付けています。

以上、なんともお粗末なコードです^^;

実行結果

無事貼り付け出来ました。^^(なお、表示のOfficeは2007です)

※Excel内にボタンを設置して、ボタンを押すと実行するようにしています


では~

コメント

  1. oik より:

    とても助かりました。ありがとうございます!

    • booboomasa より:

      oikさん
      返信遅れまして申し訳ありません。
      お役立ていただけてこちらも光栄です。

  2. test より:

    今更ですが、

    >セル指定(例えば「C列3行目」)ができないのです
    とのことですが、以下でいかがでしょうか

    dim shap as Shape
    set shap = Shape.AddPicture(path, msoFalse, msoCTrue,ActiveSheet.Range(“c3”).Left,ActiveSheet.Range(“c3”).Top,-1,-1)
    ‘以下 shap. で挿入した画像を操作可能です
    ‘例:shap.Left = ActiveSheet.Range(“c4”).Left 等

    • booboomasa より:

      testさん

      こんにちは~

      情報ありがとうございます。

      参考になります。セル指定をする方法があるんですね…
      現在検証ができる環境にないため、ひとまず公開という形にさせていただきます。