web-dev-qa-db-ja.com

VBAを使用して画像をファイルに挿入して保持する-Excel2013

私は、Excelドキュメントに一連の画像をインポートし、後でこのドキュメントを他のコンピューターで使用する必要がある友人のためにマクロに取り組んでいます。私が遭遇した問題は、このドキュメントを別のコンピューターで開くと、すべての画像が消えてしまい、代わりに、画像パスが見つからなかったことを示すこれらの小さなエラーサインが表示されることです。

私はExcel2007を使用している自分のコンピューターでマクロを開発しましたが、コードは完全に正常に機能します。私の友人はExcel2013を使用していますが、どうやら、これら2つのバージョンが画像のインポートと保存を処理する方法に大きな違いがあるようです。

全体として、画像を挿入する方法は2つあります。私が最初に試したのはこれに似たものでした:

Set pic = ActiveSheet.Pictures.Insert("C:\documents\somepicture.jpg")

これを行う2番目の方法は次のようになりました。

Set pic = Application.ActiveSheet.Shapes.AddPicture("C:\documents\somepicture.jpg", False, True, 1, 1, 1, 1)

この2番目のアプローチのドキュメントでは、3番目のパラメンター(ここではTrue)がドキュメントと一緒に画像を保存する責任があると言われています。

ただし、これらのアプローチはどちらも最終結果ではほぼ同じように見えます。これらは私にとっては正常に機能しますが、Excel 2013を使用して友人のPCで実行した場合は機能しません。したがって、必要なのは新しいものの回避策です。 Excelバージョン(Excel 2010以降、これらの画像インポート方法にバグなどがあることをどこかで読みました)。

8
FlyingM

私のすべての用途で、Insertを使用して画像を追加すると、ハードドライブ上のファイルへの参照が作成されます。何らかの理由で、画像をファイルに埋め込む場合は、図形を追加してから画像を配置する必要があります。 AddPictureを使用した形状(あなたが使用しているように)では、これに問題があったことは一度もありません。

また、画像に1ピクセルの高さと幅を指定しているので、以下のように高い設定を実際に確認することはほとんどできません。

Application.ActiveSheet.Shapes.AddPicture "C:\documents\somepicture.jpg", False, True, 1, 1, 100, 100

私はそれがずっと働いていたと感じています、そしてあなたはそれが小さすぎたので写真を見たことがありませんでした。

3
user2140261

最初のスニペットは問題なく機能しますが、画像の配置が許可されていないため(つまり、特定の範囲に配置された画像が必要な場合)、次のような2番目のソリューションに基づいて、配置でうまく機能するものを作成しました。未満。

Dim r As Range
Dim pic As Range
Set r = ActiveSheet.Range("A34:Q58")
Set pic = ActiveSheet.Shapes.AddPicture(ThisWorkbook.Path & "\FracAnalysis.png", _
linktofile:=msoFalse, savewithdocument:=msoCTrue, Left:=0, Top:=0, Width:=-1, Height:=-1)
pic.Select
Selection.ShapeRange.LockAspectRatio = msoFalse
Selection.Top = r.Top
Selection.Left = r.Left
Selection.Width = r.Width
Selection.Height = r.Height

以前の回答は本当に役に立ちました!メソッドパラメータへの参照を追加したかっただけです(幅と高さはピクセル単位であると思いましたが、ポイント単位であることがわかりました)。

https://msdn.Microsoft.com/en-us/library/Microsoft.office.interop.Excel.shapes.addpicture.ASPX

1

私は通常、サーバーからファイルに画像をダウンロードし、そのサーバーにアクセスできないクライアントに転送するマクロを実行します。私のコーディングは非常に基本的なものなので、画像の挿入に使用する特定の行をコピーします。

Set pic = ActiveSheet.Shapes.AddPicture(Filename:="C:\documents\somepicture.jpg", _
    linktofile:=msoFalse, savewithdocument:=msoCTrue, Left:=0, Top:=0, Width:=-1, Height:=-1)

私はあなたが提案したものと技術的に同じコードを知っていますが、msoCTrueとmsoFalseを使ってみてください。それが問題の一部だったことを思い出しているようです。それが機能するかどうか私に知らせてください、そして多分私たちは何か他のものを試すことができます。それは私のために働くので、私たちはあなたのためにそれを働かせることができるはずです。

1