Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Ciao Alfredo,
Ammetto il mio limite... non è che abbia capito tanto, ma, provando questo "eccellente" lavoro prodotto da Norman David Jones, sono rimasto veramente soddisfatto.
Bene!
Unica pecca, e non so come porre rimedio, è:
Se nella cartella "C:\Users\Alfredo\Odrive\PdbDocumenti\Archivio" ci sono delle sottocartelle, queste non vengono copiate e neanche i files al loro interno.
Sono certo che il problema nasce dal fatto che io non abbia specificato che nella cartella ci fossero files e cartelle contenenti files.
Io avevo risposto alla domanda fatta da te. Per zippare anche i file che si trovano in ogni sottocartella, ad infinitum, prova invece il codice al di sotto.
Apparte questo và alla grande, la copia avviene, il trasferimento della copia avviene e durante l'esecuzione della copia non si puo fare altre funzioni!
Vedi i miei comment dopo al di sotto del seguente codice.
- Alt+F11 per aprire l'editor di VBA
- Alt+IM per inserire un nuovo modulo di codice
- Nel nuovo modulo vuoto, incolla il seguente codice:
'==========>>
Option Explicit
Public iCtr As Long
'--------->>
Public Sub Tester()
iCtr = 0
Application.StatusBar = "Per piacere sii paziente:un backup è in corso!"
Call SelectFiles
Application.StatusBar = False
End Sub
'--------->>
Public Sub SelectFiles(Optional sPath As String)
Dim WB As Workbook
Dim SH As Worksheet
Dim Rng As Range
Dim sStr As String
Dim sFilename
Const srcFolder As String = _
"**C:\Users\Alfredo\Odrive\PdbDocumenti\Archivio**"
Const sDestFolder As String = _
"**C:\Users\Alfredo\Odrive\Backup**'
Const sFoglio As String = "Foglio1"
Const sCella As String = "A1"
Const sEst As String = ".zip"
Set WB = ThisWorkbook
Set SH = WB.Sheets(sFoglio)
Set Rng = SH.Range(sCella)
sStr = Format(Rng.Value, "000") & "_" & Format(Date, "dd_mm_yyyy") & sEst
sFilename = sDestFolder & sStr
Call ZipFile(sFilename)
Call ProcessFiles(srcFolder, sFilename)
With Rng
.Value = .Value + 1
End With
WB.Save
Call MsgBox(Prompt:="I file di backup è stato salvato sotto il nome: " _
& sFilename _
& vbNewLine _
& "Il nuovo numero progressivo e' " _
& Format(Rng.Value, "000"), _
Buttons:=vbInformation, _
Title:="Report")
End Sub
'--------->>
Public Sub ProcessFiles(sPath As String, sFilename)
Static oFSO As Object
Static oApp As Object
Dim oFolder As Object
Dim oSubFolder As Object
Dim oFile As Object
If oApp Is Nothing Then
Set oApp = CreateObject("Shell.Application")
End If
If oFSO Is Nothing Then
Set oFSO = CreateObject("SCripting.FileSystemObject")
End If
Set oFolder = oFSO.GetFolder(sPath)
For Each oFile In oFolder.Files
Application.StatusBar = "Elaborando il file: " & oFile.Path
iCtr = iCtr + 1
oApp.Namespace(sFilename).CopyHere oFile.Path
On Error Resume Next
Do Until oApp.Namespace(sFilename).items.Count = iCtr
Application.Wait (Now + TimeValue("0:00:01"))
Loop
On Error GoTo 0
Next oFile
For Each oSubFolder In oFolder.SubFolders
Call ProcessFiles(oSubFolder.Path, sFilename)
Next
End Sub
'--------->>
Public Sub ZipFile(sPath)
If Len(Dir(sPath)) > 0 Then Kill sPath
Open sPath For Output As #1
Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
Close #1
End Sub
'<<=========
- Alt+Q per chiudere l'editor di VBA e tornare a Excel
- Salva il file con l’estensione xlsm
- Alt+F8 per aprire la finestra di gestione delle macro
- Seleziona Tester | Esegui
Nota che con questa codice l'elaborazione di ciacun file viene riportata sequenzialmente sulllla barra di stato (Status Bar) al fondo della finestra Excel.
P.S.: Approfitto... mica è possibile chiudere, sempre tramite vba, le finestre di windows?
Consulto spesso l'archivio e mi restano tipo 30 finestre aperte.
uso questo comando x aprire
Private Sub ApriArchivio() 'Apre Cartella PC WinExec "Explorer.exe C:\Users\Alfredo\Odrive\PdbDocumenti\Archivio", 10 End Sub
Per anche aiutare altri con un problema simile, credo sia meglio aprire un nuovo thread per questa domanda distinta.
===
Regards,
Norman