VBAで図形はShapeオブジェクトで扱われます。Shapeオブジェクトを透過pngにしたいのですがソースコードだけでは難しいです。chatGPTに聞いてみたところGDI+を利用しろと言われました。勘弁してください。
そこで今日はもっと簡単な方法をご紹介いたします。需要があるかわかりませんが…
問題点と解決策
VBAではShapeオブジェクトをPNGへ直接エクスポートする方法がありません。Chartオブジェクト(グラフ)なら直接エクスポートできます。ただ、ShapeオブジェクトからChartオブジェクトに変換してさらにPNGに変換してとやろうとするとうまくPNGにできませんでした。
ですので、最初から空のグラフエリアの中に図形を入れた状態でエクスポートすれば簡単に透過PNGを作成することができるのです。
透過PNGの作り方
使用しているExcelはOffice2016です。
空のグラフエリアを作成します。なんでもいいので数値をセルに入力し、それを選択して「おすすめグラフ」ボタンを押してください。

おすすめされたグラフが表示されます。「OK」押します。

グラフが完成しました。グラフエリアの中に表示されている棒グラフだけ削除します。棒グラフを選択してdeleteしてください。


そして次が非常に重要なポイントになります。まずグラフエリアを選択します。それから図形を選んでグラフエリアの中に作成します。ポイントは2つです。
- グラフエリアを選択してから図形を選ぶこと!
- 図形をグラフエリア内で作成すること!


もう一つ重要な点があります。図形が本当にグラフエリアの中に作成されているかを確認してください。グラフエリア選択してドラッグアンドドロップします。そうすると中の図形も一緒についてくるはずです。もしついてこないようでしたらグラフエリアの中に作成されていません。やり直してください。以下確認方法を動画にしました。
透過PNGを作成しますので図形の背景とグラフの背景・枠線を「塗りつぶしなし」にします。


テキストボックスなどもグラフエリアに入れることができます。入れるときにはグラフエリアが選択されているか確認するのを忘れずに!

VBAソースコード
以下のソースコードを実行すると先ほど作成した図形inグラフエリアは透過PNGにすることができます。
Sub ExportChartAsPNG()
Dim cht As Chart
Set cht = ActiveSheet.ChartObjects(1).Chart
'グラフエリアを透過させる
cht.ChartArea.Format.Fill.Visible = msoFalse
'グラフエリアをPNGとして保存する
cht.Export "C:\temp\chart.png", "PNG"
End Sub
結果
透過PNGを作成することができました!

まとめ
デジタルとアナログを融合(?)させました。正攻法でうまくいかないときは角度を変えて攻めるとうまくいくときもあります。今回はそんな事例でした。
コメント