Excel VBA 作成した図を透過画像ファイル(PNG)で書き出す

スポンサーリンク

シェイプやワードアートで作成した図を透過画像ファイル(PNG)で書き出す方法

図形を表すShape【シェイプ】オブジェクトには画像として書き出しする仕組みはありません。
そこで、グラフを表すChart【チャート】オブジェクトのExport【チャートエクスポート】メソッドを利用して図を画像として書き出します。

空のグラフを作成して、そのグラフエリアに図を貼付けてChart【チャート】オブジェクトのExport【チャートエクスポート】メソッドで画像として書き出します。

Export【エクスポート】 メソッド

グラフを画像ファイルとして書き出すには、Chart【チャート】オブジェクトのExport【チャートエクスポート】メソッドを使用します。

Export【チャートエクスポート】メソッドの書式と設定値(引数)の説明

[]内は省略可
オブジェクト.Export(Filename, [FilterName], [Interactive])

  • オブジェクト(必須)
    ブック内のグラフを表すChart【チャート】オブジェクトを指定します。
  • Filename【ファイルネーム】(必須)
    書き出すファイルのファイル名と拡張子を指定します。
  • FilterName【フィルターネーム】(省略可)
    レジストリに表示されるグラフィック フィルターの言語非依存の名前を指定します。
  • Interactive【インターアクティブ】(省略可)
    True を指定すると、フィルター固有のオプションを含むダイアログ ボックスが表示されます。 False を指定すると、フィルターの既定値が使用されます。既定値は False です。

オートシェイプで図を作成しました


※図を作成したエクセルファイルの標準モジュールに下記のコードを張りつけてマクロを実行してください。エクセルファイルと同じパス(場所)にpngファイル(透過画像)が作成されます。

図を透過画像ファイル(PNG)で書き出すコードと解説

Sub sample()
MsgBox "ブックを任意の場所に一旦保存して" & vbCrLf & _
"画像ファイルを書き出すパス(場所)を確定してください。"
With Application.FileDialog(msoFileDialogSaveAs)
.InitialFileName = ThisWorkbook.Path & "¥"
.FilterIndex = 2
If .Show = -1 Then .Execute
End With
With ThisWorkbook.Sheets(1)
    .Activate
With .Shapes
If .Count >= 2 Then
     .SelectAll
     Selection.Group.Name = "ロゴ"
 Else
     .SelectAll
    Selection.Name = "ロゴ"
End If
End With
End With
With ActiveSheet.Shapes("ロゴ")
  .CopyPicture
ActiveSheet.ChartObjects.Add(0, 0, .Width, .Height).Name = "貼付用"
End With
With ActiveSheet.ChartObjects("貼付用")
  .Chart.PlotArea.Fill.Visible = msoFalse
  .Chart.ChartArea.Fill.Visible = msoFalse
  .Chart.ChartArea.Border.LineStyle = 0
End With
  Application.OnTime Now + TimeValue("00:00:03"), "sample2"
End Sub
Private Sub sample2()
With ActiveSheet.ChartObjects("貼付用")
  .Chart.Paste
  .Chart.Export ThisWorkbook.Path & "¥ロゴ.png"
  .Delete
  MsgBox ThisWorkbook.Path & "にpngファイルを出力しました。"
End With
End Sub
2行目、3行目
【MsgBox “ブックを任意の場所に一旦保存して” & vbCrLf & _
“画像ファイルを書き出すパス(場所)を確定してください。”】
新規のブックの場合はブックのパス(場所)を特定したいため、一旦ブックを保存してほしいことをメッセージで伝えます。


4行目【With Application.FileDialog(msoFileDialogSaveAs)】
Application【アプリケーション】オブジェクトのFileDialog【ファイルダイアログ】オブジェクトを使用して
引数のtypeを名前を付けて保存ダイアログに指定して、With【ウィズ】ステートメントで指定します。


5行目【.InitialFileName = ThisWorkbook.Path & “¥”】
With【ウィズ】ステートメントで指定したFileDialogオブジェクトに対してInitialFileName【イニシャルファイルネーム】プロパティ
保存ダイアログに初めに表示される保存パス(場所)を設定します。ThisWorkbookオブジェクトのPath【パス】プロパティでこのプロシージャが記述されているブックの場所に設定します。


6行目【.FilterIndex = 2】
With【ウィズ】ステートメントで指定したFileDialogオブジェクトに対してFilterIndex【ファイルインデクス】プロパティ
保存ダイアログに初めに表示されるファイル保存形式を2の「エクセル マクロ有効ブック(*xlsm)」に設定しています。


7行目【If .Show = -1 Then .Execute】
With【ウィズ】ステートメントで指定したFileDialogオブジェクトに対してIf文(条件分岐)でShow【ショウ】メソッドが-1だったら、つまりダイアログのアクションボタンがクリックされたらExecute【エクスキュート】メソッドでアクションを実行するを定義します。


