XL 2016 erreur systeme &h80004005 erreur non spécifié

ZZ59264

XLDnaute Junior
Bonjour au forum,

J'ai du supprimer plusieurs duplicata de mon fichier de modèle car j'avais ce message d'erreur :

"erreur système &h80004005" erreur non spécifié

L’accès à la fenêtre VBA était bloqué par ce message d’erreur et impossible de sauvegarder ce fichier, je joins donc une version plus courte et non alimenté mais avec tout les codes VBA sur les modules et les procédures événementielles,

Pouvez vous me dire ce qui pourrait faire ce message d'erreur,

En faisant des recherches sur Google je suis tombé sur ce lien :


Mais rien ne fonctionnait chez moi, d’ailleurs en cas de modifications, impossible d'enregistré le fichier,

Merci d'avance pour ceux qui se pencheront sur d'éventuelles pistes, ou comment puis je savoir ce qui fait bloquer le fichier?,

Cordialement,

NB : j'ai supprimer le fichier qui bloquait et j'ai recommençait, et depuis pas de message d'erreur, mais au cas ou ça me le referait je voudrais savoir le pourquoi ;)
 

Pièces jointes

  • TEST FORUM - Copie.xlsm
    53.6 KB · Affichages: 9

patricktoulon

XLDnaute Barbatruc
bonsoir
je vais te demander de traduire ceci ci dessous dans ta tète autant que tu le peux
et on en parle après ;)
je te donne un indice quand même ;)
fait tu la différence entre
  1. une action faite (ou pas) a chaque itération dans une boucle
  2. et une action faite (ou pas )après l'itération
VB:
For Each nom In ActiveWorkbook.Names
        sup = True
        For Each F In ActiveWorkbook.Worksheets
                If nom.Name Like F.Name & "!*" Or nom.Name Like "'" & F.Name & "'!*" Then sup = False
        Next F
        If sup Then nom.Delete 'supprime le nom sauf s'il est défini dans une feuille du document créé
    Next nom
j'ajouterais que pour l'opérateur like il y a une sacré méprise
par ce qu'un test like"'" sur un names .. heu comment dire heu...:oops:😂
 
Dernière édition:

ZZ59264

XLDnaute Junior
Bonjour Patricktoulon,

Merci pour ton retour,

Tu suggère donc que la ligne suivante ne sert à rien ? :

VB:
If sup Then nom.Delete 'supprime le nom sauf s'il est défini dans une feuille du document créé

Pour ce qui est de la partie avec la fonction like, je ne te cache pas que j'en sais trop rien, on m'a fournit le code et cela fonctionnait, mais qu'est qui te choque dans cette utilisation?

je joins le lien de la discussion résolue par Job75, qui au passage à eu le mérite de résoudre mon problème de création fichier ;)


Cordialement,
 

patricktoulon

XLDnaute Barbatruc
bonjour
tu a des names avec l'apostrophe comme début de nom toi ?:oops:🤔
par ce que chez moi il est impossible de commencer le nom d'un name avec un des caractères que tu cite
au milieu du nom peut être
mais !!!!! quelle idée de nommer des names avec un point d'exclamation dans le nom ??🤔:oops:
surtout que programmatiquement le point d'exclamation représente un like négatif tout du moins c'est comme ca que l'on doit s'en servir ,ta méthode est donc doublement dangereuse

et pourquoi faire le tour complet des names ?
une fois trouvé tu delete et puis c'est tout tu exit for de la sous boucle et tu passe au suivant
et après tout l'essentiel c'est quoi c'est que le names porte dans son nom le nom d'une feuille
donc le like c'est tout simplement If nom.Name Like "*" & F.Name & "*" Then nom.Delete: Exit For

VB:
For Each nom In ActiveWorkbook.Names
     For Each F In ActiveWorkbook.Worksheets
        If nom.Name Like "*" & F.Name & "*" Then nom.Delete: Exit For
    Next F
Next nom
 

ZZ59264

XLDnaute Junior
Bonjour Patricktoulon,

Merci pour votre aide,

Alors j'ai remplacer vos lignes de codes sur mon fichier original, et effectivement le résultat est le même,

Peut être qu'il y a un gain de temps avec vos lignes, enfin j'ai pas mis de timer pour comparaison,

Concernant mon message d'erreur, je pense savoir pourquoi j'avais ce message :

"erreur systeme &h80004005 erreur non spécifié"​


En effet, je voulais activé les macros à l'ouverture pour éviter de cliquer sur activer le contenu (petit message d'information en jaune qui apparait à l'ouverture du fichier),

Je suis donc aller (après une recherche sur Google) dans Fichier, options, centre de gestion de la confidentialité, paramètres et dans le contenu externe j’allais activé toutes le connexions de données et la mise à jour automatique,

Depuis que j suis revenu à l'option interrogé l'utilisateur, je n'ai plus ce message d'erreur,

Cordialement,
 

eriiic

XLDnaute Barbatruc
Bonjour à tous,

Patrick, j'ai l'impression que tu as oublié qu'un nom de niveau feuille contient le nom de la feuille entre 2 ' ' et utilise le séparateur !
Par exemple
VB:
[A1].Name = "'Feuil1'!nom_1"
Le gestionnaire de nom les filtres mais en vba ils sont présent dans le .name :
2022-01-01_19-59-40.jpg

Je suppose que c'est ceux qu'il veut supprimer.
! présent aussi dans noms sur ref perdues : Like "*REF!*"
eric
 

patricktoulon

XLDnaute Barbatruc
Bonjour @eriiic
je n'ai jamais utilisé le Name de cette manière l'exploitation en est bien trop alambiquée

