Plantage Macro au bout de 3 utilisations

Bonjour à toutes et tous,

Je me suis lancé dans l'élaboration d'un outil de gestion de stocks pour le boulot et je rencontre un problème d'exécution sur l'une des macros. Etant donné que je débute dans la programmation VBA, j'avance doucement mais sûrement en testant chaque code plusieurs fois.

C'est ainsi que j'ai constaté qu'au bout de quelques essais, l'une des macros provoquait une erreur système et fermait Excel.

Sur l'onglet "Accueil2", lorsque j'essaie d'ajouter un nouveau fournisseur dans ma table de référence, tout se passe bien pour les 3 premiers puis ça plante! Idem pour l'ajout d'une nouvelle structure.

J'ai fait une recherche sur le forum par rapport au libellé des erreurs mais je n'arrive pas à trouver quelque de similaire.

Si un pro pouvait juste vérifier le code en question, ce serait vraiment sympa. Je joins le fichier et la capture d'écran avec les libellés d'erreurs avant plantage pour faciliter la compréhension.

capture
14test5-copie.xlsm (59.63 Ko)

Par avance, merci

Joh

Bonsoir,

Je n'ai regardé que la procédure ajout de structures qui paraissait correspondre à ton image...

Je ne comprends d'où t'est venue l'idée de l'utilisation du type de donnée Currency de façon qui paraît généralisée !

Tu t'en sers pour récupérer le renvoi d'une MsgBox (qui ne renvoie que des valeurs de type Integer, de 1 à 7), et dans un cas où tu sais à l'avance qu'elle va renvoyer 1 ! que tu n'utilises d'ailleurs pas (et on ne voit pas à quoi cela pourrait être utilisé) !

Tu l'utilises pour récupérer un numéro de ligne (donnée Integer ou Long) et comme compteur de boucle pour parcourir des lignes...

Il s'agit d'utilisations tout à fait inadéquates du type de donnée monétaire !

Je ne serais pas surpris que cela puisse déstabiliser Excel selon le contexte, en raison du lien de ce type de donnée avec un format particulier...

Je conseillerais donc de commencer par l'extirper, et voir ensuite... [Par la même occasion, si tu pouvais appliquer les règles habituelles de présentation du code : déclarations de variables en tête de procédure et pas n'importe où, meilleure indentation, élimination des Activate ou Select inutiles... Je le lirais beaucoup plus volontiers !

Cordialement.

Bonjour MFerrand, le forum,

Je vous remercie pour vos conseils, cela m'a permis d'avancer!

J'ai refait la syntaxe du code pour l'ajout de structures avec déclaration et affectation des variables au début et j'ai essayé de mieux l'indenter. J'espère que c'est mieux ainsi.

J'ai opté pour Integer à la place de Currency et j'ai aussi changé le bout de code qui permet de saisir le contenu de la textbox dans la feuille du classeur concernée.

L'erreur à l'origine du plantage n'est plus, elle devait probablement se situer soit dans cette partie du code, soit dans ma mauvaise utilisation du type Currency.

Néanmoins, si la macro semble fonctionner ainsi, j'ai quand-même dû omettre quelque chose car le contenu de la textbox ne se déverse pas au bon endroit: elle s'inscrit dans la feuille ("Accueil2") où sont placés les boutons qui lancent les macros au lieu de s'inscrire dans la ("Base").

Je pense que c'est lié à l'ActiveCell que je dois mal sélectionner.

Ainsi, j'ai une nouvelle question si vous le permettez:

Comment cibler précisément la cellule dans laquelle l'enregistrement doit se faire à l'aide de l'ActiveCell ?

Petite précision, juste parce que vous vous demandiez, j'avais initialement choisi de déclarer en Currency car il me semblait avoir lu que c'était plus "souple" dès lors qu'il était question de chiffres !

En ce moment, je lis beaucoup (trop?) d'articles pour progresser et je dois m'embrouiller entre les différentes lectures.

