VBAでファイルを圧縮する方法とエラー対処法

このQ&Aのポイント
  • VBAを使用してファイルを圧縮したいが、エラーが発生する
  • 参考にしたページのコードをそのまま使用し、ファイル名を変更したがエラーが解消されない
  • 必要なDLLファイルが正しい場所に配置されているか確認する必要がある
回答を見る
  • ベストアンサー

ファイルをvbaで圧縮したいのですが

http://okwave.jp/qa/q5155002.html を参考にしているのですが、リンク先の型と同じく「ファイルが見つかりません。 (Error 53)」になります。 当方の環境は、win764bit、エクセル2007です。 コードはリンク先のものをそのままエクセルにコピペしました。 'ファイル名取得 Filename = myDeskTopPath & "\test.xlsm" だけ変更しました。 ZIP32J.DLL zip32.dll  が必要とのことなので、 http://www.vector.co.jp/soft/win95/util/se062163.htmlhttp://www.csdinc.co.jp/archiver/lib/zip32j.html の zip232dN.zip(http://homepage3.nifty.com/csdinc/archiver/lib/zip232dN.zip) を落として、C:\WINDOWS\system32に入れました。 しかしエラーになります。 RC = Zip(hWnd, strCommand, strOutPut, lngSize) のエラー時の値は、 hWnd→0 strCommand→-u test.zip test.xlsm(デスクトップにあります) strOutPut→についてはイミディエイトウインドウで「?strOutPut」しても何も表示されません。 しかしstrOutPutにカーソルを充てると"・・・・・・・・"となっています。 lngSize→512 です。 OSが64bitだと無理なのでしょうか? パソコンに詳しくないのですが、もしかしてC:\WINDOWS\system32ではないフォルダに ZIP32J.DLL zip32.dll を入れるのでしょうか? ご教授よろしくお願いします。

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

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.1

#当方 64bit の Excel を持っておりませんので、検証はしておりません。 【1】-------------------- >「ファイルが見つかりません。 (Error 53)」になります。 >もしかしてC:\WINDOWS\system32ではないフォルダに >・・・入れるのでしょうか? ●ChainLP V0.40-16 http://no722.cocolog-nifty.com/blog/2012/11/chainlp-v040-16.html に、 >64bit-OSの場合は、dllのコピー先はC:\System\System32ではなく、 >C:\System\SysWOW64になりますので、注意して下さい。 と出ていますので、恐らく、「C:\System\SysWOW64」の方にコピーしたらイケるのではないかと思われます。  ただし、 ●x64版で利用できる x64版アーカイバ DLL について http://www.ponsoftware.com/archiver/help/X64DLL.htm には、 -- ここから引用 --------------------------------- 【注意(Windows 64bit版をお使いの方)】 64 ビット版 DLL を共有利用する場合の導入先は、\Windows\System32 です。 32 ビット版 DLL を共有利用する場合の導入先は、\Windows\SysWow64 です。 お間違えのない様、ご注意ください。 -- ここまで引用 --------------------------------- と出ていて、前記と全く逆のことが書かれていますので、「共有利用」という意味が、私には解りませんが、何でしたら、「System32」と「SysWow64」の両方に入れてみられてはいかがでしょうか? 【2】-------------------- >当方の環境は、win764bit、エクセル2007です。 >OSが64bitだと無理なのでしょうか? ●unzip32.dllの利用について(64bit) http://okwave.jp/qa/q7267931.html に、 -- ここから引用 --------------------------------- 「64bit版のアプリケーションからDLLを使用する」場合には、64bit版のDLLが必要になります。 ですが、64bit OS でも「32bit版のアプリケーションから使う」場合に必要なのは32bit版のDLLです。 > Windows7(x64)では、動作している ということは、質問者さんが作っているのは32bitアプリケーションということですね。それなら今間のままでも問題ありません。 -- ここまで引用 --------------------------------- と出ていますので、OSではなくて、アプリケーション(Excel2007)の方の bit が問題のようです。  したがって、sfdasdfagweさんがお使いの Excel2007 が 32bit なら、【1】をお試しください。  Excel2007 が 32bit か 64bit かは、下記によりご確認ください。 1)[Alt] + [Ctrl] + [Delete] を押下して [Windows タスク マネージャ] を開きます。 2)[プロセス] タブ をクリックします。 3)[イメージ名] の列に表示されている「EXCEL.EXE」が「EXCEL.EXE」と表示されていれば 64bit、「EXCEL.EXE *32」と表示されていれば 32bit になります。 【3】--------------------  前述のように「EXCEL.EXE *32」の場合は、dll のコピー先を移動(複写)するだけでイケるように思われますが、「EXCEL.EXE」、つまり 64bit だった場合は、 >「64bit版のアプリケーションからDLLを使用する」場合には、 >64bit版のDLLが必要になります。 とのことですので、「ZIP32J.DLL」・「zip32.dll」のそれぞれの 64bit版 が必要なのではないかと思われます。  名前だけみると「ZIP64J.DLL」・「zip64.dll」かなと思われますが、ザクッとググってみると、「zip64.dll」はあるようですが、「ZIP64J.DLL」の方がないようです。  ただ、 ●「ZIP64J.DLLが見つかりません」というエラーが出た場合の対処法 https://mobile.twitter.com/tomoyapp/statuses/167313539709681664 >.Pを押して圧縮ファイル名を入れるところでAlt-Zを押すと >圧縮用DLL切り替えが可能.7z.dllが入ってるなら,それを選べばOK. とのことで、「7z.dllが入ってるなら」イケるかも知れません。 http://www.google.co.jp/search?q=7z.dll+64bit #繰り返しますが、 #当方 64bit の Excel を持っておりませんので、検証はしておりません。