9行目【With ThisWorkbook.Sheets(1)】
ThisWorkbook【ディスワークブック】プロパティで参照したこのプロシージャが記述されているブックを表すThisWorkbook【ディスワークブック】オブジェクトのSheets【シーツ】プロパティで参照したインデックス番号1のシートをWith【ウィス】ステートメントで指定します。


10行目【.Activate】
With【ウィス】ステートメントで指定した上記のシートに対してWorksheet【ワークシート】オブジェクトのActivate【アクティベイト】メソッドでそのシートをアクティブにします。


11行目【With .Shapes】
Withステートメントで指定した上記のシートの図の集まりを表すShapes【シェイプス】コレクションをWith【ウィズ】ステートメントで指定します。


12行目【If .Count >= 2 Then】
If【イフ】ステートメントを使用しで条件分岐をします。条件式としてWith【ウィズ】ステートメントで指定した図形の集まりを表すShapes【シェイプス】コレクションのCount【カウント】メソッドを使用してジート内の図の数を取得して、比較演算子「>=」
を使用してシート内の図形の数が2個以上の場合を定義します。


13行目【.SelectAll】
シートに図が2個以上ある場合Shapes【シェイプス】コレクションのSelectAll【セレクトオール】メソッドですべての図を選択状態にします。


14行目【Selection.Group.Name = “ロゴ”】
選択されている図をGroup【グループ】メソッドでグループ化しName【ネーム】プロパティで「ロゴ」という名前に設定します。


15~17行目
【Else
.SelectAll
Selection.Name = “ロゴ”】
Else【エルズ】ステートメントで条件に一致しなかった場合、つまりシートに図が1個しかない場合を定義します。図が1個しかない場合はグループ化のメソッドを実行するとエラーになるのでグループ化をしないで、図に「ロゴ」という名前を付けます。


21行目【With ActiveSheet.Shapes(“ロゴ”)】
上記で作成したロゴと名前を付けた図をShapes【シェイプス】プロパティで参照してWith【ウィズ】ステートメントで指定します。


22行目【 .CopyPicture】
With【ウィズ】ステートメントで指定した図を表すShape【シェイプ】オブジェクトの
CopyPicture【コピーピクチャー】メソッドで作成した図を図としてコピーします。


23行目【ActiveSheet.ChartObjects.Add(0, 0, .Width, .Height).Name = “貼付用”】Worksheet【ワークシート】オブジェクトの埋め込みグラフを表すChartObjects【チャートオブジェクツ】オブジェクトのAdd【アド】 メソッドで埋め込みグラフシートを作成します。引数は(シート左位置,上位置,シート幅,高さ)、ここでは(0,0,Shapesの幅,Shapesの高さ)で指定しています。最後にName【ネーム】プロパティでこの埋め込みグラフの名前を「貼付用」に指定しています。


25行目~28行目
【With ActiveSheet.ChartObjects(“貼付用”)
.Chart.PlotArea.Fill.Visible = msoFalse
.Chart.ChartArea.Fill.Visible = msoFalse
.Chart.ChartArea.Border.LineStyle = 0】
埋め込みグラフを表すChartObjects【チャートオブジェクツ】自体を透明設定します。


30行目【Application.OnTime Now + TimeValue(“00:00:03”), “sample2″】ChartObjects【チャートオブジェクツ】を作成直後の画像の貼付けが失敗する可能性があるので指定された時刻 にプロシージャを実行するApplication【アプリケーション】オブジェクトのOnTime【オンタイム】 メソッドでNow + TimeValue(“00:00:03”)現在の時刻から3秒まって次のsample2プロシージャ―に実行を移しています。


32行目【Private Sub sample2()】
Private Sub【プライベートサブ】プロシージャにして30行目のOnTimeメソッドからしか、プロシージャを呼び出せないようにします。


33行目【With ActiveSheet.ChartObjects(“貼付用”)】
With【ウィズ】ステートメントでChartObjects(“貼付用”)を指定します。


34行目【.Chart.Paste】
With【ウィズ】ステートメントで指定されたChartObjects(“貼付用”)に22行目でコピーしてクリップボード保存した図をChart【チャート】オブジェクトのPaste【ペースト】メソッドを使用して貼り付けます。


35行目【 .Chart.Export ThisWorkbook.Path & “¥ロゴ.png”】
グラフを画像として書き出すChart.Export【チャートエクスポート】メソッドで、このブックのパスにロゴ.pngでpng形式の画像ファイルとして書き出します。


36行目【.Delete】
DeleteメソッドでWith【ウィズ】ステートメントで指定したChartObjects(“貼付用”)を削除します。


37行目【 MsgBox ThisWorkbook.Path & “にpngファイルを出力しました。”】
ファイルの書き出しができたことをメッセージボックスで伝えます。

実行結果


以上で、シェイプやワードアートで作成した図を透過画像で書き出す方法の解説を終了します。
ありがとうございました。

スポンサーリンク

関連記事・広告