[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.