lisz-works

プログラミングと興味を貴方に

Visioの各ページをPNGで出力するVBAを作ってみた

【スポンサーリンク】

Visio

Visioの各ページをPNGで出力するVBAを作ってみました!

作図したものを他のドキュメントなどで、画像として扱いたいとき力を発揮します!

できること

こんな感じで作った各ページを

Visioの各ページ

このようにPNGファイルとして出力できます。

各PNGファイル

処理の流れ

下記のようなことをしています。

  1. SaveAsWebアドオンを使ってドキュメントのHTML化
  2. HTML付属ファイルとして作られるPNGを規定フォルダへコピー
  3. 出力したHTML関連ファイルの削除

ソースコード

ソースコードは下記か、GitHubでご覧ください。

github.com

ソースを書きたいときは、「Alt+F11」でVisualBasicエディタを開きましょう。

表示を開く

' 画像の保存(HTMLの付属として)
Public Sub SaveImages()
    Dim outputPath As String
    Dim options As String

    outputPath = ThisDocument.path & ThisDocument.Name

    options = "/quiet=True" _
            & " /target=" & outputPath _
            & " /priformat=png" _
            & " /openbrowser=False"

    ' # output file name
    ' xxx.files/png_[N].png
    Application.Addons("SaveAsWeb").Run options

    Call RenameFiles
End Sub

' 保存先ディレクトリの作成
Private Function CreateImgOutputPath()
    Dim imgOutputPath, msg As String
    imgOutputPath = ThisDocument.path & "images" ' "img_" & ThisDocument.Name

    msg = "[False]"
    If Dir(imgOutputPath, vbDirectory) = "" Then
        ' フォルダが存在しない場合、新規作成
        MkDir imgOutputPath
        msg = "[True]"
    End If
    msg = msg & imgOutputPath
    ' return
    CreateImgOutputPath = imgOutputPath
End Function

Private Function GetPngName(num As Integer)
    ' return
    GetPngName = "png_" & num & ".png"
End Function

' ファイルコピー
Private Sub CopyFile(src As String, dst As String)
    Debug.Print (src)
    Debug.Print (dst)
    Call FileCopy(src, dst)
End Sub

' ファイル削除
Private Sub DeleteFile(path As String)
    Call Kill(path)
End Sub

' ディレクトリ削除
Private Sub DeleteDir(path As String)
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject") ' インスタンス化
    Call fso.DeleteFolder(path, True)
    Set fso = Nothing   ' 後始末
End Sub

' ファイル名リネーム
Private Sub RenameFiles()
    Dim i As Integer
    Dim imgOutputPath As String
    Dim outputPath As String
    Dim visioNoExtName As String
    Dim htmlPngPath As String
    Dim ImgPngPath As String
    Dim htmlFile As String

    ' 拡張子なしVisio名
    visioNoExtName = Replace(ThisDocument.Name, ".vsd", "")
    ' HTML上の出力先
    outputPath = ThisDocument.path & ThisDocument.Name & ".files"
    ' 保存先の作成
    imgOutputPath = CreateImgOutputPath()

    ' 現在ページ数分ループ
    i = 1
    For Each Page In ThisDocument.pages
        htmlPngPath = outputPath & "\" & GetPngName(i)
        ImgPngPath = imgOutputPath & "\" & visioNoExtName & "_" & Page.Name & ".png"

        Call CopyFile(htmlPngPath, ImgPngPath)

        Debug.Print (i & "]" & Page.Name & ", " & htmlPngPath)
        i = i + 1
    Next

    ' 不要なものを削除
    htmlFile = ThisDocument.path & ThisDocument.Name & ".htm"
    DeleteFile (htmlFile)
    Call DeleteDir(outputPath)
End Sub

SaveAsWebアドオン

デフォルトで入っている、SaveAsWebアドオンを使いました。

コレを使えば、ドキュメントをHTML化してプレビュー的なHTMLが作れます。

その際に出力される、ページをPNG化したものをゲットします。

普通にVisio作ったHTMLドキュメントも見やすいので、このアドオン自体、割と有能そうな予感。

リボンに開発メニューを追加する

Excelなどと同じで、デフォルトでは「開発」というものがリボンに存在しません。

なのでオプションから追加します。

「ファイル→オプション」を選択。

ファイル→オプション

メニューから「リボンのユーザー設定」を選択。

右側の「メイン タブ」の中にある「開発」にチェックを入れます。

開発をONにする

これで開発タブが解禁されました。

開発タブ

実行方法

リボンの開発タブを開き、マクロボタンを押す。

マクロボタン

ThisDocument.SaveImagesを選択して実行する。

ThisDocument.SaveImagesを実行

ショートカットキーを設定して、いつでも実行できるようにする方が効率的かもしれません。

その際、既存のショートカットキーを潰してしまわない用に注意しましょう。*1

出力ファイル

今回は作成したファイルを

<ドキュメント格納パス>/images/<ドキュメント名>_<ページ名>.png

にまとめるようにしました。

パスを変更したい場合は、RenameFiles()のImgPngPathの設定を変更すれば、出力先が変更できます。

この辺のカスタマイズ性を疎かにしてしまったことは反省点の1つです。

今回学習できたこと

今回学習できた点についてまとめようと思います。

VisioでもVBA意外と組めた

Excel VBAはやったことありましたが、Visioは今回初でした。

ただExcelでやっていたので、調べながらやっていれば、なんてことはありませんでした。

もしかしたら有用なことがもっとできるかも知れないので、調べてみるといいかもしれません。

ファイル/フォルダ操作が意外と容易にできる

調べてみて以外とファイル/フォルダ操作ができるんだなーってことを知りました。

今回は

  1. フォルダ作成
  2. ファイルコピー
  3. ファイル/フォルダ削除
  4. リネーム

なんかを行っています。

今回挙げただけでも、基本的なファイル操作は大体できているので、応用はいくらでも効きそうです。

ただファイルの移動や削除で、存在しないファイルを取り扱った場合、たしかエラーが出ます。

そのあたりをファイル存在チェックと絡めた関数を作ると、なお良いですね。

開発タブ以外と色々できる

直接関係ないんですが、開発タブはONにしておいて損はありません。

オリジナルのシェイプを作ったりできるし、かなり有能です。

なんでデフォルトOFFなんだか謎なレベルです。

参考

コチラを参考にしました。ありがとうございました!

docs.microsoft.com www.moug.net www.moug.net officetanaka.net officetanaka.net www.tipsfound.com www.sejuku.net officetanaka.net

あとがき

Visioの各ページをPNGで出力するVBAを作ってみたでした!

ちょろっと調べて作ってみたら、意外とサクッと作れました。

初Visio VBAでしたが、いい感じです。

キレイ度は微妙かもですが……

よければ参考にしてみてください!

*1:ショートカットキーに疎い人が、たまに変なキーに割り当てて、本来の機能を実行しようとしたときに発狂しそうになったりするぼくみたいな人間もいます。気をつけましょう。