sfdasdfagwe
質問者

お礼

どうもありがとうございました。

その他の回答 (1)

回答No.2

こんにちは。 私も、64bit PCでは試すことが出来ないし、細かい所は試していませんが、 http://okwave.jp/qa/q2405614.html そもそも、元のログは、「ファイル名取得」を複雑に書いたので意味が伝わらず、それ読んだ利用者が割愛したから、ファイル名が見つからないという話になったのだと思います。 >strCommand→-u test.zip test.xlsm(デスクトップにあります) test.xlsm で、デスクトップとは何でしょうか? 例えば、決め打ちで、「C:\Users\[User Name]\Desktop\test.xlsm」 とか、いうのではないでしょうか? >hWnd→0 それと、そもそも、元のコードは、Excel 2003以下でも利用させるものですから、 hWnd = FindWindow("XLMANI", Application.Caption)の、FindWindowはいらないですよね。 hWnd = Application.Hwnd で取れるはずです。FindWindowを使うかどうかは、どちらでも良い話ですが。 C:\WINDOWS\system32 に入れる・入れないはそんなに重要ではないと思います。 パスの通った所に、入れればよいだけの話です。ただ、反応が速いか遅いかの違いだと思います。

sfdasdfagwe
質問者

お礼

どうもありがとうございました。

