Excel buggé

Signaler
Messages postés
615
Date d'inscription
mercredi 5 octobre 2016
Statut
Membre
Dernière intervention
25 mai 2021
-
Messages postés
615
Date d'inscription
mercredi 5 octobre 2016
Statut
Membre
Dernière intervention
25 mai 2021
-
Bonjour,

J'ai fait un fichier excel pour mes commerciaux qui édite des devis (avec l'aide de plusieurs d'entre vous, que je remercie encore, sur certains points qui me posaient problème).
il fonctionne à merveille, c'est devenu un véritable outil de force de vente.
Cependant, mercredi dernier, la version qui était disponible pour les commerciaux a complètement planté, impossible de l'ouvrir : bug à la première ligne de code du workbook_open et un excel vide sans feuilles. Il faut savoir que se fichier excel ne fonctionne que par VBA en mode Application.WindowState = xlMinimized et Application.Visible = False et que le code ne fait jamais rien d'autre que enregistrer sous hors là il a été enregistrer ce mercredi

j'aimerai comprendre ce qui a pu se passer afin de faire en sorte d'empêcher que ça se reproduise.

le premier bug était sur une variable qui va récupérer un mot de passe dans le gestionnaire de nom résultat : "error 2029".
j'ai remplacé le [nom] par la vrai valeur dans le débogueur, il passe la ligne et plante dans la foulée sur la récupération d'une valeur en A1 sur une feuille précise en déclarant que la feuille n'appartient pas à sélection alors qu'elle apparait bien dans la liste de l'éditeur. Pour vérifier j'ai fait un "sub toto msgbox lafeuille.rangeA1.value" et ça me renvoie bien la valeur contenue en A1 de cette feuille..
j'ai ensuite essayé de faire un sub pour rendre toutes feuilles visibles avec une boucle, la boucle tourne mais le classeur est toujours vide en apparence

Il a fallut que j'utilise des méthodes que l'on connait mais dont on parle pas pour forcer les feuilles à être à nouveau visibles dans ce fameux classeur vide et le code refonctionne normalement

je vous partage le code du workbook_open bien que je ne pense pas que le problème vienne de là :
Private Sub Workbook_Open()
    Dim tmpmsgbx, i As Integer
    Dim Ws As Worksheet
    Dim WB As Workbook, Pass As String, tmpSheetName As String
    Dim MonTab As Variant
    Dim tmptxt As String

'empêcher l 'affichage d'un classeur s'il est ouvert alors que l'exécution
'des macros est désactivée dans les options de sécurité
'    ThisWorkbook.IsAddin = False
''au début de ta macro
    
    Application.EnableCancelKey = xlDisabled 'empeche raccourci clavier Ctrl Pause
    
    tmpSheetName = Worksheets("INFO").Range("A1").Value
    
    Names("EditDevis").Visible = False
    Names("ProtekLogo").Visible = False
    MonTab = [ProtekLogo]
    Worksheets(tmpSheetName).Activate
    Worksheets(tmpSheetName).Protect MonTab

    ActiveWindow.DisplayHeadings = False
    ActiveWindow.DisplayGridlines = False
    Application.DisplayFormulaBar = False

    If ThisWorkbook.Name = "NomDuFichierOuvert.xlsm" Then
        MonTab = [EditDevis]
        Call MisEnFormeLogin(False, MonTab)
        For Each Ws In Worksheets
            If Ws.Name <> tmpSheetName Then Sheets(Ws.Name).Visible = True
            Names("EditDevis").Visible = True
            Names("ProtekLogo").Visible = True
        Next Ws
        Application.WindowState = xlMaximized
        Application.Visible = True
        ActiveWindow.DisplayHeadings = True
        ActiveWindow.DisplayGridlines = True
        Application.DisplayFormulaBar = True
        Exit Sub
    Else
        For Each Ws In Worksheets
            If Ws.Name <> tmpSheetName Then Sheets(Ws.Name).Visible = xlSheetVeryHidden
            If Ws.Name = Environ("username") Then 'résultat de 3 essais erronés sur un mot de passe qui ouvre le classeur
                MsgBox "Erreur système, merci de contacter le Service compétant pour la remise en route de l'application"
                ThisWorkbook.Close savechanges:=False
            End If
        Next Ws
        
        If Worksheets("INFO").Range("A1").Value = "toto" Then
            tmptxt = "toto"
        Else
            tmptxt = "tata"
        End If
        
        tmpmsgbx = MsgBox("Merci de vous assurer de ne pas avoir d'autre fichier Excel ouvert" & vbCrLf & vbCrLf & _
        "Assurez vous d'enregistrer et fermer vos différents fichiers Excel avant de lancer l'application de chiffrage " & tmptxt, vbCritical + vbOKCancel, tmptxt)
        'mon fichier ferme excel en dur à la fin du programme donc ça peut créer des problèmes si d'autres classeurs sont ouverts et non enregistrés
        tmpmsgbx = MsgBox("mentions legales RGPD", vbInformation + vbYesNo, tmptxt)
    End If
    Worksheets(tmpSheetName).Visible = 1


    If tmpmsgbx = vbYes Then
        If Not ThisWorkbook.Name = "NomDuFichierOuvert.xlsm" Then
            Application.WindowState = xlMinimized
            Application.Visible = False
            Load ufLoggin
            ufLoggin.Show 0
        End If
    Else
        ThisWorkbook.Close savechanges:=False
    End If

