• ベストアンサー

VBAを使ってファイルを圧縮したい

こんばんは。 他の方の質問ですが http://oshiete1.goo.ne.jp/qa2405614.html を参考にVBAでエクセルファイルの圧縮に挑戦しています。 しかしうまくいきません。 なのでご教授お願いします。 エクセルの標準モジュールに 下記のコードを載せました。 //////////////////////////////////////////////////////////////////////// 'Option Explicit Private Declare Function Zip Lib "Zip32j" (ByVal hWnd As Integer, ByVal szCmdLine As String, ByVal szOutPut As String, ByVal dwsize As Integer) As Integer Private Declare Function FindWindow Lib "USER32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Sub testZip() 'Zip32 による圧縮 Dim Filename As String Dim strArchiveName As String Dim strCommand As String Dim RC As Long Dim hWnd As Long Dim strOutPut As String * 512 Dim lngSize As Long 'ハンドル取得 hWnd = FindWindow("XLMANI", Application.Caption) 'ファイル名取得 Filename = myDeskTopPath & "\Book1.xls" If Filename = "False" Then Exit Sub Filename = Mid$(Filename, InStrRev(Filename, "\") + 1) strArchiveName = Mid$(Filename, InStrRev(Filename, "\") + 1, InStrRev(Filename, ".") - InStrRev(Filename, "\") - 1) & ".zip" strCommand = "-u " & strArchiveName & " " & Filename lngSize = Len(strOutPut) RC = Zip(hWnd, strCommand, strOutPut, lngSize) 'Debug.Print strOutPut End Sub Function myDeskTopPath() ' 実行時の デスクトップパス取得 Dim MyWSH As Object Set MyWSH = CreateObject("WScript.Shell") myDeskTopPath = MyWSH.SpecialFolders("Desktop") Set MyWSH = Nothing End Function //////////////////////////////////////////////////////////////////////// そして「Zip32j 」がないので http://www.vector.co.jp/soft/win95/util/se062163.html からダウンロードしました。 しかし、 「 RC = Zip(hWnd, strCommand, strOutPut, lngSize)」 の部分で、 「ファイルが見つかりません。 (Error 53)」 になります。 ダウンロードした「zip3j037」はフォルダごとデスクトップに置いています。 ただこれをダウンロードしただけではダメなのでしょうか? エラーの原因がわかりません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 そのコードの作者です。すでに、もうご指摘がありますが、 >ダウンロードした「zip3j037」はフォルダごとデスクトップに置いています。 まず、以下に二つのファイルがなくてはなりません。 C:\WINDOWS\system32\ZIP32J.DLL <--- 今回、ダウンロードしたファイル C:\WINDOWS\system32\zip32.dll <---- Zip解凍用の本体 ここをお読みください。 http://www.csdinc.co.jp/archiver/lib/zip32j.html Common Archiver Library: ZIP32J.DLL '------------------------------------------- 'ファイル名取得 Filename = myDeskTopPath & "\Book1.xls" 別に決まった内容なら、特に、問題はありませんが、 Filename = Application.GetOpenFilename("テキストファイル*.txt(*.txt),*.txt") If Filename = "False" Then Exit Sub この二行でセットになります。 後は、問題はないはずです。

zxdaeg
質問者

お礼

Wendy02さん!ありがとうございます!! 早速zip32.dlもダウンロードして、C:\Windows\System32へ入れました。 そし同じように Filename = Application.GetOpenFilename("テキストファイル*.txt(*.txt),*.txt") If Filename = "False" Then Exit Sub でやってみたらエラーにならずに終了しました!! 確認したらちゃんと圧縮されています! エクセルファイルで試してみても成功です! Wendy02さん、mitarashiさん 本当にありがとうございます!

その他の回答 (2)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1です。Zip32jのマニュアルをみると、 【インストール】 このZIP32J.DLLをWINDOWSのSYSTEMフォルダ(C:\WINDOWS\SYSTEMなど)にコピーしてください。 必要に応じて次のファイルもWINDOWSのSYSTEMフォルダにコピーしてください。 1.ZIP32.DLL(Ver2.3以降) - 絶対に必要 (後略)とあります。 乗りかかった船で、ZIA32.DLLと、ZIP32J.DLLを、今使っているPCはWindows2000なので、System32フォルダーにコピーして実行してみると、何も起こらず終了するので、 Debug.Print strOutPut のコメントアウトを外してみると、 zip warning: name not matched: Book1.xls zip warning: Book1.zip not found or empty が表示されました。 ハンドル取得が、XLMANIになっているのに気付き、"XLMAIN"に直してみると、(これは、http://oshiete1.goo.ne.jp/qa2405614.htmlからそうなっています) RC = Zip(hWnd, strCommand, strOutPut, lngSize) のところでオーバーフローのエラーが発生しました。 元の質問への回答に、ショートファイルネーム云々の記述があったので、"C:\Book1.xls"で試験してみましたが、同様でした。 あとは、元の質問への回答者である、Wendy02さんのご出馬をお待ち下さい。

zxdaeg
質問者

お礼

再度ありがとうございます!!! 私も同じ様にやってみたら、私も同様にオーバーフローしました。 しかしDebug.Print strOutPutを見てみると、何も表示されません。 ローカルウインドウで見ても同じなので、「strOutPut」の部分にカーソルを当ててみると、"・・・・・・・・・・・・・・・・・・・・・・"となっています。 うーん、難しいですね~ Wendy02さん、来てくれないかな~(わくわく)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

Zip32jを使った事は無いので、一般論ですが、 1.Declare <中略> Lib "Zip32j"のところで、デスクトップの絶対パスを指定するか、 Lib "C:\Documents and Settings\?????\デスクトップ\?????.dll" 2.DLLをシステムフォルダーに放り込むか、 3.環境変数PATHを設定してやる 必要があると思います。

zxdaeg
質問者

お礼

早速のご回答ありがとうございます。 1のやり方で Declare Function Zip Lib "Zip32j"を Declare Function Zip Lib "C:\Users\ユーザーアカウント名\Desktop\zip3j037\Zip32j"にしても質問時と同じエラーでしたが Private Declare Function Zip Lib "C:\Users\ユーザーアカウント名\Desktop\zip3j037\Zip32j\ZIP32J.DLL" にしたら、 「can't load ZIP32.DLL」 というエラーになりました。 2については システムフォルダーとはどこのフォルダに入れればいいのでしょうか? (無知ですいません) 3は、もっと難しそうです、、、