.xla ファイル内のコードのみを使用して Excel VBA からファイルを GZip 圧縮するにはどうすればよいですか?
質問
Excel VBA 関数でファイルを GZip 圧縮できる必要があります。具体的には、「deflate」アルゴリズムを使用できるようにする必要があります。
コマンドラインアプリケーションを実行せずにこれを行う方法はありますか?外部ツールに依存しないため、コードはより堅牢になります。
理想的には、コードはプリインストールされた VBA または COM ライブラリ関数を利用します。このロジックを自分で実装したり、DLL などをインストールしたりする必要はありません。
可能であれば、利用可能な Excel アドインに .xla を追加するだけで関数のインストールを簡単にしたいと考えています。DLL、EXE、レジストリエントリなどはありません。必須。
編集 これを行うために .NET GZipStream を利用できますか?
解決
VBA(実際にはVB6の方言です)は、この種のアプリケーションでは低速です。かつてVB6とCにShannon-Fanoアルゴリズムを実装したことを覚えています。Cバージョンは、DLLMainに変換され、コマンドライン実行可能ファイルではなくそこから呼び出された後でも、約10倍高速でした。
圧縮サービス(オープンソースとシェアウェアの両方)を提供する多くのCOM DLLがあり、それらのいくつかはGZIPのdeflateアルゴリズムを実装しています。あなたに代わって圧縮を行うために、VBAコードからそのようなDLLから1つの関数を呼び出すだけで本当に簡単になります。
アプリケーションの外部の何かを使用することに消極的であることは理解していますが、この場合、パフォーマンスのために例外を適用する必要があるかもしれません。
あなたの楽しみを完全に台無しにするために、windows \ system32のZIPFLDR.DLLファイルを調べてください。次のリンクもご覧ください:
- これは、VB.NETから(WindowsのビルトインZIP機能を使用してzip圧縮する)必要なことを行う方法の例です。VBAやVB6とそれほど変わらないはずです。 DLL呼び出しを使用した透明なZIP
- これには、Windowsビルトイン機能を使用してzip(もちろんGZIP形式ではなくZIP)を使用するVB6のサンプルアプリケーションがあります: Windows XPの使用" Compressed Folder" .zipファイルで動作するシェル拡張機能
グーグルを介して両方を発見した場合、より多くの/より良い例を見つけることができるはずです。
他のヒント
OK、答えがあります。
zlibは、実装したくないdeflateアルゴリズムを書いた人によって書かれたライブラリです。 win32 DLLが利用可能です。 Windowsからの使用に関するFAQは次のとおりです。
http://www.zlib.net/DLL_FAQ.txt
質問7を確認してください。著者はWindowsユーザーにはあまり熱心ではないようで、VBユーザーにはまったく熱心ではないようですが、ライブラリを提供するのに十分な限り、残りはできます。 。
これがあなたを助けるのに十分であれば、素晴らしいことです。 VBAからCライブラリを呼び出す際にヘルプが必要な場合は、コメントを追加してください。私は何年もVBからCへの呼び出しを行っていません。楽しそうです。
ワインのボトルを開けたいようですが、ボトルオープナーの使用は絶対に拒否します。ファイルのGZippingを許可するVBA関数がない限り、dllやexeファイルなどの外部リソースがないとジョブを実行できません。
誰かがサードパーティのソフトウェアに依存せずにファイルを圧縮したい場合、通常はそれをCOMオブジェクト/ DLLとして実装し、Excel以外にも利用できるようにします。 zip機能をExcelに組み込みたい場合は、サードパーティのツールを使用するため、アルゴリズムを再実装する必要はありません。あなたは潮に逆らって泳いでいます。ただし...
http://www.cpearson.com/excel/SaveCopyAndZip.htm
2つのバージョンがあります。 COMアドインバージョン" ...を使用すると、ディスクに保存されているすべてのブックを圧縮できます(ただし、保存されていない状態の可能性があります)。 Moonlight Softwareコンポーネントに依存していますが、すべてのコンポーネントとセットアップはインストーラーに含まれています。完全にパブリックドメインではありませんが、ライセンスはGPLよりも制限が少なくなっています。最終結果は、Excelアドイン(サードパーティコンポーネントを使用)です。
しかし、本当に外部ツールに依存したくない場合は、圧縮アルゴリズムを自分で実装するか、Microsoftがその機能をWindowsに組み込み、Excelで公開するまで待つ必要があります。
これが役立つことを願っています。
VBA でアルゴリズムを実装する場合は、(VBA で) スプレッドシートを保存し、VB の I/O 関数を使用してファイルを開いて、圧縮し、再度保存する必要があります。あらゆる意味で、ファイル上で動作する通常の VB アプリケーションを作成するのと同じです。「ファイル使用中」タイプのエラーを避けるために、VBA マクロを別のブックに配置する必要がある場合がありますが、ファイルを読み取り専用として再度開き、別のファイル名で保存すれば、すべてを 1 つのブックに保存しても問題ありません。
しかし、VBA 内から gzip にシェルアウトする方が機能的には同じで、無限に簡単であることはほぼ確信しています。
編集: いくつかのコード。実行すると失敗しなかったので、すべてを同じブック内に保持しても問題ありません。
Sub main()
ActiveWorkbook.Save
Open "macrotest.xls" For Binary Access Read As #1
Open "newfile.zip" For Binary Access Write As #2
'do your stuff here
Close #2
Close #1
End Sub