[[20150611122803]] 『ZIPのフォルダから、特定ファイルの取出し』(ゆ) ページの最後に飛ぶ

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

 

『ZIPのフォルダから、特定ファイルの取出し』(ゆ)

 教えてください

 【やりたいこと】
 ZIPファイル
  ファイル名→書類.zip

 こちらを解凍し
 解凍したフォルダの中にある
 2つのファイルを取出フォルダに取り出そうとしています

  取り出したいファイル→ AAAA……….xls   
                …………AAA.doc 

  フォルダ名→ 取出

 【作ってみたもの】
 Option Explicit

 Dim i

 Private Sub Cmdファイル取出_Click()

     i = 0
     Dim sh As Object, fol1 As Object, fol2 As Object

     Set sh = CreateObject("shell.application")
     Set fol1 = sh.Namespace("C:\DL") 'ZIPファイルの場所
     Set fol2 = sh.Namespace("C:\A") '解凍ファイルの場所

     extract sh, fol1, fol2

     MsgBox "終了しました"

 End Sub

 Private Sub extract(sh As Object, zipfol As Object, dstfol As Object)

     Dim f As Variant

     For Each f In zipfol.items

         If (f.isfolder = True) Then

             extract sh, f.getfolder, dstfol

         ElseIf Left(f, 5) = "AAAA" And Right(f, 4) = ".xls" Then

             dstfol.copyhere f
             Workbooks("ファイル取出.xls").Worksheets("sheet1").Cells(1 + i, 5).Value = f

         ElseIf Right(f, 7) = "AAA.doc" Then

             dstfol.copyhere f
             Workbooks("ファイル取出.xls").Worksheets("sheet1").Cells(1 + i, 6).Value = f

             i = i + 1

         End If

     Next

 End Sub

 【直したい点 2つ】
 1
  C:\DLの直下に置くフォルダが
  zipファイルだと認識してくれない?ようなので、zipファイルで認識できるように
  (解凍した後の通常のフォルダだと、認識される)
  
 2
  取出した後の C:\A の中に
  書類フォルダを作成し、その中に2つのファイル
   AAAA……….xls   
   …………AAA.doc 
  を置きたい

 話が前後してすみませんが
 最終的には
  C:\DLの中に、書類1.zip 書類2.zip 書類3.zipと複数のzipファイルを置き
  実行することで

  C:\Aの中に
  書類1−
    AAAA……….xls   
    …………AAA.doc 

  書類2−
    AAAA……….xls   
    …………AAA.doc 

  書類3−
    AAAA……….xls   
    …………AAA.doc 

  としたいと考えております

< 使用 Excel:Excel2003、使用 OS:WindowsXP >


 参考情報リンクで
[[20150310184832]] 『zipファイルになっているフォルダの中にあるtxtの』(あや)

 とりあえず動いた程度のコードで覚書程度に
Option Explicit
Sub test()
    Dim zipFol As Object
    Dim dstPath As String
    Set zipFol = CreateObject("Shell.Application").Namespace("C:\DL")  'ZIPファイルの場所
    dstPath = "C:\A" '解凍ファイルの場所
    Extract zipFol, dstPath, 0
    MsgBox "終了しました"
End Sub
Private Sub Extract(ByRef zipFol As Object, ByRef dstPath As String, ByRef FileCount As Integer, Optional ByRef zipName As String)
    Dim f As Variant
    Dim col As New Collection
    Dim sPath As Variant 'StringだとNameSpaceとかが受け付けないらしい
    Dim cnt As Integer
    For Each f In zipFol.Items
        If f.IsFolder Then
            With CreateObject("Scripting.FileSystemObject")
                If LCase(.GetExtensionName(f)) = "zip" Then
                    zipName = Left(f, Len(f) - 4)
                End If
            End With
            Extract f.GetFolder, dstPath, FileCount, zipName
        ElseIf Left(f, 4) = "AAAA" And Right(f, 5) = ".xlsx" Then
            col.Add f
        ElseIf Right(f, 8) = "AAA.docx" Then
            col.Add f
        End If
    Next
    If col.Count > 0 Then
        With CreateObject("Scripting.FileSystemObject")
            sPath = .BuildPath(dstPath, zipName)
            If Not .FolderExists(sPath) Then
                .CreateFolder sPath
            End If
        End With
        With CreateObject("Shell.Application").Namespace(sPath)
            cnt = 0
            For Each f In col
                .CopyHere f
                ThisWorkbook.Worksheets("Sheet1").Range("E1").Offset(FileCount, cnt).Value = f
                cnt = cnt + 1
            Next
        End With
        FileCount = FileCount + 1
    End If