Merci et bonne journée,

Cordialement,

Joh

20test5-copie.xlsm (62.19 Ko)

Bonjour,

Pas le temps de regarder ton classeur immédiatement car je dois prendre la route...

Je verrai cela plus tard.

A+

Cordialement.

Bonjour,

Désolé pour le délai mais en reprenant les questions en attente, c'est au fur et à mesure que je les retrouve et pas forcément dans l'ordre chronologique...

Ta procédure est en effet correcte sauf en ce qui concerne ActiveCell, qui fait référence à la cellule active de ta feuille active, laquelle est Accueil2...

Je te propose cependant une version un peu simplifiée de ta procédure de validation :

Private Sub Bouton_Ajouter_Click()
    Dim i%, nom$
    nom = Me.TB_nom.Value
    If nom <> "" Then
        With [Tableau1]
            For i = 1 To .Rows.Count
                If .Cells(i, 1) = nom Then
                    MsgBox "Enregistrement existant !"
                    Me.TB_nom.SetFocus
                    Exit Sub
                End If
            Next i
            If MsgBox("Confirmer la mise à jour de la base ?", vbYesNo, "Demande de confirmation") _
             = vbYes Then .Cells(.Rows.Count + 1, 1) = nom
            Unload Me
        End With
    Else
        MsgBox "Veuillez saisir une référence !"
        Me.TB_nom.SetFocus
    End If
End Sub

Tous les éléments y sont, mais utilisés un peu différemment. 2 variables déclarées seulement : une integer (% est ce que l'on appelle un caractère de déclaration de type, équivalent à As Integer, cela permet de raccourcir les déclarations de certains types ; même chose pour $ équivalant à As String) et une String (l'utilisation d'une variable lors de la recherche de doublon sera plus rapide que l'accès à la valeur de la TextBox à chaque tour de boucle...)

