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内にボタンを設置して、ボタンを押すと実行するようにしています
では~
コメント
とても助かりました。ありがとうございます!
oikさん
返信遅れまして申し訳ありません。
お役立ていただけてこちらも光栄です。
今更ですが、
>セル指定(例えば「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 等
testさん
こんにちは~
情報ありがとうございます。
参考になります。セル指定をする方法があるんですね…
現在検証ができる環境にないため、ひとまず公開という形にさせていただきます。