Word、Excelなど保存したあと、メールに添付したり、ファイルサーバーに保存するときに、zip形式で保存することってありませんか。エクスプローラーの「送る」で、簡単にzipに形式に保存できるので、それほど面倒ではないのですが、編集後、保存と同時にzip保存できるならその方が、場合によってはありますよね。今回は、VSTOで使える.NETを使って紹介したいと思います。
プロジェクト名は、今回は「ExcelZipSaveAddIn」とします。今回はアドインを作成しますよ。VBAでアドイン作ったことある人「シーン」私の周りにはいません。作成したことある人なら、分かるのですがテンプレートを使って作成します。テンプレートって本当に便利なのですが、ネットにある雛形以外に、オリジナルのテンプレートを作成したり使ったことがない人が多いですよね。なじみが、ないからといって、難しいわけでは特にありません。VSTOのアドインは、もしかしたら、VBAより「やさしい」かも知れません。今回は、.VBAは、まったく登場しません。.Net基本を兼ねて紹介になります。本当に簡単なので、参考にしてみてください。
いつものように、新規作成からプロジェクトを選んで、
今回は、Excelのアドインを選んでみました。Wordでも作成方法は、同じですよ。名前は「ExcelZipSaveAddIn」としました。今回の仕様は、保存と同時に同じファイル名で、zipファイルを作成するだけの簡単なものを作成します。
ソースを開くといつものように、Startup() とShutdown()が作成されます。
Public Class ThisAddIn Private Sub ThisAddIn_Startup() Handles Me.Startup End Sub Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown End Sub End Class
今回は、ここにイベントを追加します。保存後に処理したいので、WorkbookAfterSaveを追加します。イベント名はVBAとここは同じです。追加方法を紹介します。
Application(ここではExcel)を選択してから
イナズママークから、WorkbookAfterSaveを選択して下さい。イベントの追加は、簡単ですので、コツを掴んで慣れてください。
追加されてコードは、こちら、
Private Sub Application_WorkbookAfterSave(Wb As Microsoft.Office.Interop.Excel.Workbook, Success As Boolean) Handles Application.WorkbookAfterSave End Sub
ここに、処理を書いていきたいと思います。今回は、ZipArchive クラスを使って作成します。クラスといっても関数と同じなので、VBAで作成されたことのある方なら、難しくありません。
イベントの引数に、Successとあります。これは、失敗か成功かってことなので、保存が成功した場合のみ作成したいので、
If Success = True Then End If
上記を追加しました。Wbは、保存したファイルの情報の中身があるので、こちらの情報を使ってファイル名とファイルの保存先のPATH名を取得したいと思います。
Wb.Name ‘ファイル名 Wb.Path ‘PATH名
PATH名とファイル名が分かったので、zip名は、決まりましたね。
Dim zipPath As String = Wb.Path & “\” & Path.GetFileNameWithoutExtension(filename) & “.zip”
Path.GetFileNameWithoutExtensionは、拡張子を除いたファイル名が取得できます。右からドッドのところまで探してなんてしなくていいんですよ。
Using archive As ZipArchive = ZipFile.Open(zipPath, ZipArchiveMode.Update) archive.CreateEntryFromFile(filename, filename) End Using
上記では何をやっているかと言うと、先ほどのzipを作成して、ファイルをそこに追加するイメージです。Using End Usingとありますが、こちらは、ファイルの後処理を上手にやってくれます。ここでは、とりあえずコードの通り、作成してみてください。
実は、このままだと、必ず失敗します。なぜかと言うと、Excelが保存したファイルを使ってますよって叱られます。そこで、保存したファイルを一時フォルダーにコピーして、そのを使って、処理するように作成します。で、作成したコードは、こちら
Public Class ThisAddIn Private Sub ThisAddIn_Startup() Handles Me.Startup End Sub Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown End Sub Private Sub Application_WorkbookAfterSave(Wb As Microsoft.Office.Interop.Excel.Workbook, Success As Boolean) Handles Application.WorkbookAfterSave If Success = True Then Dim filename As String = Wb.Name 'ファイル名 Dim zipPath As String = Wb.Path & "\" & Path.GetFileNameWithoutExtension(filename) & ".zip" '保存したいzip名 Dim tempPath As String = Path.GetTempPath() '一時フォルダ場所 System.IO.File.Copy(Wb.Name, tempPath & Wb.Name, True) '一時フォルダに上書きコピー 'ZIP作成 Using archive As ZipArchive = ZipFile.Open(zipPath, ZipArchiveMode.Update) archive.CreateEntryFromFile(tempPath & filename, filename) End Using System.IO.File.Delete(tempPath & filename) '一時フォルダからファイルの削除 End If End Sub End Class
実行すると、Excelが立ち上がって来ます。編集後、保存ボタンを押すと、同じフォルダーにzipファイルも作成されます。アドインなので、どのファイルに対しても、実行されます。作成されたものは、COMアドインとして実行します。使い続けるには、問題ないのですが、削除した場合、Excel側で簡単に出来ます。知らない人もいるかも知れないので、紹介したいと思います。Excelのオプションからアドインを選択する
管理(A)からCOMアドインを選んで設定ボタンを押して
先ほど作成した、ExcelZipSaveAddInのチェックボック又は、削除ボタンで解除できます。
話は変わって、Visual Studio 2013 Previewが出ています。興味があるかたは、評価を兼ねてダウンロードしてみてください。近々横浜でExcelユーザーのAccessデーターシート活用の講座を開く予定でいます。内容は、AccessをAccessらしく使わない講座になります。なにそれって感じですが、Excel共有でこまっているとか、フィルター処理がどうも重い、データベースを使うまでは、などExcelでこまっていることをAccess2013を使って紹介したいと思います。併せて、VBAの入門講座も予定しています。現場で知りえた情報満載です。リクエストも引き続き募集中です。
宣伝で恐縮です。夏にも負けない、プロフェッショナル向けオリジナルパソコン販売中です。VisualStudioも是非買ってください。