[[20190626095629]] 『zipの解凍』(しのみや) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『zipの解凍』(しのみや)

 https://officeforest.org/wp/2019/04/05/VBAでZIPの圧縮・解凍をやらせてみる
 のページの解凍をしてみるの記述をお借りしています。

 'OS標準機能でzipファイルを解凍する関数
 Public Function unzipman(ByVal filepath As Variant, ByVal meltpath As Variant) As Boolean
 On Error GoTo Err_Handler
 '指定のフォルダが存在するかチェック
 Dim FSO As Object
 Set FSO = CreateObject("Scripting.FileSystemObject")
 If FSO.FolderExists(meltpath) Then
 Else
 MkDir meltpath
 End If
 Set FSO = Nothing
 'シェルを呼び出し
 With CreateObject("Shell.Application")
 .Namespace(meltpath).CopyHere .Namespace(filepath).Items
 End With
 '結果を返す
 unzipman = True
 Err_unzipman
 unzipman = False
 Exit Function
 Err_Handler:
 MsgBox Err.Description
 Resume Exit_unzipman
 End Function
 '解凍呼び出しテスト
 Function testmelting()
 '変数の宣言
 Dim filepath As Variant
 Dim meltpath As Variant
 Dim ret As Boolean
 'ファイルのパスを格納
 filepath = "ここにZIPファイルのパスを入れる"
 meltpath = "ここに解凍先フォルダを入れる"
 'ZIP解凍を実行
 ret = unzipman(filepath, meltpath)
 End Functio

 コピペでは動かず、確認をしているところです

 最後の行の End Functio ← End Functionにしました

 実行してみたところ
 Err_unzipmanのところで、「SubまたはFunctionが定義されていません」のエラー
 (コメントにして進めてみたところ)

 Resume Exit_unzipmanで、「行ラベルが定義されていません」のエラー
 (コメントにして進めたところ)

 Filepathにあるzipファイルがmeltpathにそのままコピーされている様子です

 上記のコメントにしなければエラーになった部分の動きがわからないので
 何をしているのか教えて頂けませんか

 あともうひとつなのですが、
 .Namespace(meltpath).CopyHere .Namespace(filepath).Items
 この部分で、ファイルをコピーしているのはわかるのですが、
 .Namespace(filepath).Items こちらは何をしているのでしょうか
 Namespace Itemsで検索してみてもうまく探せませんでした

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 こんにちは。

 問題点その1 
 Err_Handlerの中で、Resume先がない。 typoだと思います。

 問題点その2
 このままだと、正常終了のときも、
 unzipman = False の行を通るので、正常終了でもFalseが返る

 上記2点について修正すると以下になります。
 Resumeする必要ないと思いますけど、一応そのままにしました。

 もう1点については、
 https://docs.microsoft.com/ja-jp/windows/desktop/shell/shell-namespace

 Public Function unzipman(ByVal filepath As Variant, ByVal meltpath As Variant) As Boolean
     On Error GoTo Err_Handler
     '指定のフォルダが存在するかチェック
     Dim FSO As Object
     Set FSO = CreateObject("Scripting.FileSystemObject")

     If FSO.FolderExists(meltpath) Then
     Else
         MkDir meltpath
     End If
     Set FSO = Nothing

     'シェルを呼び出し
     With CreateObject("Shell.Application")
       .Namespace(meltpath).CopyHere .Namespace(filepath).Items
     End With

     '結果を返す
     unzipman = True

 Exit_unzipman:          'ここがちがっている。
     Exit Function

 Err_Handler:
     MsgBox Err.Description
     unzipman = False
     Resume Exit_unzipman
 End Function

 '解凍呼び出しテスト
 Function testmelting()
     '変数の宣言
     Dim filepath As Variant
     Dim meltpath As Variant
     Dim ret As Boolean

     'ファイルのパスを格納
     filepath = "ここにZIPファイルのパスを入れる"
     meltpath = "ここに解凍先フォルダを入れる"

     'ZIP解凍を実行
     ret = unzipman(filepath, meltpath)
 End Function
(でれすけ) 2019/06/26(水) 12:01

 でれすけさんありがとうございます

 頂いた記述で、エラーが出ないようになりました
 ありがとうございます

 実行してみると、
 解凍がされていないものが、コピーされている様子なのですが
 何か変えないといけないのでしょうか

 教えて頂いた
 https://docs.microsoft.com/ja-jp/windows/desktop/shell/shell-namespace
 を見に行って、

 Private Sub fnShellNameSpaceVB()
     Dim objShell  As ShelL
     Dim objFolder As Folder

     Set objShell = New Shell
     Set objFolder = objShell.NameSpace(ssfPERSONAL)

     If (Not objFolder Is Nothing) Then
         Debug.Print objFolder.Title
     End If

     Set objFolder = Nothing
     Set objShell = Nothing
 End Sub
 の動きを確認しようと実行してみたのですが、
 objShell  As Shellの部分で「ユーザー定義型は定義されていません」となります

 少しずつですが理解しようと思いますが、
 よくわかっていなくて
 検討違いなことをしているのかもしれません…
(しのみや) 2019/06/26(水) 12:32

 >何か変えないといけないのでしょうか
 まさか、
     filepath = "ここにZIPファイルのパスを入れる"
     meltpath = "ここに解凍先フォルダを入れる"
 ここも変えてないとか?

 >objShell  As Shellの部分で「ユーザー定義型は定義されていません」となります
 参照設定で、
『Microsoft Shell Controls And Automation』
 にチェックを入れてください。
(でれすけ) 2019/06/26(水) 15:08

 filepath = "ここにZIPファイルのパスを入れる"
 meltpath = "ここに解凍先フォルダを入れる"
 変えています。

 変えたうえで実行してみると、
 Filepathにあるzipファイルがmeltpathにzipのままコピーされている様子です

 解凍をしたくてこの記述をお借りしているのですが、
 実行結果を見るとコピーをしているだけ?何かおかしいのか?…と思っております

 そこで、下の記述は 何をしているのだろうと質問させてもらったところ
 .Namespace(meltpath).CopyHere .Namespace(filepath).Items

 https://docs.microsoft.com/ja-jp/windows/desktop/shell/shell-namespace
 このページをご紹介頂き、『Microsoft Shell Controls And Automation』の
 チェックを入れ実行はできました
 イミディエイトに「マイドキュメント」と出ました

 解凍したいのですが、ハテナが増えていきます…

(しのみや) 2019/06/26(水) 15:27


 >filepath = "ここにZIPファイルのパスを入れる"
 >meltpath = "ここに解凍先フォルダを入れる"
 >変えています。

 どう変えているのか、記載してください。

 自分のコードを隠したまま質問しては、こちらは想像で回答することになります。
 時間の無駄です。

 想像ですが、filepath にZipファイルだけが入っている
 フォルダのパスを指定していのではないかと思います。
 Zipファイルのパスを拡張子までフルパスで指定してください。

 >チェックを入れ実行はできました
 >イミディエイトに「マイドキュメント」と出ました
 そうですか。それで、質問はなんですか?
(でれすけ) 2019/06/26(水) 17:02

 パスが関係するとは思わず、
 会社の情報が入っておりそのまま書けなかったため、記載しておりませんでした

 おっしゃった
 >Zipファイルのパスを拡張子までフルパスで指定してください。
 で解決できました

 ありがとうございました

 https://docs.microsoft.com/ja-jp/windows/desktop/shell/shell-namespace
 については、もう少し勉強したいと思います
(しのみや) 2019/06/26(水) 17:18

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.