関連するQ&A

  • 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」はフォルダごとデスクトップに置いています。 ただこれをダウンロードしただけではダメなのでしょうか? エラーの原因がわかりません。 よろしくお願いします。

  • 解凍で出てきたzip32.dll以外のファイル

    zip32.dllのファイルzip232dN.zipを http://www.csdinc.co.jp/archiver/lib/zip32j.html からダウンロードし解凍したところ、たくさんのファイルが出てきまました。 (1) zip32.dll以外のこれらのたくさんのファイルは、zip32.dllの作動に必要なのでしょうか。 (2) zip32.dll以外のこれらのたくさんのファイルは、zip232dN.zipを解凍したフォルダに置いておかないとzip32.dllは作動しないのでしょうか。

  • VBAで複数のエクセルファイルを自動圧縮

    VBAで複数のエクセルファイルを自動圧縮 お世話になります。 以下サイトなどを参考にVBAでエクセルファイルの圧縮をさせようとしています。 ダイアログで圧縮したいファイルを指定して圧縮するところまではできました。 http://oshiete.hmv.co.jp/qa5155002.html ■やりたいこと 特定のフォルダにある複数のファイルを個別に圧縮して、それぞれzipファイルとしたい。 圧縮するファイルを指定するダイアログは出さずに、自動化したい。 ■VBAの記述 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 Dim strPassWord As String strPassWord = "pass" 'ハンドル取得 hWnd = FindWindow("XLMANI", Application.Caption) '★ファイル名取得★ Filename = Application.GetOpenFilename("*.xls(*.xls),*.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 = "-uP " & strPassWord & " " & strArchiveName & " " & Filename lngSize = Len(strOutPut) RC = Zip(hWnd, strCommand, strOutPut, lngSize) ■質問  ファイル名を毎回変えて繰り返し処理すればいいと考えてますが、  圧縮するファイルを指定するダイアログを消すことができません。。。  ファイル名を以下のように直接指定しましたが、以下エラーが出てしまいます。  VBAで取得したファイル名で圧縮するような記述の仕方があればご教示いただけると助かります! '★ファイル名取得★ Filename = Application.GetOpenFilename("*.xls(*.xls),*.xls") If Filename = "False" Then Exit Sub   ↓以下に変更したがエラー  Filename = "C:\" & "test.xls" ←とりあえずファイル名を固定で指定したつもり。。  ●イミディエイトに表示されるエラー   zip warning: name not matched: test.xls   zip warning: test.zip not found or empty

  • エクセルVBA実行時のエラー:DLLファイルが見つ

    タイトル:エクセルVBA実行時のエラー:DLLファイルが見つかりません  質問させていただきます。どうぞよろしくお願いいたします。 環境:PC1~3の全てが、Excel2010、Win7になります。 初めてVBAから読み込むためのDLLファイルを作成いたしました。    PC1上で動作確認できている2つのファイル(Test4.dll(VC++2013にて作成)と それを呼び出すVBAのついたエクセルファイル)を、 PC2とPC3に移動し、VBAを実行しましたところ 何故かPC3でのみ下記エラーが発生いたします。 >実行時エラー'53' >ファイルが見つかりません。Test4.dll ・2つのファイルは同じフォルダ内で実行しております。 ・VBAのカレントパスは   ChDrive Left(ThisWorkbook.Path, 1)   ChDir ThisWorkbook.Path で変更しております。  試しにC:\Windows\System32と C:\Windows\SysWow64にも Test4.dllをコピペしてみましたが、同じエラーが出てまいります。 ・PC3のみ違うところを探してみましたが、思いつくのは下記くらいでございます。   1.VSが入っておりませんでした。(必要なのでしょうか??)   2.実行しているパスが違います。     PC1とPC2の実行パス:      D:\Users\Administrator\Documents\VBA_TEST     PC3の実行パス:      D:\Documents\VBA_TEST              もし何か原因として思いつかれる事がございましたらお教えいただけないでしょうか。 お詳しい方がいらっしゃいましたら何卒よろしくお願いいたします。

  • DLL内からの外部変数の参照

    BCC(フリーコンパイラ)で、WindowsAPIを使った プログラムを作成しています。その過程で、DLLを 作成しているのですが、 test.c を、 bcc32 -WD test.c とし、test.dllを作成しました。 さらにそれを、 implib test.lib test.dll で、test.libを作成ました。 ところが、おなじtest.cファイルで、ほかのファイル の変数を参照しようとして、extern HWND hWnd と書き加えたところ、bcc32 -WD で、参照先が見つか らないというエラーが起こり、DLLが作成できなく なってしまいました。 DLL内から外部の変数を参照するにはどうしたらよいで しょうか。この場合の外部の変数というのは、WinMain 関数のあるmain.cファイル内の静的変数です。 よろしくお願いいたします。

  • 圧縮ファイル開くとブルースクリーン

    最近、なぜかブルースクリーンによくなります。 なにもしてないときもなるのですが、確実になるのは圧縮ファイル(.zipなど)を開こうとしたらなることが多いです。 それと関係してるのかどうかわからないですけど。 起動時にいつもC:\WINDOWS\system32\bghdc.dllを読み込み中にエラーが発生しました。といつも出ます。 やっぱりスパイウェアかウイルスなんでしょうか?

  • メール

    VBから変数Aを本文に自動的に貼り付ける方法を教えてください。 なお下は以前開発したものです。応用して使えるでしょうか? Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long, ByVal ipopperation As String, ByVal lpfile As String, _ ByVal lpparameters As String, ByVal lpdirectory As String, ByVal nshowcmd As Long) As Long --------- Private Sub ??_Click() Dim LngReturn As Long Dim StrCommand As String StrCommand = Trim$(Text_mail_pc) If LCase(Left(StrCommand, 7)) <> "mailto:" Then StrCommand = "mailto:" & StrCommand End If LngReturn = ShellExecute(Me.hwnd, "open", StrCommand, vbNullChar, vbNullChar, Sw_Shownormal) End Sub ---------- ※↓のVBの質問とは全く関係ありません。

  • エクセルVBAでエラーが出る原因を教えて下さい

    Sub テスト() Workbooks("テスト1.xlsm").Worksheets("転記").Range("C3:J7").value = _ Workbooks("テスト1.xlsm").Worksheets("データ1").Range("C3:J7").value End Sub ↑これではデータ1シートのC3:J7の文字や数字だけが転記シートのC3:J7にコピーされるだけで、 セルの色や罫線、フォントの大きさや色、などの設定情報が無視されてしまいます。 なので、文字や数字だけでなく設定情報もコピーできるように ↑のコードを↓のコードに修正していました。 Sub テスト() Workbooks("テスト1.xlsm").Worksheets("転記").Range("C3:J7").PasteSpecial Paste:=xlPasteAll, _ Operation:=xlPasteSpecialOperationNone = _ Workbooks("テスト1.xlsm").Worksheets("データ1").Range("C3:J7").PasteSpecial Paste:=xlPasteAll, _ Operation:=xlPasteSpecialOperationNone End Sub しかし、エラーがでてしまいます。なぜなのでしょうか?

  • エクセル2007リボンカスタマイズ後開かない

    リボンに自作タブを作成 手順 1)TEST.xlsm作成 2)拡張子変更 TEST.xlsm→TEST.zip 3)フォルダ作成、XMLファイル作成(自作タブ用) 4)Zipフォルダ内の.relsファイルの編集(3のリレーション追加) 5)XMLファイル(3)のフォルダごと)をZipフォルダ内へ移動 6)拡張子変更 TEST.Zip→TEST.xlsm 7)TEST.xlsmを開く 7)でエクセル開かず、エラーが出ます 「Excelでファイル'TEST.xlsm'を開くことができません。 ファイルの形式またはファイル拡張子が正しくありません。 ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを 確認してください」 と出ます。 ひとつのPCで作成しています。 至急お助けください!!

  • 自作DLLをエクセルVBAで使用したい

    こんにちは。 自作DLLをエクセルVBAで使用したいのですが、知識不足でうまく動かせません。どうぞお知恵をお貸しください。 例えば足し算をするCのプログラムを以下のように作ります。ファイル名は"wa.c"とします。 #define EXPORT __declspec(dllexport) __stdcall EXPORT double wa(double a,double b) { return(a+b); } これをコンパイルして、DLLファイル"test.dll"を作ります。 gcc -shared -o test.dll wa.c エクセルVBAのモジュールには次のように記述しました。 Declare PtrSafe Function wa Lib "test.dll" (ByVal a As Double, ByVal b As Double) As Double ここで作成した関数をワークシート関数として呼び出したいのですが、ワークシート上での返り値は常にゼロになってしまいます。例えば、ワークシートのセルに"=wa(1.2,3.5)"と記入すると、"4.7"を返してほしいところですが、ゼロとなってしまいます。ワークシート関数として正しく動作させるにはどうしたらよいでしょうか? ちなみに、この関数をエクセルVBAのサブルーチンで使うことはできます。例えばこんな感じです。 Sub test() x = 1.2 y = 3.5 Call MsgBox(wa(x, y)) End Sub また、上記の"test.dll"を他のCのプログラムから呼び出すことも正しくできます。 なお、64bitのエクセルを使っています。Cのコンパイラも64bitです。 どうぞよろしくお願いいたします。

専門家に質問してみよう