Erreur d’exécution '91'
RésoluJ'ai créer une base de données, et je rencontre plusieurs petits problèmes.
J'ai actuellement 2063 ligne dans mon tableau "recap" Dans la fenêtre recherche, si j'entre un numéro qui n'existe pas j'ai un message d'erreur " Erreur d’exécution '91' : variable objet ou variable de bloc Whit non définie"
Si je clique sur Fin je sort de mon UserForm et si je clique sur Débogage, je me retrouve sur ma fenêtre de code.
Ma question est la suivante, comment faire, pour afficher simplement un message me disant que la référence entrée n'existe pas.

Mon second problème est que si une personne qui s'est servie de la base de donner, laisse des filtres actifs dans le tableau "récap", quand moi je vais vouloir faire une nouvelle entrée, le numéro "automatique" m'affiche le suivant après le filtre, alors que celui-ci est déjà pris.
Comment faire, pour que même des filtres activés, je peux continuer ma saisie sans risque.
Un grand merci à ceux qui me viendront en aide.
10 réponses
Une erreur d’exécution 91 survient lorsque la référence saisie dans le formulaire n’existe pas et empêche l’utilisateur de poursuivre, ce qui peut bloquer l’entrée et nécessiter un débogage manuel. Pour éviter cela et afficher un message clair, il est recommandé d’utiliser Find sur la colonne concernée et de traiter le cas où Trouve est Nothing. D’autres échanges évoquent aussi le souci des filtres actifs qui déplacent l’index des numéros et proposent des solutions comme la duplication ou la consolidation des données entre feuilles afin d’éviter les incohérences. Une nuance utile est que ces approches peuvent être étendues à d’autres champs de recherche ou feuilles, offrant une prévention plus générale des erreurs et une meilleure stabilité des formulaires.
-
ModérateurBonjour,
Sans voir ton code.. impossible de te répondre.
Il faudrait également nous montrer la ligne de code sur laquelle apparaît le message d'erreur (lorsque tu fais débogage )
-
Dim sepdec Dim eng1 As Currency Dim factur1 As Currency Sub Macro1() Load UserForm1 UserForm1.Show End Sub Private Sub BDC_Click() End Sub Private Sub CommandButton3_Click() Unload Me End Sub Private Sub DF_Change() End Sub Private Sub ENG_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) sepdec = Application.International(xlDecimalSeparator) If Chr(KeyAscii) = "." Or Chr(KeyAscii) = "," Then KeyAscii = Asc(sepdec) If Chr(KeyAscii) <> "," Then If Not IsNumeric(Chr(KeyAscii)) Then MsgBox ("Remplacer le point par une virgule !"): ENG.Text = "": Exit Sub End If End Sub Private Sub FACTUR_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) sepdec = Application.International(xlDecimalSeparator) If Chr(KeyAscii) = "." Or Chr(KeyAscii) = "," Then KeyAscii = Asc(sepdec) If Chr(KeyAscii) <> "," Then If Not IsNumeric(Chr(KeyAscii)) Then MsgBox ("Remplacer le point par une virgule !"): FACTUR.Text = "": Exit Sub End If End Sub Private Sub Frame1_Click() End Sub Private Sub Frame2_Click() End Sub Private Sub Label51_Click() End Sub ' enregistrement modifications dans la feuille BDCM Private Sub MODIFS_Click() Dim l As Integer If MsgBox("confirmez-vous l'enregistrement des modifications ?", vbYesNo) = vbYes Then With Sheets("RECAP") l = .Columns(1).Find(RECHER, , , , xlByColumns, xlNext).Row 'pour rechercher la ligne correspondante MsgBox l ' .Range("A" & l).Value = NUMBDCM .Range("B" & l).Value = saisiss .Range("C" & l).Value = DATE_BDCM .Range("D" & l).Value = numda .Range("E" & l).Value = TC .Range("F" & l).Value = FORM .Range("G" & l).Value = UNITE .Range("H" & l).Value = DAT_ACHT .Range("I" & l).Value = MOIS eng1 = ENG factur1 = FACTUR .Range("AH" & l).Value = eng1 .Range("AG" & l).Value = factur1 .Range("J" & l).Value = OBJET .Range("K" & l).Value = FOURNI .Range("L" & l).Value = MARCHE .Range("N" & l).Value = NUM_CDE .Range("O" & l).Value = NUMFAC .Range("T" & l).Value = CPV .Range("V" & l).Value = COUT .Range("AA" & l).Value = CF .Range("AB" & l).Value = DF .Range("AI" & l).Value = OBS .Range("AJ" & l).Value = DATE_DP .Range("AK" & l).Value = NUM_DP .Range("AL" & l).Value = AEC .Range("AM" & l).Value = DATE_CP .Range("AN" & l).Value = CPC .Range("AO" & l).Value = WFAE .Range("AD" & l).Value = NUMCA .Range("W" & l).Value = LG .Range("R" & l).Value = PCE .Range("it" & l).Value = TYP_DEP End With End If ' Vide les zones de saisie. NUMBDCM = "" saisiss = "" numda = "" ACTIV = "" TC = "" FORM = "" ENG = "0,00" FACTUR = "0,00" UNITE = "" DAT_ACHT = "" MOIS = "" OBJET = "" FOURNI = "" MARCHE = "" NUM_CDE = "" NUMFAC = "" CPV = "" COUT = "" CF = "" DF = "" OBS = "" DATE_DP = "" NUM_DP = "" AEC = "" DATE_CP = "" CPC = "" WFAE = "" NUMCA = "" LG = "" PCE = "" RECHER = "" TYP_DEP = "" ' Rend bouton Nvelle commande visible - cache bouton modifs NVLLECMMDE.Visible = True MODIFS.Visible = False nouveau_num End Sub ' enregistrement dans la feuille BDCM Private Sub NVLLECMMDE_Click() Dim l As Integer If MsgBox("confirmez-vous l'entrée de cette nouvelle entrée ?") - vbYesNo Then With Sheets("RECAP") l = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row + 1 'pour placer le nouvel enregistrement sur la dernière ligne .Range("A" & l).Value = NUMBDCM .Range("B" & l).Value = saisiss .Range("C" & l).Value = DATE_BDCM .Range("D" & l).Value = numda .Range("E" & l).Value = TC .Range("F" & l).Value = FORM .Range("G" & l).Value = UNITE .Range("H" & l).Value = DAT_ACHT eng1 = ENG factur1 = FACTUR .Range("AH" & l).Value = eng1 .Range("AG" & l).Value = factur1 .Range("I" & l).Value = MOIS .Range("J" & l).Value = OBJET .Range("K" & l).Value = FOURNI .Range("L" & l).Value = MARCHE .Range("AD" & l).Value = NUMCA .Range("N" & l).Value = NUM_CDE .Range("O" & l).Value = NUMFAC .Range("T" & l).Value = CPV .Range("V" & l).Value = COUT .Range("AA" & l).Value = CF .Range("AB" & l).Value = DF .Range("AI" & l).Value = OBS .Range("AJ" & l).Value = DATE_DP .Range("AK" & l).Value = NUM_DP .Range("AL" & l).Value = AEC .Range("AM" & l).Value = DATE_CP .Range("AN" & l).Value = CPC .Range("AO" & l).Value = WFAE .Range("W" & l).Value = LG .Range("R" & l).Value = PCE .Range("it" & l).Value = TYP_DEP End With End If ' Vide les zones de saisie. NUMBDCM = "" saisiss = "" numda = "" TC = "" FORM = "" UNITE = "" ENG = "0,00" FACTUR = "0,00" DAT_ACHT = "" MOIS = "" OBJET = "" FOURNI = "" MARCHE = "" NUM_CDE = "" NUMFAC = "" CPV = "" COUT = "" CF = "" DF = "" OBS = "" DATE_DP = "" NUM_DP = "" AEC = "" DATE_CP = "" CPC = "" WFAE = "" NUMCA = "" LG = "" PCE = "" RECHER = "" NUMCA = "" Porteur = "" NOMCA = "" TYP_DEP = "" nouveau_num End Sub Private Sub OUI_NON_Click() End Sub 'Pour rechercher les infos Private Sub RECHER_Change() Dim l As Integer With Sheets("RECAP") l = .Columns(1).Find(RECHER, , , , xlByColumns, xlNext).Row NUMBDCM = .Range("A" & l).Value DATE_BDCM = .Range("C" & l).Value saisiss = .Range("B" & l).Value numda = .Range("D" & l).Value TC = .Range("E" & l).Value FORM = .Range("F" & l).Value UNITE = .Range("G" & l).Value DAT_ACHT = .Range("H" & l).Value MOIS = .Range("I" & l).Value FACTUR = .Range("AG" & l).Value ENG = .Range("AH" & l).Value OBJET = .Range("J" & l).Value FOURNI = .Range("K" & l).Value MARCHE = .Range("L" & l).Value NUM_CDE = .Range("N" & l).Value NUMFAC = .Range("O" & l).Value CPV = .Range("T" & l).Value COUT = .Range("V" & l).Value CF = .Range("AA" & l).Value DF = .Range("AB" & l).Value OBS = .Range("AI" & l).Value DATE_DP = .Range("AJ" & l).Value NUM_DP = .Range("AK" & l).Value AEC = .Range("AL" & l).Value DATE_CP = .Range("AM" & l).Value CPC = .Range("AN" & l).Value WFAE = .Range("AO" & l).Value LG = .Range("W" & l).Value 'PCE = .Range("R" & l).Value 'LIBCPV = .Range("U" & l).Value 'LIBPCE = .Range("S" & l).Value 'GM = .Range("P" & l).Value 'LIBGM = .Range("Q" & l).Value 'NUMCA = .Range("AD" & l).Value 'NOMCA = .Range("AF" & l).Value 'Porteur = .Range("AE" & l).Value 'TYP_DEP = .Range("it" & l).Value End With ' Cache bouton nouvelle entrée (évite fausse manip enregistrement 2 fois mm commande) ' Rend visible le bouton modifs NVLLECMMDE.Visible = False MODIFS.Visible = True End Sub ' Format de certaines cellules Private Sub userform_activate() Me.DATE_BDCM = Format(Date, "dd mmmm yyyy") Me.FACTUR = Format("0,00") Me.ENG = Format("0,00") ' par defaut rend visible le bouton nouvelle commande et invisible le bouton modifs NVLLECMMDE.Visible = True MODIFS.Visible = False nouveau_num End Sub Private Sub nouveau_num() Dim Ligne As Long 'numero de la 1ere commande premnum = 1 ' à modifier si nécessaire 'première ligne vide en colonne A de RegFactures Ligne = Sheets("RECAP").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row + 1 a = Sheets("RECAP").Range("A" & Ligne - 1).Value ' si cette valeur est le titre le n° sera celui indiqué dans la variable premnum (debut sub) sinon dernier n° + 1 (recuperation de la valeur des 5 derniers caractères à droite du dernier n°) If a = "N°" Then numc = premnum Else numc = Val(Right(a, 5)) + 1 ' composition de la fin du n° enregistrement avec 4 chiffres dont 0 au début (repete 0 autant de fois que 5 moins la longueur de numc) ndc = WorksheetFunction.Rept("0", 5 - Len(numc)) & numc NUMBDCM = ndc End Sub Private Sub WFAE_Change() End Sub -
-
ModérateurRegarde comment se code l'utilisation de la méthode find
https://forums.commentcamarche.net/forum/affich-37621992-methode-find-dans-vba-recherche-de-donnees-sous-excel -
En effet, mais dans l'exemple, comment remplacer le mot "trouver" par un numéro de ligne vu que ça va de 1 à 8000 ?
Je te remercie vraiment pour ton aide.Option Explicit Sub Cherche() 'déclaration des variables : Dim Trouve As Range, PlageDeRecherche As Range Dim Valeur_Cherchee As String, AdresseTrouvee As String '********* à adapter *********** 'affectation de valeurs aux variables : 'on cherche le mot "Trouve" Valeur_Cherchee = "Trouve" 'dans la première colonne de la feuille active Set PlageDeRecherche = ActiveSheet.Columns(1) '******************************* 'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole) Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole) 'traitement de l'erreur possible : Si on ne trouve rien : If Trouve Is Nothing Then 'ici, traitement pour le cas où la valeur n'est pas trouvée AdresseTrouvee = Valeur_Cherchee & " n'est pas présent dans " & PlageDeRecherche.Address Else 'ici, traitement pour le cas où la valeur est trouvée AdresseTrouvee = Trouve.Address End If MsgBox AdresseTrouvee 'vidage des variables Set PlageDeRecherche = Nothing Set Trouve = Nothing End Sub -
Modérateur@steph575
le mot "trouver"
????
Quel mot ? A quelle ligne ?
Sachant que ce qui sert dans ce code c'est surtout'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole) Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole) 'traitement de l'erreur possible : Si on ne trouve rien : If Trouve Is Nothing Then 'ici, traitement pour le cas où la valeur n'est pas trouvée AdresseTrouvee = Valeur_Cherchee & " n'est pas présent dans " & PlageDeRecherche.Address Else 'ici, traitement pour le cas où la valeur est trouvée AdresseTrouvee = Trouve.Address End If
Et pour le résultat... tu peux utiliser l'une des lignes suivantes :AdresseTrouvee = Trouve.Address ' adresse complète ligne ET colonne AdresseTrouvee= Trouve.Rows 'Numéro de ligne AdresseTrouvee= Trouve.Columns ' Numéro de colonne
-

