Instabilité d'Excel

Re,

Comme ça m'arrive régulièrement, il y a 1 h j'ai eu un plantage d'une macro qui a toujours bien fonctionné jusqu'ici (une boucle sur une colonne pour trouver une valeur et le report des valeurs de la ligne correspondante dans des contrôles d'un UserForm). J'ai tenté plusieurs fois, avec un plantage systématique.

Je fais donc une passe en pas à pas pour trouver ce qui cloche, et rien, le pas à pas se déroule normalement.

Je relance donc ma macro et là plus de plantage... Depuis elle refonctionne comme avant...

Je précise que je n'ai touché à rien, ni à la macro, ni aux valeurs ou à la structure de la feuille excel, j'ai juste ouvert le fichier et la macro s'est lancée automatiquement, comme d'habitude

Y'a qu'à moi que ça arrive ?

Manu

Bonjour,

Peut-on voir ce code capricieux ?

ric

Le dernier sur lequel ça s'est produit

    'Remplissage de la liste des documents
    With Logiciel.Sheets("SBCN")
        'Détermination de la ligne sélectionnée
        Ligne_sélectionnée = 0
        For Ligne = 2 To NbLignes
            If (.Cells(Ligne, VbColonne_SBCN_Préfixe) & "-" & .Cells(Ligne, VbColonne_SBCN_Référence) = Liste_documents.Column(0) Or _
                CStr(.Cells(Ligne, VbColonne_SBCN_Référence)) = Liste_documents.Column(0)) And CStr(.Cells(Ligne, VbColonne_SBCN_Item)) = Liste_documents.Column(1) Then
                Ligne_sélectionnée = Ligne
                Exit For
            End If
        Next Ligne
        'Report des données de la CN sélectionnée dans les champs du formulaire
        Me.Controls("DTPicker" & VbColonne_SBCN_Date_entrée_en_vigueur) = .Cells(Ligne_sélectionnée, VbColonne_SBCN_Date_entrée_en_vigueur)
        For Each Ctrl In Me.Controls
            If IsNumeric(Right(Ctrl.Name, 1)) And TypeName(Ctrl) <> "Label" Then
                If TypeName(Ctrl) = "TextBox" Then
                    i = Right(Ctrl.Name, Len(Ctrl.Name) - 7)
                    Me.Controls("TextBox" & i) = .Cells(Ligne_sélectionnée, Val(i)).Value
                End If
                If TypeName(Ctrl) = "ComboBox" Then
                    i = Right(Ctrl.Name, Len(Ctrl.Name) - 8)
                    Me.Controls("ComboBox" & i) = .Cells(Ligne_sélectionnée, Val(i)).Value
                End If
                If TypeName(Ctrl) = "DTPicker2" Then
                    i = Right(Ctrl.Name, Len(Ctrl.Name) - 8)
                    Me.Controls("DTPicker" & i) = Now
                    Me.Controls("DTPicker" & i) = Null
                    Me.Controls("DTPicker" & i) = .Cells(Ligne_sélectionnée, Val(i)).Value
                End If
                If TypeName(Ctrl) = "CheckBox" Then
                    i = Right(Ctrl.Name, Len(Ctrl.Name) - 8)
                    Me.Controls("CheckBox" & i) = .Cells(Ligne_sélectionnée, Val(i))
                End If
            End If
        Next

Autre cas foireux ce matin :

With Logiciel.Sheets("SBCN")
    'Calcul de l'échéance à partir de l'entrée en vigueur
        Date_entrée_vigueur = .Cells(Ligne_proposée, VbColonne_SBCN_Date_entrée_en_vigueur)
        a = DateSerial(Year(Date_entrée_vigueur), Month(Date_entrée_vigueur) + .Cells(Ligne_proposée, VbColonne_SBCN_Echéance_heures_DEV), Day(Date_entrée_vigueur))
End With

Ne fonctionne que si la date dans la cellule mise dans la variable Date_entrée_vigueur est en format nombre. Si elle est en format date le calcul plante. C'est pourtant une banale addition.

Manu

Bonjour,

Pour commencer la fonction DateSerial attend 3 arguments.

Tu en as 4 !...

a = DateSerial _
(Year(Date_entrée_vigueur),_ 
Month(Date_entrée_vigueur) + .Cells(Ligne_proposée, _
VbColonne_SBCN_Echéance_heures_DEV), _
Day(Date_entrée_vigueur))

Cdlt.

Non il n'y en a bien que 3 : l'année, le mois, calculé avec la variable " Date_entré_vigueur " auquel j'ajoute la valeur d'une cellule, et le jour.

Manu

Juste une question : est que tu es bien en Option Explicit ?

Non mais toutes mes variables sont déclarées en public dans un module.

Manu

Non mais toutes mes variables sont déclarées en public dans un module.

C'est encore plus imprudent que de ne pas utiliser l'Option Explicit à cause de la portée de tes variables, mais il y a de fortes chances pour que ce problème ne vienne pas de là.

Attention aux problèmes de mémoire : VB et Windows ne libèrent pas toujours tout.

Bonjour à tous,

Sans le code complet > il est bien difficile de localiser la coquille qui te pose problème ...

Un fichier sans données sensibles serait le bienvenu ...

Comme le mentionne Optimix > inscrire Option Explicit au haut de chacun des modules et formulaires est une saine pratique ...

Il est même possible de le mettre automatiquement pour les nouveaux modules et formulaires via le menu "Outils" > "Options" > onglet "Éditeur" > coche "Déclaration des variables obligatoire" ...

Aussi, mettre toutes les variables en "Public" n'est pas nécessairement une bonne chose ...

Au plaisir de lire l'ensemble de ton code ...

ric

Je peux vous mettre l'ensemble du code mais y'en a plusieurs pages et il faut le module où sont déclarées les variables, les Userform parce qu'il y a des liens entre eux et l'achitecture de dossiers / sous dossiers / fichiers qui sert de support. Ca fait beaucoup.

Je déclare les variables en Public parce que ce sont des constantes qui sont utilisées dans plusieurs UserForms

Sinon j'ai eu ça qui ne fonctionnait plus :

Private Sub Initialisation_type_matériel()

Type_matériel.Clear
MSN_matériel.Clear

With Logiciel.Sheets("TypeMatériel")
    For Ligne = 2 To Application.CountA(.Columns(vbColonne_TypeMatériel_Matériel))
        Type_matériel.AddItem .Cells(Ligne, vbColonne_TypeMatériel_Type_matériel)
    Next Ligne
End With

End Sub

Je n'ai rien modifié, Type_matériel est un ComboBox, les données que je veux y mettre sont des strings et le

.Cells(Ligne, vbColonne_TypeMatériel_Type_matériel)

Renvoyait bien la valeur que j'attendais. Sur la ligne Type_Matériel.AddItem, j'avais un message d'erreur Type mismatch.

Après avoir cherché en vain pendant 1 h, toujours sans avoir rien modifé, j'ai fermé et relancé Excel, et ça fonctionne de nouveau...

Manu

Si tu confonds constantes et variables, alors il y a urgence de paramétrer Excel comme te l'a indiqué Ric.

Bonjour à tous,

Ce ne sont pas des pages de code qui sont utiles pour trouver la source du souci > c'est un fichier sans données sensibles ...

ric

Encore une bizarrerie...

Depuis cet après midi, toutes les créations de ListBox et ComboBox avec additem me renvoient un Type Mismatch alors que le fichier et ses macros sert quotidiennement sans problèmes depuis 2014...

Manu

Ah et maintenant j'ai la même erreur sur les TextBox...

Manu

Dans ce cas je pense qu'il est grand temps de réinstaller Excel, car tout se passe comme si une librairie avait reçu.

Bonjour à tous,

Excel se mêle de temps à autre ...

Tu peux tenter de fermer ton ordinateur > attendre une minute > puis redémarrer et tester à nouveaux ...

ric

J'ai tenté ça n'a rien changé. Et je ne peux pas le réinstaller sur un des postes, c'est mon PC pro.

Excel gardera toujours une part de mystères.

Manu

Bonjour,

En programmation YAPA de mystère : Ou on est rigoureux ou on ne l'est pas. Quand on l'est et il vaut mieux mettre Option Explicit partout. Chez les pros (qui ne cherchent généralement pas d'ennuis), c'est une obligation couramment admise, et on n'utilise pas Public parce que c'est fatiguant de déclarer à chaque macro mais uniquement quand on ne peut pas faire autrement...

A ce stade la solution classique c'est de mettre On Error resume Next au début de chaque macro : Comme ça tu n'auras plus de problème !

A+

Bonjour à tous,

en plus de ce qui a été dit, précise toujours la propriété voulue.
Ne laisse pas vba le faire à ta place, il n'est pas toujours judicieux :

.AddItem .Cells(Ligne, vbColonne_TypeMatériel_Type_matériel).value
eric

PS :

A ce stade la solution classique c'est de mettre On Error resume Next au début de chaque macro : Comme ça tu n'auras plus de problème !

Rhooo, allons galopin

Rechercher des sujets similaires à "instabilite"