End Sub


Merci d'avance pour vos avis éclairés

Configuration: Windows / Chrome 90.0.4430.212

1 réponse

Messages postés
10092
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juin 2021
1 156
Bonjour,
Difficile de vous aider, impossible de tester votre code (erreur l'une après l'autre par manque ...)
Désolé je pense qu'il est nécessaire d'avoir le classeur qui pose problème... !

Salutations.
Le Pingou
Messages postés
615
Date d'inscription
mercredi 5 octobre 2016
Statut
Membre
Dernière intervention
25 mai 2021
51
Bonjour et merci d'avoir pris le temps de regarder,

Effectivement le code est impossible à tester en l'état, il va chercher trop d'infos annexes dans le classeur et dans d'autres sub. Il fonctionne comme je l'attend mais il est peut-être mal écrit, je l'ai partagé plutôt dans l'idée de faire sortir une "grosse" erreur qui sauterait aux yeux.

Rendre le fichier anonyme et exempt d'info confidentielles est clairement impossible (ou plutot beaucoup trop long) à ce stade malheureusement.

Depuis que c'est arrivé j'ai eu le temps d'y réfléchir, je ne sais toujours pas quelle manip' a été faite, ni par qui.
Ce qui est sûr c'est que le fichier a été enregistré, j'imagine suite à un bug ou une mauvaise fermeture puisque dans le code, je n'ai écrit "ThisWorkBook.save" que si le nom du fichier est différent de "NomDuFichier.xlsm".
Pour être clair, la trame c'est :
"NomDuFichier.xlsm" -> commercial édite un devis -> ThisWorkBook.SaveAs "NomduClient-Ville-Date"-> commercial édite un autre devis-> ThisWorkBook.Save
En tout état de cause c'est cet enregistrement "sauvage" qui a corrompu le fichier.

je réfléchis donc à un code qui dirait "tant que tu t'appelles "NomDuFichier.xlsm" alors enregistrer impossible MAIS enregistrer sous possible"' pour bien verrouiller ce mon code fait implicitement.
J'ai commencé à chercher à temps perdu, j'ai trouver comment empêcher tout enregistrement mais pas encore la nuance entre enregistrer et enregistrer sous. En m'y mettant sérieusement, je ne pense pas que ce soit compliqué.
Et idéalement une fermeture plus propre en cas de bug : j'aimerai trouver une solution qui en cas de bug, m'enregistre le fichier sous un nom spécifique dans un dossier dédié avec la valeur de tous les objets concernés au moment du bug.
Ca m'aiderait énormément parce qu'à ce jour le fichier peut éditer des devis sur 6 produits différents avec chacun minimum une vingtaine d'option possible donc quand le commercial vient en me disant "ton fichier à buggé j'ai pas pu faire mon devis" ça m'aide pas trop ... je pense qu'il faut que je me tourne vers un "On Error Go To" et un sub qui relève les infos mais je m'y suis pas encore penché.

Merci encore en tout cas