从Zip文件VBA复制特定文件

从Zip文件VBA复制特定文件,vba,excel,zip,Vba,Excel,Zip,我正在尝试从zip文件复制特定文件。以下代码已成功运行,但未将文件从zip复制到文件夹 如有任何建议,将不胜感激 Sub Unzip5() Dim FSO As Object Dim oApp As Object Dim Fname As Variant Dim FileNameFolder As Variant Dim DefPath As String Dim strDate As String

我正在尝试从zip文件复制特定文件。以下代码已成功运行,但未将文件从zip复制到文件夹

如有任何建议,将不胜感激

 Sub Unzip5()
        Dim FSO As Object
        Dim oApp As Object
        Dim Fname As Variant
        Dim FileNameFolder As Variant
        Dim DefPath As String
        Dim strDate As String
        Dim I As Long
        Dim num As Long

        Fname = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", _
                                            MultiSelect:=True)
        If IsArray(Fname) = False Then
            'Do nothing
        Else

            FileNameFolder = "D:\Template\test\"



            Set oApp = CreateObject("Shell.Application")

          For I = LBound(Fname) To UBound(Fname)
                num = oApp.Namespace(FileNameFolder).Items.Count
                        For Each fileNameInZip In oApp.Namespace(Fname(I)).Items
                                    If fileNameInZip Like "repo*" Then
                                        oApp.Namespace(FileNameFolder).CopyHere oApp.Namespace(Fname(I)).Items.Item(CStr(fileNameInZip)) 
'this above line working fine but not copying file from zip
                                        Exit For
                                    End If
                                Next
                'oApp.Namespace(FileNameFolder).CopyHere oApp.Namespace(Fname(I)).Items

            Next I

            MsgBox "You find the files here: " & FileNameFolder

            On Error Resume Next
            Set FSO = CreateObject("scripting.filesystemobject")
            FSO.deletefolder Environ("Temp") & "\Temporary Directory*", True
        End If
    End Sub

您正面临这个问题,因为
CStr(fileNameInZip)
给您的文件名没有扩展名

将CStr(fileNameInZip)替换为
GetFilenameFromPath(fileNameInZip.Path)

并添加以下函数

Private Function GetFilenameFromPath(ByVal strPath As String) As String
    If Right$(strPath, 1) <> "\" And Len(strPath) > 0 Then
        GetFilenameFromPath = _
        GetFilenameFromPath(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1)
    End If
End Function
私有函数GetFilenameFromPath(ByVal strPath作为字符串)作为字符串
如果右$(strPath,1)“\”和Len(strPath)>0,则
GetFilenameFromPath=_
GetFilenameFromPath(左$(strPath,Len(strPath)-1))+右$(strPath,1)
如果结束
端函数
现在试试看:)

所以你的代码看起来像这样

Sub Unzip5()
        Dim FSO As Object, oApp As Object
        Dim Fname As Variant, FileNameFolder As Variant
        Dim DefPath As String, strDate As String
        Dim I As Long, num As Long

        Fname = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", _
                                            MultiSelect:=True)
        If IsArray(Fname) = True Then
            FileNameFolder = "D:\Template\test\"

            Set oApp = CreateObject("Shell.Application")

            For I = LBound(Fname) To UBound(Fname)
                num = oApp.Namespace(FileNameFolder).Items.Count

                For Each fileNameInZip In oApp.Namespace(Fname(I)).Items
                    If fileNameInZip Like "repo*" Then
                        oApp.Namespace(FileNameFolder).CopyHere _
                        oApp.Namespace(Fname(I)).Items.Item(GetFilenameFromPath(fileNameInZip.Path))

                        Exit For
                    End If
                Next
            Next I

            MsgBox "You find the files here: " & FileNameFolder

            On Error Resume Next
            Set FSO = CreateObject("scripting.filesystemobject")
            FSO.deletefolder Environ("Temp") & "\Temporary Directory*", True
            On Error GoTo 0
        End If
    End Sub

    Private Function GetFilenameFromPath(ByVal strPath As String) As String
        If Right$(strPath, 1) <> "\" And Len(strPath) > 0 Then
            GetFilenameFromPath = _
            GetFilenameFromPath(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1)
        End If
    End Function
Sub-Unzip5()
Dim FSO作为对象,oApp作为对象
Dim Fname作为变量,FileNameFolder作为变量
Dim DefPath作为字符串,strDate作为字符串
Dim I和Long一样长,num和Long一样长
Fname=Application.GetOpenFilename(文件过滤器:=“Zip文件(*.Zip),*.Zip”_
多选:=真)
如果IsArray(Fname)=True,则
FileNameFolder=“D:\Template\test\”
设置oApp=CreateObject(“Shell.Application”)
对于I=LBound(Fname)到UBound(Fname)
num=oApp.Namespace(FileNameFolder).Items.Count
对于oApp.Namespace(Fname(I)).Items中的每个fileNameInZip
如果fileNameInZip类似于“repo*”,那么
名称空间(FileNameFolder).CopyHere_
oApp.Namespace(Fname(I)).Items.Item(GetFilenameFromPath(fileNameInZip.Path))
退出
如果结束
下一个
接下来我
MsgBox“您可以在此处找到文件:”&FileNameFolder
出错时继续下一步
设置FSO=CreateObject(“scripting.filesystemobject”)
FSO.deletefolder环境(“Temp”)和“\Temporary Directory*”,True
错误转到0
如果结束
端接头
私有函数GetFilenameFromPath(ByVal strPath作为字符串)作为字符串
如果右$(strPath,1)“\”和Len(strPath)>0,则
GetFilenameFromPath=_
GetFilenameFromPath(左$(strPath,Len(strPath)-1))+右$(strPath,1)
如果结束
端函数