Mettre date au bon format
Bonjour à tous,
Voilà une heure que je cherche une solution à un bug que j'ai "Objet déconnecté de ses clients"
Ce bug se produit lorsque 2 de mes fichiers sont ouverts en même temps, c'est assez étrange et difficile à expliquer.
Après avoir testé ligne par ligne tout le code, j'ai trouvé où l'erreur se produisait , et voici le coupable :
' ThisWorkbook.Worksheets("Reporting").Range("RecapBilan[[DATE ]]").Select
' Selection.NumberFormat = "m/d/yyyy"Voila...
Vous aurez peut-être compris que ce code permet de réparer le format date d'excel, qui se met aléatoirement en anglais, enfin c'est apparemment un problème archi-connu.
Je précise que je l'ai enregistré via l'enregistreur de macro.
Auriez vous des solutions alternatives ?
Je vous remercie
Bien cordialement
Bonjour FBidee, a tester: Eviter le select et le sélection
Sub FormatDateCells()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Reporting") ' Remplacez "Reporting" par le nom de votre feuille
' Appliquer le format de date directement à la plage de cellules
Dim PlageDate As Range
Set PlageDate = ws.Range("RecapBilan[[DATE ]]") ' Remplacez "RecapBilan[[DATE ]]" par votre plage de cellules
' Vérifiez que la plage n'est pas vide avant d'appliquer le format
If Not PlageDate Is Nothing Then
PlageDate.NumberFormat = "m/d/yyyy"
End If
End Sub- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonsoir,
Votre erreur provient du fait que le classeur où se déroule votre macro (=ThisWorkbook), n'est pas le classeur actif. Ceci devrait résoudre le problème :
ThisWorkbook.Activate
ThisWorkbook.Worksheets("Reporting").Range("RecapBilan[[DATE ]]").NumberFormat = "m/d/yyyy"Bonsoir,
Merci à vous pour ces solutions. Malheureusement ça n'a fonctionné...
Le bug n'apparait jamais lorsque cette ligne :
ThisWorkbook.Worksheets("Reporting").Range("RecapBilan[[DATE ]]").NumberFormat = "m/d/yyyy"est désactivée (dans le fichier RecapBilan)
Voici le code en entier :
Sub RazDateFormat()
Range("A9").Select 'se placer dans le tableau
'raz des filtres
With ThisWorkbook.Worksheets("Reporting")
If .FilterMode Then .ShowAllData
End With
Application.ScreenUpdating = False
'remettre la date au bon format + tri par ordre chronologique
ThisWorkbook.Activate
ThisWorkbook.Worksheets("Reporting").Range("RecapBilan[[DATE ]]").NumberFormat = "m/d/yyyy"
ThisWorkbook.Worksheets("Reporting").ListObjects("RecapBilan").Sort. _
SortFields.Clear
ThisWorkbook.Worksheets("Reporting").ListObjects("RecapBilan").Sort. _
SortFields.Add Key:=Range("RecapBilan[[#All],[DATE ]]"), SortOn:= _
xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ThisWorkbook.Worksheets("Reporting").ListObjects("RecapBilan").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("A9").Select 'se replacer dans le tableau
End SubCe code s’exécute à la sortie du fichier (fait avec l'enregistreur de macro)
les 2 fichiers sont quasi-identiques, le bug se produit uniquement en suivant un ordre particulier, c'est à dire :
J'ouvre RecapPrépa
J'ouvre RecapBilan
Je ferme RecapBilan (qui execute le code automatiquement)
Je ferme RecapPrépa (qui execute le même code)
=> Objet invoqué déconnecté
Par contre si j'ouvre le RecapBilan AVANT RecapPrepa, pas de soucis les 2 se ferment normalement et dans n'importe quel ordre de fermeture, le bug ne se produit que dans le sens que je viens de décrire.
Je vais continuer de creuser, si jamais je n'y arrive pas je déposerais les fichiers anonymes.
Merci encore, Bien cordialement.
re
Comme tu l'as mentionné, le problème survient lorsque tu fermes d'abord RecapBilan, puis RecapPrepa. Il est possible que la fermeture de RecapBilan provoque une déconnexion ou une réinitialisation de certaines ressources ou objets que RecapPrepa tente d'utiliser ensuite. Assures-toi de toujours fermer les fichiers dans l'ordre inverse de leur ouverture pour éviter ce problème
Si le code s'exécute automatiquement lors de la fermeture, tu peux essayer de désactiver cette fonctionnalité. Pour ce faire, ouvrez l'éditeur VBA, accédez au ThisWorkbook, et recherchez les événements liés à la fermeture du classeur. Tu peux commenter ou supprimer le code qui s'exécute automatiquement lors de la fermeture.
Ajouter un gestionnaire d'erreurs dans ton code pour capturer l'erreur "Objet déconnecté de ses clients" et éviter qu'elle ne provoque un plantage complet du programme. Tu peux utiliser On Error Resume Next pour continuer l'exécution du code en cas d'erreur.
Assure-toi qu'il n'y a pas de dépendances complexes entre les fichiers ou que les fichiers ne sont pas liés les uns aux autres de manière inattendue. Parfois, des liens entre fichiers peuvent provoquer des comportements inattendus lors de l'ouverture et de la fermeture.
Bonjour,
@stepaustras Merci pour ces conseils.
J'ai continué mes investigations mais réellement, je ne comprend pas. À priori, il n'y a aucune dépendance entre les fichiers.
Pour plus de simplicité, je vais nommer mes 2 fichiers "Fichier 1" et "Fichier 2"
______
Pour répondre à cette remarque :
Assures-toi de toujours fermer les fichiers dans l'ordre inverse de leur ouverture pour éviter ce problème
En pratique ce n'est pas possible, j'explique :
- on ouvre le Fichier 1 en premier
- Le fichier 1 est en fait une liste de plusieurs fichiers Excel, avec des liens hypertexte cliquables (et qui les ouvrent)
- Les fichiers Excel ouverts depuis le Fichier 1 permettent, au cours d'une macro, l'ouverture du Fichier 2
- Le Fichier 2 est ouvert à ce stade, on y intervient rapidement, puis on l'enregistre et ferme
- Le fichier 1 est toujours ouvert lui pendant ce temps, et l'étape finale est donc de le fermer.
Et là ça bug.
____________
Petite précision : cet ensemble de fichiers fonctionnait très bien depuis 2 ans, c'est en voulant "corriger" un morceau de code inutile (mais vraiment) que le problème s'est déclenché. Le morceau de code inutile n'était pas si inutile que ça, mais c'est vraiment qu'une coïncidence.
___________
BON tout ça pour dire, que je me suis résolu à mettre en ligne ces 2 fichiers pour que des personnes compétentes puissent y jeter un œil, j'ai donc voulu les anonymiser...
Et en anonymisant, plus de bug...
M*rde alors!
J'ai donc méthodiquement testé chaque colonne pour voir ce qui causait ce bug.
========> La colonne en question contient cette formule
=SI([@[DATE ]]+$R$5<AUJOURDHUI();"Refusé";"En attente")Selon le nombre de jours indiqué en R5, la valeur retournée est "en attente" ou "refusé".
MAIS EN FAIT, ce n'est pas cette formule qui cause le bug, mais un segment lié à cette colonne.
Donc pour corriger ce bug, il m'a fallu supprimer 1 segment...
____________
Je suis à moitié rassuré. Je cherche une logique mais je ne la trouve pas.
Voici mes 2 fichiers:
Je précise que j'utilise le bouton "Enregistrer et fermer" , celui-ci fait une copie dans le dossier "Archives" qui se situe sur le bureau (chemin à modifier, probablement)
J'ai également une macro permettant de fermer automatiquement le fichier au bout de X secondes de non-utilisation (je pense que ça n'a aucune incidence)
Donc pour rappel, pour que ça bug il faut :
1) ouvrir Fichier 1
2) ouvrir Fichier 2
3) Fichier 2 : cliquer sur "Enregistrer et fermer"
4) Fichier 1 : cliquer sur "Enregistrer et fermer"
Étrangement il faut répéter ce procédé 2 ou 3 fois de suite pour que ça bug, la première fois ça ne bug jamais.
Et pour que ça ne bug plus :
- Supprimer le segment de la colonne "Etat" ...
________
Merci pour votre aide éventuelle, et surtout bon courage.
Ce bug m'obsède tellement c'est inattendu
Cordialement
Bonjour FBidee, je pense avoir trouvé tes maux de tête. J'ai supprimé tous tes timers, c'est relou
Dans un premier temps tu mets que ceci dans le code de la feuille du fichier 1 , par contre il te faudra un contrôle ActiveX en bouton
Private Sub CommandButton1_Click()
Cancel = True
Application.OnTime Now, "Close_Xlsm"
End Subensuite tu colles ton autre code dans un module, pense a changer "Utilisateur" dans le chemin
Sub Close_Xlsm()
On Error Resume Next
Call Reparer_Date
With ThisWorkbook.Worksheets("Récap prépa")
If .FilterMode Then .ShowAllData
End With
On Error GoTo 0
ActiveWorkbook.SaveAs Filename:="C:\Users\Utilisateur\Desktop\Archives\" & "Récap prépa " & ThisWorkbook.Worksheets("Récap prépa").Range("U1").Value & ".xlsm"
Application.DisplayAlerts = False
ThisWorkbook.Close savechanges:=True
End SubEt tu fais pareil pour fichiers 2.
Si tu veux garder ton bouton tu peux faire ça aussi mais tu le laisse dan la feuille
Sub Fermer()
Cancel = True
Application.OnTime Now, "Close_Xlsm"
End SubBonjour stepaustras,
Effectivement ça résout le problème
J'ai simplement mis le bouton ActiveX sur Fichier 1, j'ai réadapté rapidement le code car il manquait 2-3 lignes par rapport à mon code d'origine mais c'est tout.
J'arrive toujours pas à comprendre pourquoi ça ne fonctionnait pas, ni même pourquoi ça fonctionne avec ta méthode !
Si tu as des explications je suis preneur, sinon un grand MERCI pour ton aide
Passe une bonne journée.
Cordialement.