質問

Window(XP,2003等)標準機能の「ZIP圧縮・展開」をVBに組み込めますでしょうか?

VBで、圧縮ファイルを展開する、ということをしたいのですが、
ネット上に沢山サンプルがある「外部DLL(unzip32.dllなど)を使用する」という方法は、
使用条件によっては外部DLLのライセンスの問題が絡んでくるようですので、
Windowsの標準機能を組み込めないか?と考えたところです。
Windowsの標準機能、と記載しましたが、
 ・ファイルを右クリック→送る→圧縮(zip形式)フォルダ
 ・ファイルを右クリック→送る→すべて展開
のことを指しました。

ご指導よろしくお願いいたします。

通報する

回答 (3件)

>引数「vDestination」がStringだとエラーになるようで、
その通りです。

VBScriptだと逆にStringで切ってあげないといけないのですが、Object以外の型を持つ言語では、Stringで渡すと逆にダメという状態になります。


VBScriptはStringで渡すことによって、最も適したObject型に自動キャストされます。
VBからStringで渡すと、Stringのままオブジェクト扱いされてしまいます。


サンプルは参照設定をしているので、用意されているメソッドが入力候補に現れます。
暇なときにでも、一度試されることをお勧めいたします。


少しのアドバイスでサンプルも見つけ、独自に理解されていくタイプの方のようですね。
スキルの高さを感じました。

がんばってください。

業務放棄の現実逃避者より

VB6用に作ってみました。
予期せぬ系は無視です。

Private m_objFso As Scripting.FileSystemObject
Private m_objShell As Shell32.Shell

Private Sub Command1_Click()
  Dim l_colPrm As New Collection
  l_colPrm.Add ("C:\WINDOWS\しゃくなげ.bmp")
  l_colPrm.Add ("C:\WINDOWS\シャボン.bmp")
  
  Call 圧縮("C:\test.zip", l_colPrm)
  
  Call 解凍("C:\test.zip", "c:\")
  
End Sub

Private Sub Form_Initialize()
  Set m_objShell = New Shell32.Shell
  Set m_objFso = New Scripting.FileSystemObject
End Sub
Private Sub Form_Terminate()
  Set m_objFso = Nothing
  Set m_objShell = Nothing
End Sub

Private Sub 圧縮(p_strZipPath As String, p_colPrm As Collection)
  '空ZIP作成
  Call CreZipNull(p_strZipPath)

  '書庫に追加していく
  Call CreZip(p_strZipPath, p_colPrm)
End Sub

Private Sub 解凍(p_strZipPath As String, p_strOutPath)
  Dim l_objZIP    As Shell32.Folder
  Dim l_objZIPItem  As Shell32.FolderItem
  Dim l_objOut    As Shell32.Folder

  '書庫オブジェクトを取得する
  Set l_objZIP = m_objShell.NameSpace(p_strZipPath)

  '解凍先を取得する
  Set l_objOut = m_objShell.NameSpace(p_strOutPath)

  '解凍していく
  For Each l_objZIPItem In l_objZIP.Items
    Call l_objOut.CopyHere(l_objZIPItem)
  Next l_objZIPItem
End Sub

Private Sub CreZip(p_strZipPath As String, p_colParams As Collection)
  Dim l_objZIP    As Shell32.Folder
  Dim l_objZIPItem  As Shell32.FolderItem
  Dim l_strItem    As String
  Dim l_strName    As String
  Dim l_intCount   As Integer
  Dim i        As Integer

  '書庫オブジェクトを取得する
  Set l_objZIP = m_objShell.NameSpace(p_strZipPath)

  '圧縮対象のファイルを取得する
  For i = 1 To p_colParams.Count
    l_strItem = p_colParams(i)

    '名前を取得する
    l_strName = m_objFso.GetFileName(l_strItem)

    '現在のアイテム数を取得
    l_intCount = l_objZIP.Items().Count

    '書庫への追加を行う
    Call l_objZIP.CopyHere(l_strItem)

    '書庫追加が完了するまで待機
    Do While (l_intCount < l_objZIP.Items().Count)
      DoEvents
    Loop
  Next

End Sub

Private Sub CreZipNull(p_strZipName As String)
  Call m_objFso.CreateTextFile(p_strZipName, True).Write("PK" & Chr(5) & Chr(6) & String(18, 0))
End Sub

この回答へのお礼

1050YEN様、再度ご回答ありがとうございます!!

前回ご回答いただき、今作成し、やっとか出来上がったところでしたので
おしらせしようとしていたところでした。

私が作ったのは、
' Zipファイル展開関数
Function ExtraceZIP(vZipFile As Variant, vDestination As Variant)

Dim objFileSys As Object
Dim objShell As Object
Dim objFile As Object
Dim objDestination As Object

On Error GoTo ZipDeco_Err

' ファイルシステムオブジェクトおよびシェルオブジェクト作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")

' 対象がZipファイルかチェック
If UCase(objFileSys.GetExtensionName(vZipFile)) <> "ZIP" Then
MsgBox "Invalid Extension Name"
Exit Function
End If

' 展開先パスがなければ作成する
If Dir(vDestination, vbDirectory) = "" Then
MkDir vDestination
End If

' Zipファイルオブジェクト作成
Set objFile = objShell.NameSpace(vZipFile)
' 展開先オブジェクト作成
Set objDestination = objShell.NameSpace(vDestination)


' 展開
' Zipファイルにアーカイブされているファイルが全て展開される
objDestination.CopyHere objFile.Items


On Error GoTo 0

Exit Function

ZipDeco_Err:

MsgBox "Zipファイル展開でエラーが発生しました" & Chr(13) & _
"エラーナンバー:" & Err.Number & Chr(13) & _
"エラー内容:" & Err.Description, vbOKOnly
On Error GoTo 0

End Function

となりました。

オブジェクトを作成するところ
Set objDestination = objShell.NameSpace(vDestination)
の、引数「vDestination」がStringだとエラーになるようで、
それがわからず時間がかかっていました。
なぜかは??です。

1050YEN様が組んでくださったロジックも調べてみたいと思います。
またご報告いたします!

VBのばーじょんは?

VBScriptでもできますが。。。

「CopyHere」「ZIP」


これでググると、結構サンプルありますよ。

最近の質問でも上がっています。

この回答へのお礼

1050YEN様、ご回答ありがとうございます!

VBのバージョンは6.0です。

VBSCriptでもできるのですか!
CopyHereと一緒に調べてみます!

ありがとうございました!

このQ&Aは役に立ちましたか?6 件

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

新しく質問する

注目の記事

GoogleChromeで開いているタブをiTunes風にする方法

Google Chromeで、開いているタブをiTunes風にかっこよく表示できるアドオンを紹介します。タブで開いているページすべてを、こんな感じでずらりと立体的に並べて表示できるアドオンです。...


新しく質問する

このカテゴリで人気のQ&Aランキング