Erreur d’exécution '91'

Résolu
Bonjour,

J'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

Résumé de la discussion

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.

Bobot (l’IA à votre service)
  1. Modérateur
    Bonjour,

    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 )

    0
    1. 
      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
      
      0
    2. Je suis novice en la matière, ce qui ne m'empêche pas d'être content du résultat...
      0
    3. 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
      
      0
    4. 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
      
      0