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

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 Sub

Ce 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)

10fichier-1.zip (269.66 Ko)
10fichier-2.xlsm (93.02 Ko)

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 Sub

ensuite 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 Sub

Et 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 Sub

Bonjour 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.

Rechercher des sujets similaires à "mettre date bon format"