質問
Window(XP,2003等)標準機能の「ZIP圧縮・展開」をVBに
- 投稿日時:2010/04/09 17:25
Window(XP,2003等)標準機能の「ZIP圧縮・展開」をVBに組み込めますでしょうか?
VBで、圧縮ファイルを展開する、ということをしたいのですが、
ネット上に沢山サンプルがある「外部DLL(unzip32.dllなど)を使用する」という方法は、
使用条件によっては外部DLLのライセンスの問題が絡んでくるようですので、
Windowsの標準機能を組み込めないか?と考えたところです。
Windowsの標準機能、と記載しましたが、
・ファイルを右クリック→送る→圧縮(zip形式)フォルダ
・ファイルを右クリック→送る→すべて展開
のことを指しました。
ご指導よろしくお願いいたします。
回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:2010/04/12 15:26
>引数「vDestination」がStringだとエラーになるようで、
その通りです。
VBScriptだと逆にStringで切ってあげないといけないのですが、Object以外の型を持つ言語では、Stringで渡すと逆にダメという状態になります。
VBScriptはStringで渡すことによって、最も適したObject型に自動キャストされます。
VBからStringで渡すと、Stringのままオブジェクト扱いされてしまいます。
サンプルは参照設定をしているので、用意されているメソッドが入力候補に現れます。
暇なときにでも、一度試されることをお勧めいたします。
少しのアドバイスでサンプルも見つけ、独自に理解されていくタイプの方のようですね。
スキルの高さを感じました。
がんばってください。
業務放棄の現実逃避者より
No.2
- 回答日時:2010/04/12 12:30
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様が組んでくださったロジックも調べてみたいと思います。
またご報告いたします!
- 質問者のみ
- この回答をベストアンサーに選ぶ
- この回答に補足をつける
No.1
- 回答日時:2010/04/09 20:07
VBのばーじょんは?
VBScriptでもできますが。。。
「CopyHere」「ZIP」
これでググると、結構サンプルありますよ。
最近の質問でも上がっています。
この回答へのお礼
1050YEN様、ご回答ありがとうございます!
VBのバージョンは6.0です。
VBSCriptでもできるのですか!
CopyHereと一緒に調べてみます!
ありがとうございました!
- 質問者のみ
- この回答をベストアンサーに選ぶ
- この回答に補足をつける
- 質問者のみ
- ベストアンサーを選ばずに質問を締め切る
このQ&Aを見た人はこんなQ&Aも見ています
- 4VBScriptでファイル圧縮
- 5パスワード付きzip圧縮を連続処理したい
- 6Vista用にファイルをZip形式に自動圧縮するVBScriptを記述
- 7VB.NETでUnzip32.DLLを使うには?
- 8VBAを使ってファイルを圧縮したい
- 9ファイルコピーのスクリプトで上書き確認のダイアログが表示
- 10コマンドプロンプトのERRORLEVELについて!
- 11VB6でCSVファイルにパスワードをかける方法
- 12EXCEL VBA で、フォルダーを圧縮しパスワードをかける方法はあり
- 13EXCEL VBA で現在開いているブックのファイル名を取得する方法
- 14Shell.ApplicationのNameSpaceを書き換えたい
- 15zipファイルを(DOSコマンドで)一気に解凍したい
- 16BAT+VBSでのファイルZIP化処理が終わらない
- 17zipのパスワード化
- 18EXCELファイルのカレントフォルダを取得するには?
- 19エクセルのVBAを使ってフォルダを削除したい
- 20VBScriptで空フォルダ圧縮
注目の記事
GoogleChromeで開いているタブをiTunes風にする方法
Google Chromeで、開いているタブをiTunes風にかっこよく表示できるアドオンを紹介します。タブで開いているページすべてを、こんな感じでずらりと立体的に並べて表示できるアドオンです。...
このQ&Aを見た人がよく見るQ&A
このカテゴリで人気のQ&Aランキング
- 4VBAにて新規ブックへ既存シート...
- 5他言語で言うcontinue文
- 6Sub ***( ) と Private Sub ***( ) ...
- 7エクセルVBAでファイル・シート名を...
- 8定数配列の書き方
- 9DataGridViewで、選択した行の値を...
- 10Functionの戻り値を配列にしたいの...
- 11エクセル(Excel) ワイルドカード *...
- 12TextBoxに半角数字のみの入力しかで...
- 13VBAで別エクセルファイルから指定エ...
- 14VB上で実行中の無限ループの止め方
- 15実行時エラー429
- 16別シート同士のセルを比較して一致...
- 17VB2010で、シリアル通信の方法を教...
- 18CloseとDisposeの違い
- 19ラジオボタンの初期指定
- 20VBAマクロでCSV出力