End Sub

 少なくともWindows7だとzipもフォルダ扱いになるようで
1については再現せず、でした。
(ご近所PG) 2015/06/12(金) 16:22

 あ、勝手にThisWorkbookとかxlsxとかdocxとかE1とか
ElseIf Left(f, 4) = "AAAA"
とかに書き換えてるんで参考に、ってことで。
(ご近所PG) 2015/06/12(金) 16:45

ありがとうございます

頂いたプログラムをしっかり勉強させてもらいます
またわからないところがあれば、質問させてください
(ゆ) 2015/06/13(土) 23:29


 デバッグして動きを勉強させてもらっています
 お手隙な時間があれば1点教えて下さい

 頂いた記述の中の
  col.Add f
 について教えていただきたいのですが

 これは見つけた該当のZipファイルをどうしているのですか?

 .Addは新規作成といった感じで理解しているのですが

 colの Dim col As New Collection
 Collectionを初めて知ったのもあり動作がハテナな状態です

(ゆ) 2015/06/16(火) 11:59


 > col.Add f
 > これは見つけた該当のZipファイルをどうしているのですか?
 
後でまとめて使いたいので、処理対象となるfを変数colに追加している、
と言う動作です。
 
Collectionは、なんというか、何でも入る器です。
Objectの配列みたいなのをイメージしてもらうと良いかしら。
 
参考ソース
 
Sub test()
    Dim aaa As New Collection
    Dim bbb As Variant
    aaa.Add "1"
    aaa.Add 2
    aaa.Add CreateObject("Scripting.FileSystemObject")
    For Each bbb In aaa
        Debug.Print TypeName(bbb)
    Next
End Sub
 
実際はこんな変な使い方しませんが、
何でも入る器だよってイメージを掴んでもらう為にあえて。
(ご近所PG) 2015/06/16(火) 12:19

 素早いご回答ありがとうございます

 教えていただいて
 colという何でも入る変数に
 ファイル名を格納しているまではわかりました

 .Add は何をしているのでしょうか?
 何かを作っている?

 Worksheets.Add ならシートを作成しているとわかるのですが…
(ゆ) 2015/06/16(火) 13:58

 > colという何でも入る変数に
 > ファイル名を格納しているまではわかりました
 
正確には追加しているのはファイル名(文字)ではなく、
FolderItem(かな?)というオブジェクトです。

 > .Add は何をしているのでしょうか?
 > 何かを作っている?
 > Worksheets.Add ならシートを作成しているとわかるのですが…
 
Collectionの中に、新しくアイテムを一つ追加しています。
Addは「作成」というより、「追加」という意味に捉えた方がしっくり来るかなぁと思います。
追加した器に入れるのはこれだよ、と言うのを引数で与えています。

 参考コード
Sub test()
    Dim aaa As New Collection
    Dim i As Integer
    MsgBox "Collectionの中にはアイテムが【" & aaa.Count & "個】あります"
    aaa.Add "1"
    MsgBox "Collectionの中にはアイテムが【" & aaa.Count & "個】あります"
    aaa.Add 2
    MsgBox "Collectionの中にはアイテムが【" & aaa.Count & "個】あります"
    aaa.Add CreateObject("Scripting.FileSystemObject")
    MsgBox "Collectionの中にはアイテムが【" & aaa.Count & "個】あります"
    For i = 1 To aaa.Count
        MsgBox i & "個目のアイテムの型は【" & TypeName(aaa.Item(i)) & "】です"
    Next
End Sub
(ご近所PG) 2015/06/16(火) 14:18

 わかりやすく教えていただきありがとうございます

 .Add の動きを知り 配列の動きと似ているなぁ…?と思っています

 引き続き勉強させてもらいます
(ゆ) 2015/06/17(水) 13:09


コメント返信:

[ 一覧(最新更新順) ]


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