Tu utilises un tableau Excel pour tes structures, nommé automatiquement par Excel, le nom correspond à la partie données du tableau (soit DataBodyRange de l'objet ListObject). En VBA ce nom est utilisable dans les mêmes conditions qu'un nom de plage (sans avoir à ajouter un nom). L'avantage de ce nom, c'est que tu accèdes directement à la plage, sans avoir à faire référence à la feuille, la première cellule de ladite plage sera toujours .Cells(1, 1), la dernière .Cells(.Rows.Count, 1), et la suivante, la cellule à servir avec un nouveau nom de structure, .Cells(.Rows.Count + 1, 1), et cette nouvelle structure insérée sera automatiquement incorporée dans le tableau...

Cordialement.

Bonjour MFerrand, le forum

Merci beaucoup d'être revenu vers moi et d'avoir pris le temps de regarder mon code et aussi pour toutes ces infos.

Je ne savais pas pour les raccourcis lors des déclarations de variables et je pense avoir mieux compris l'utilisation de l'ActiveCell.

Votre correction est vraiment propre et du coup compréhensible, néanmoins lorsque je teste sous cette forme, cela provoque un plantage avec le motif "la méthode Cells de l'objet range a échoué" et excel se coupe avant de me laisser la possibilité de déboguer pour voir la lige incriminée.

Du coup, j'ai pensé qu'il fallait peut-être déclarer le Tableau1 (où doit s'enregistrer la valeur de la txtbox) en tant que Object pour qu'il puisse être détecter lors de l'exécution de la macro mais cela ne fonctionne pas non plus !

Si vous avez une idée, je suis preneur.

Encore merci,

Cordialement,

Bonjour,

Vérification, pas de problème chez moi...

Fais un test autonome :

Sub Test()
    With [Tableau1]
        .Cells(.Rows.Count + 1, 1) = "Essai"
    End With
End Sub

Tu places la macro Test dans un module Standard, et tu la lances. Elle doit ajouter Essai au tableau Structures.

Si erreur, tu seras fixé...

Cordialement.

capture2 capture

Merci d'avoir répondu si rapidement.

J'ai effectué le test dans un module standard et cela provoque bien l'erreur chez moi comme le montrent les photos. Cependant, Excel ne plante plus!

Franchement, je ne comprends pas pourquoi le Tableau1 n'est pas détecté?

Cordialement,

Il se peut que ce soit la notation compacte (nom entre crochets) qui ne soit pas supportée. J'ai vu le cas avec des MAC...

Tu peux donc essayer en remplaçant With [Tableau1] par :

    With Range("Tableau")

Fonctionne chez moi.

    With ThisWorkbook.Names("Tableau1").RefersToRange

Ne fonctionne pas chez moi...

    With Worksheets("Base").ListObjects("Tableau1").DataBodyRange

Fonctionne chez moi. Mais dommage de devoir repasser par la feuille...

NB- J'opère sous 2010 (mais je n'avais pas encore rencontré de différences de ce type avec 2013...)

Cordialement.

J'ai testé les 3 hypothèses sur la version 2016, rien n'y fait, cela provoque systématiquement l'erreur et le plantage d'Excel.

Je vais refaire l'outil sur une version 2010 d'Excel si c'est une version plus stable.

Je vous remercie pour le temps que vous y avez consacré et du coup je ne ferme pas tout de suite le post: je vous enverrai un petit message pour vous dire si j'ai réussi sur la version 2010.

A bientôt et encore merci,

Cordialement

Bonjour MFerrand, le forum,

Grâce à vos conseils, j'ai pu avancer dans l'élaboration de mon outil et je vous en remercie.

J'ai tout recommencé sur Excel 2010 et pour l'instant même si je n'ai pas tout fini, je suis arrivé bien plus loin que sur ma première version. Cela fonctionne et m'encourage à aller plus loin.

Toutefois, je bloque sur un point technique précis et si vous le permettez, j'ai une nouvelle question :

J'aimerais renvoyer dans un combobox de l'un de mes userforms, une valeur située dans une plage nommée de l'un des onglets (qui n'est pas actif à l'initialisation du userform en question)

Pour ce faire, j'utilise le code suivant mais il génère une erreur au niveau de la fonction RechercheV:

Sub ComboBox1.AfterUpdate ()

Dim nom$, L%

If ComboBox1.Value <> "" then    ' si je sélectionne un article du catalogue
      nom=ComboBox1.Value                ' "nom" = nom de cet article
End if
L=Application.VLookup(nom,Tableau6,3,False)  'je recherche le nombre d'exemplaires en stock dans le Tableau6 = Tableau référent
Label12.Caption = L.Value     ' je renvoie cette valeur dans le LabelBox situé à droite de la ComboBox

End sub

Pourriez-vous m'indiquer la bonne syntaxe à utiliser pour l'emploi de cette fonction ?

Je ne sais pas si c'est juste une question de syntaxe, en tout cas le débogueur bloque sur la ligne de code concernant la fonction RechercheV. Le "nom" est bien trouvé mais j'ai l'impression qu'il ne détecte pas la matrice dans laquelle doit s'effectuer la recherche et du coup il me renvoie une erreur d'incompatibilité .

Merci de votre aide,

Cordialement

Bonjour Joh2001,

Essaye avec :

L=Application.VLookup(nom,"Tableau6",3,False)

Cordialement

Bonjour dhany,

Merci pour ton intervention, cela m'a mis sur la voie pour corriger le code !!

En fait, il faut mettre la matrice entre crochets [Tableau6] et le code fonctionne.

Cordialement

Bonsoir,

Mettre [Tableau6] entre crochets...

Cordialement.

Bonsoir MFerrand,

Oui, c'est bien ça ; le demandeur Joh2001 l'avait déjà trouvé :

il faut mettre la matrice entre crochets [Tableau6]

Cordialement

Bonjour,

annulé, erreur de topic.

eric

Rechercher des sujets similaires à "plantage macro bout utilisations"