travailler avec des noms de niveau feuille
ma fois tu te vois travailler avec ça toi sincèrement?
VB:
Sub testlecture()
MsgBox Feuil1.Names("'Feuil1'!nom_1").Name
MsgBox Feuil1.Names("'Feuil1'!nom_1").RefersTo
End Sub

OK on est dans un pays libre;)
perso je préfère travailler niveau classeur
VB:
Sub test()
[A1].Name = "nom_1"
[A2].Name = "nom_2"
[A3].Name = "nom_3"
End Sub

Sub testlecture()
MsgBox Names("nom_1").Name
MsgBox Names("nom_1").RefersTo
End Sub
au pire mon test like je le fait sur le refersTo et le sheets parent je l'ai
pourquoi faire simple quand on peut faire compliqué;)
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Il n'y a pas lieu de préciser le préfixe de la feuille pour atteintre un membre de la collection Names d'un Worksheet. Sa clé n'est pas sa propriété Name, mais ce qui y figure au delà du '!'.
 
Dernière édition:

eriiic

XLDnaute Barbatruc
tu te vois travailler avec ça toi sincèrement?
La question n'est pas là.
Les noms niveau feuille existent (ils peuvent être créé dans le gestionnaire de nom, pas obligatoirement en vba) et correspondent à ce que recherche le demandeur a-priori. Tu ne peux pas affirmer qu'un nom ne commence jamais par une ' et ne doit jamais contenir de ! puisque c'est bien ainsi qu'on les voit dans le .name où s'effectue le contrôle.
Relis ton post #4...

Tu t'adresses à qui Dranreb ?
eric
 

Dranreb

XLDnaute Barbatruc
J'ai ces Functions que j'utilise quelque part :
VB:
Private Function PréfixeFeuille(ByVal Z As String) As String
   PréfixeFeuille = Left$(Z, PosPExcla(Z))
   End Function
Private Function PosPExcla(ByVal Z As String) As Long
Rem. Le nom de feuille peut contenir "!", et même "'!", ou commencer par "!", pourquoi pas, mais on ne peut
'    se contenter de chercher tout simplement le dernier "!" car la suite de Z peut aussi contenir "#REF!" !
   If Left$(Z, 1) = "'" Then PosPExcla = InStr(Replace(Mid$(Z, 2), "''", "??"), "'!") + 2 Else PosPExcla = InStr(Z, "!")
   End Function
Elles pourraient vous servir, @ZZ59264, sans avoir besoin d'explorer les feuilles, en vérifiant simplement si PréfixeFeuille(nom.Name) <> PréfixeFeuille(Mid$(nom.RefersTo, 2)). À tester. Mais attention, il y peut y avoir aussi des noms de la collection Names du Workbook qui ne peuvent pas être supprimés.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
J'ai testé :
VB:
Sub Test()
   Dim Nme As Name
   For Each Nme In ActiveWorkbook.Names
      If PréfixeFeuille(Nme.Name) <> PréfixeFeuille(Mid$(Nme.RefersTo, 2)) Then
         If MsgBox(Nme.Name & " " & Nme.RefersTo & vbLf & "à supprimer ?", _
            vbYesNo) = vbYes Then Nme.Delete
         End If
      Next Nme
   End Sub
Private Function PréfixeFeuille(ByVal Z As String) As String
   PréfixeFeuille = Left$(Z, PosPExcla(Z))
   End Function
Private Function PosPExcla(ByVal Z As String) As Long
Rem. Le nom de feuille peut contenir "!", et même "'!", ou commencer par "!", pourquoi pas, mais on ne peut
'    se contenter de chercher tout simplement le dernier "!" car la suite de Z peut aussi contenir "#REF!" !
   If Left$(Z, 1) = "'" Then PosPExcla = InStr(Replace(Mid$(Z, 2), "''", "??"), "'!") + 2 Else PosPExcla = InStr(Z, "!")
   End Function
 

patricktoulon

XLDnaute Barbatruc
Bonjour @Dranreb
là tu travaille avec les names niveau classeur en lecture pas niveau feuille

j'ai fait ce petit test qui démontre le problème en lecture
VB:
Sub createNAMEniveaufeuille()
[A1].Name = "'Feuil1'!nom_1"
[A2].Name = "'Feuil1'!nom_2"
[A3].Name = "'Feuil1'!nom_3"
End Sub

Sub testlectureNameniveaufeuille()
MsgBox Feuil1.Names("'Feuil1'!nom_1").RefersTo 'lecture niveau feuille
MsgBox ThisWorkbook.Names("'Feuil1'!nom_1").RefersTo 'lecture niveau classeur
End Sub


Sub createNAMEniveauclasseur()
[A4].Name = "nom_4"
[A5].Name = "nom_5"
[A6].Name = "nom_6"
End Sub

Sub testlectureNameniveauclasseur()
MsgBox ThisWorkbook.Names("nom_4").RefersTo ''lecture niveau classeur
MsgBox Feuil1.Names("nom_4").RefersTo ' 'lecture niveau feuille ne peut pas fonctionner
End Sub

Sub testlecturecount()
MsgBox Feuil1.Names.Count
MsgBox ThisWorkbook.Names.Count
End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Je ne perçoit pas de problème, c'est normal qu'on ne puisse pas récupérer un nom de niveau classeur dans la collection Names de la feuille puisqu'il n'y est pas. "Nom_1" y est par contre. La valeur de sa propriété Name est certes reconnue aussi, mais c'est plutôt sa clé qu'il est correct de spécifier :
VB:
MsgBox Feuil1.Names("nom_1").RefersTo 'lecture niveau feuille
Ça permet d'avoir le même nom dans plusieurs feuilles