
Envoyé par
Loukassosial
J'ai essayé de créer le fichier ZIP avec entête standard en amont comme tu me l'as expliqué mais ça ne change pas grand chose.
Le programme bloque encore sur objZip = Nothing...
Tu crées un fichier .zip valide (avec l'en-tête PK...)
➤ Puis tu tentes immédiatement :
Set dossierZip = Shell.Namespace("D:\Temp\newFile.zip")
Mais... dossierZip est Nothing, même si le fichier .zip a été créé correctement.
❗ Pourquoi cela se produit
Windows (explorateur + Shell.Application) a besoin d’un court délai pour détecter que le fichier .zip est devenu un fichier ZIP valide.
➡️ Cela peut prendre une fraction de seconde, donc si tu accèdes immédiatement avec Namespace(...), il est encore trop tôt.
✅ Solution : Attendre que Windows "reconnaisse" le ZIP
✅ Exemple : Boucle d’attente jusqu’à ce que Namespace() fonctionne
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| Sub AttenteNamespaceZip()
Dim cheminZip As String
cheminZip = "D:\Temp\newFile.zip"
' Créer un zip vide (en-tête)
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim fichier As Object
Set fichier = fso.CreateTextFile(cheminZip, True)
fichier.Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0))
fichier.Close
' Attendre que Windows reconnaisse le ZIP
Dim shell As Object
Set shell = CreateObject("Shell.Application")
Dim dossierZip As Object
Dim t As Single
t = Timer
Do
DoEvents
Set dossierZip = shell.Namespace(cheminZip)
If Timer - t > 5 Then Exit Do ' max 5 secondes d'attente
Loop While dossierZip Is Nothing
If Not dossierZip Is Nothing Then
MsgBox "Le ZIP est prêt. Vous pouvez l'utiliser."
Else
MsgBox "Échec : le ZIP na pas été reconnu après 5 secondes."
End If
End Sub |
🔍 Pourquoi Timer + DoEvents ?
- Timer mesure le temps (en secondes).
- DoEvents permet à Windows de faire d’autres tâches pendant la boucle (comme reconnaître le fichier ZIP).
- On attend jusqu’à 5 secondes, mais le fichier est souvent reconnu en moins d'une seconde.
✅ Ce que ça permet
- Tu peux enchaîner tout ton code (copie dans le ZIP, etc.) sans erreur.
- Tu évites que Shell.Application.Namespace(...) te renvoie Nothing.
Partager