miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

選択範囲を画像ファイルに保存する

今回、Excel で書かれた表を画像化する必要があったのですが、

で公開されている「PictureSave / Excel 画像ファイル保存」を利用させていただきました。

手作業で使うぶんにはいいんですが、今回は数十枚の画像を作成する必要があったので、そのあたりについてです。

動作原理

Excel には「図のコピー」機能があります(Shift を押しながら「編集」メニューを開くと出るやつです)が、この機能でコピーされたクリップボードのデータをファイルに格納しているようです。

モジュールは VBA だけで記述されていて、内部的には

Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long

のように宣言した WindowsAPI を律儀に叩きまくってる感じです。VB6 の頃はこういうのもよく見ましたが、VBA でここまでやってるのは初めて見ました・・・。

バッチ処理用の変更

ということで非常に助かるのですが、このプログラムはインタラクティブな操作が前提で、オプション指定や経過表示で MsgBox() がよく使われています。

これだとバッチ処理に使えないので、

  • SavePicture() をファイル名や枠線の表示/非表示を指定できるよう変更
    • 紛らわしいのでこの処理は SavePictureEx() という名称に変更
  • デフォルトで OK を返す MyMsgBox() というのを作って、エラー通知以外の MsgBox() はこの関数の呼び出しに変更

して使っています。

パッチを gist に置いておきます。

初回コミットは Shift_JIS で上げていますが、二回目のコミットで diff が色分けされるように UTF-8 で上げなおしています。もし .patch を取得する場合は、初回のものを利用するか、取得したファイルの文字コードShift_JIS に変更して適用してください。

今回利用しているのはピクチャを画像として保存する部分のみですので、それ以外のところはうまく動作しないかもしれません。ご了承ください。