2017-08-06 3 views
0

Wenn ich die Shell-Befehlszeile verwenden, Winzip die Variable r und q, die den Pfad und Dateiname zurückgeben erkennt nicht als eine Zeichenfolge bei der Verwendung der Befehlszeile in VBA. Auch welcher Code würde ich brauchen, um irgendwelche Zip-Dateien zu überspringen, die bereits im Verzeichnis sind.Zip-Dateien in Unterordnern mit WinZip

Option Explicit 
Public Function ZipAll() 
Dim objFSO As New Scripting.FileSystemObject 
Dim objFolder As Scripting.Folder 
Dim colFiles As Scripting.File 
Dim objFile As Object 
Dim objStartFolder As String 
Dim Subfolder As Scripting.Folder 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
objStartFolder = "S:\UPSData\EOMOnHand\Abbott\" 
Set objFolder = objFSO.GetFolder(objStartFolder) 
Set colFiles = objFolder.Files 
ShowSubFolders objFSO.GetFolder(objStartFolder) 
End Function 

Public Function ShowSubFolders(Folder) 
Dim objFSO As New Scripting.FileSystemObject 
Dim objFolder As Scripting.Folder 
Dim colFiles As Scripting.File 
Dim objFile As Object 
Dim objStartFolder As String 
Dim Subfolder As Scripting.Folder 
Dim r As String 
Dim q As String 
Dim NextRow As Long 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 

    NextRow = 1 

    For Each Subfolder In Folder.Subfolders 
    'MsgBox SubFolder.Path 
    Set objFolder = objFSO.GetFolder(Subfolder.Path) 
    Set colFiles = objFolder.Files 
    For Each objFile In colFiles 
    r = Subfolder.Path & "\" & objFile.Name & ".zip" 
    q = Subfolder.Path & "\" & objFile.Name 
    MsgBox r 
    MsgBox q 
    Shell "C:\Program Files\WinZip\WinZip64.exe -min -a " & r & " " & q 
    NextRow = NextRow + 1 
    Next 
Next 
End Function 

Als ich q msgbox ich die s zurückgibt: \ upsdata \ eomonhands \ abbott \ abbott.xlsx. Ich verwende theta als den Dateinamen in der Befehlszeile, die winzip aufrufen, aber es nicht als eine Zeichenfolge sehen. Wie gebe ich q als String zurück? Auch was wäre der Code, um weitere Dateien in diesem Ordner herauszufiltern, die bereits Zip-Dateien sind. Ich möchte diese nicht zippen.

+0

Sie erhalten definitiv die Syntax in diesem Befehl falsch - 'C: \ Programme \ WinZip \ WinZip64.exe -min -s: \ UPSData \ EOMOnHand \ Abbott \ xyz \ abc.xlsxs: \ UPSData \ EOMOnHand \ Abbott \ xyz \ * .xlsx' ist nicht gültig, da '-as: \ UPSData \ EOMOnHand \ Abbott \ xyz \ abc.xlsxs: \ UPSData \ EOMOnHand \ Abbott \ xyz \ * .xlsx' kein sinnvoller Parameter ist (aber ich habe WinZip nicht installiert, um zu überprüfen, was die richtige Syntax ist) – YowE3K

+0

@ YowE3K Ok Vergiss den Winzip-Teil. Wenn ich zur objfile.Name komme sagt es Objekt benötigt. Ich habe den Code geschrieben, um den Pfad der Unterordner in Ordnung zu bringen. Der Name wird nicht angezeigt. – Atlas80808

+0

"Es sagt Objekt Require, wenn es die Zeile ojbFile.Name trifft", wirklich? Das 'For Each objFile in colFiles' sollte garantieren, dass es ausgefüllt ist! –

Antwort

0

Um alle Dateien in den Unterordnern zip, dass Sie die folgenden Aktionen ausführen können, sind xlsx:

Public Function ZipAll() 
Dim objFSO As New Scripting.FileSystemObject 
Dim objFolder As Scripting.Folder 
Dim colFiles As Scripting.Files 
Dim objStartFolder As String 
Dim Subfolder As Scripting.Folder 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
objStartFolder = "S:\UPSData\EOMOnHand\Abbott\" 
Set objFolder = objFSO.GetFolder(objStartFolder) 
Set colFiles = objFolder.Files 
ShowSubFolders objFSO.GetFolder(objStartFolder) 
End Function 

Public Function ShowSubFolders(Folder) 
Dim objFSO As New Scripting.FileSystemObject 
Dim objFolder As Scripting.Folder 
Dim colFiles As Scripting.Files 
Dim objFile As Object 
Dim objStartFolder As String 
Dim Subfolder As Scripting.Folder 
Dim FileName As String 
Dim r As String 
Dim q As String 
Dim NextRow As Long 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 

    NextRow = 1 

    For Each Subfolder In Folder.Subfolders 
    Set objFolder = objFSO.GetFolder(Subfolder.Path) 
    Set colFiles = objFolder.Files 
    For Each objFile In colFiles 
    FileName = Subfolder.Path & "\" & objFile.Name 
    If Right(FileName, 5) = ".xlsx" Then 
    GoTo Line1 
    Else 
    GoTo Line2 
    End If 

Line1: 
    r = Chr(34) & Subfolder.Path & "\" & objFile.Name & ".zip" & Chr(34) 
    q = Chr(34) & Subfolder.Path & "\" & "*.xlsx" & Chr(34) 
    iRunTaskID = Shell("C:\Program Files\WinZip\WinZip64.exe -min -a " & r & " " & q) 
    DoEvents 
    hProc = OpenProcess(SYNCHRONIZE, 0, iRunTaskID) 
    If hProc <> 0 Then 
    WaitForSingleObject hProc, INFINITE 
    CloseHandle hProc 
End If 
    r = Subfolder.Path & "\" & objFile.Name & ".zip" 
    If Len(Dir$(r)) > 0 Then 
    GoTo Line3 
    Else 
    GoTo Line2 
    End If 
Line3: 
bfile = Subfolder.Path & "\" & objFile.Name 
If Len(Dir$(bfile)) > 0 Then 
Kill bfile 
End If 
Line2: 
    NextRow = NextRow + 1 
    Next 
Next 

End Function 

Im Wesentlichen wird es auf die Linie springen auf den Dateinamen setzen Sie den Filter, wenn Sie, das die Dateien und Reißverschlüsse Reißverschlüsse, dass Datei außer dass es die anderen Dateien überspringt, die aufgeführt sind. Wenn Sie in der Winzp-Befehlszeile chr (34) verwenden, kann diese Zeichenfolge beim Aufruf als Zeichenfolge verwendet werden.