Message d'erreur excel VBA même données

ascascasc Messages postés 1 Statut Membre -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'aurai voulu savoir quel est le code pour créer un message d'erreur sous excel 2007.

J'ai un répertoire d'ingrédients qui sont chacuns affectés à un code (lettre et chiffre) (Feuille1)
sur une feuille 2, on peut rentrer un nouvel ingrédient avec son code et celui ci s'enregistre automatiquement à la suite de mo répertoire de la feuille 1.

Ce que je cherche à faire c'est : afficher un message d'erreur lorsque, on veut enregistrer un ingrédient alors que celui ci est déjà enregistrer dans le répertoire.

pouvez vous m'aider ?

13 réponses

  1. Morgothal Messages postés 1350 Statut Membre 184
     
    Bonjour,
    Tu peux affecter une mise en forme conditionnelle sur ta liste en Feuil1 pour faire ressortir les doublons, ainsi ils te sauteront aux yeux de la même manière qu'un pop-up...

    Pour cela dans Excel 2007 :
    1. Sélectionne toute ta liste (et même plus bas pour prévoir les prochaines entrées d'ingrédients)

    2. Onglet Accueil>Mise en forme conditionnelle>Règle de mise en surbrillance des cellules>Valeurs en double

    A+
    0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour vous deux,
    et celui ci s'enregistre automatiquement à la suite de mo répertoire de la feuille 1

    Enregistre automatiquement = macro non?
    Peux tu nous passer ton code?
    Il doit suffire d'y ajouter deux trois lignes et voilà...
    0
  3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Salut Morgothal,
    Astucieux oui, comme tout ce que l'on trouve chez Mister Boisgontier.
    A l'époque, Michel_M qui traîne ces guêtres ici et ailleurs, m'a recommandé de me pencher sur l'objet Dictionnary avec ce lien.

    Depuis, le site en entier de Jacques Boisgontier est dans mes favoris.
    A+
    Cordialement,
    Franck P
    0
    1. Morgothal Messages postés 1350 Statut Membre 184
       
      Il a trouvé sa place aussi dans les miens
      Merci pour le lien
      0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. ascasc
     
    Merci à tous pour votre aide. Pijaku c'est exactement ce que je voudrai faire. Malheureusement, je n'arrive pas à voir ton VBA. pourrais tu me dire comment l'insérer à mon code suivant :

    'création nb val pour incrémenter ligne
    Sheets("Feuil2").Select
    Range("D1").Select
    ActiveCell.FormulaR1C1 = "=COUNTA(C[-3])"
    x = Cells(1, 4).Value
    y = x + 1

    'création nb val
    Sheets("Feuil1").Select
    Range("D1").Select
    ActiveCell.FormulaR1C1 = "=COUNTA(C[-3])"
    z = Cells(1, 4).Value

    Sheets("Feuil1").Select
    Range("A2:B" & z).Select
    Selection.Copy

    Sheets("Feuil2").Select
    Cells(y, 1).Select
    ActiveSheet.Paste
    Application.CutCopyMode = False

    'effacer données
    Sheets("Feuil1").Select
    Range("A2:D" & z).Select
    Selection.ClearContents

    Merci d'avance
    0
  6. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Salut,

    Mon code est sagement rangé dans le module de la feuille. Je te le recopie ici :
    Private Sub Label1_Click()
    Dim Dico As Object, i As Long, Ingredient As String, DrLg As Long, code
    
    With Sheets("Feuil2")
        Ingredient = .Range("D6").Value
        code = .Range("D5").Value
    End With
    
    With Sheets("Feuil1")
        Set Dico = CreateObject("Scripting.Dictionary")
        DrLg = .Range("B" & Rows.Count).End(xlUp).Row
        For i = 2 To DrLg
            Dico(UCase(.Cells(i, 2))) = ""
        Next i
        If Not Dico.exists(UCase(Ingredient)) Then
            .Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = code
            .Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Value = Ingredient
        Else
            MsgBox "Ingrédient déjà existant", vbCritical + vbOKOnly, "Erreur Fatale!"
        End If
    End With
    End Sub


    Par contre, je ne vois pas bien ce que tu souhaites réaliser avec ton code...
    0
    1. ascascasc
       
      Merci, j'ai essayé de l'appliquer à mon ficher mais ma macro ne fonctionne pas.

      apparement c'est le DrLg qui bloque, à quoi doit il correspondre excactement ?
      Pourtant dans mon répertoire, le code est en colonne A et les ingrédients en B...
      0
    2. Morgothal Messages postés 1350 Statut Membre 184
       
      La variable DrLg correspond au numéro de ligne non-vide dans la colonne B de la feuille1... Quel est le message d'erreur ?
      0
    3. ascascasc
       
      le message d'erreur : "erreur d'exécution 1004 : erreur définie par l'application ou par l'objet
      0
  7. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    With Sheets("Feuil1")
        Set Dico = CreateObject("Scripting.Dictionary")
        DrLg = .Range("B" & Rows.Count).End(xlUp).Row


    DrLg est le numéro de la dernière ligne saisie de la colonne B feuil1
    0
    1. ascascasc
       
      Je recopie exactement la meme chose et il me marque : erreur d'exécution 1004 : erreur définie par l'application ou par l'objet ???
      0
  8. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    ta feuille s'appelle bien "Feuil1"?
    0
    1. ascascasc
       
      non mais j'ai changé j'ai adapté le code :

      Dim Dico As Object, i As Long, ingredient As String, DrLg As Long, code

      With Sheets("Entrée ingrédients")
      ingredient = Range("B5").Value
      code = Range("A5").Value
      End With

      With Sheets("INGREDIENTS et VIANDES")
      Set Dico = CreateObject("Scripting.dictionary")
      DrLg = .Range("B" & Rows.Count).End(x1up).Row
      For i = 2 To DrLg
      Dico(UCase(Cells(i, 2))) = ""
      Next i
      If Not Dico.exists(UCase(ingredient)) Then
      Range("A" & Rows.Count).End(x1up).Offset(1, 0).Value = code
      Range("B" & Rows.Count).End(x1up).Offset(1, 0).Value = ingredient

      Else
      MsgBox "Ingrédient déjà existant", vbCritical + vbOKOnly, "Erreur"
      End If
      0
  9. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    DrLg = .Range("B" & Rows.Count).End(x1up).Row
    End(xlUp).Row
    xlUp (ix - elle - u p ) pas x1Up (ix un u p) pas facile à comprendre ça...
    0
    1. Morgothal Messages postés 1350 Statut Membre 184
       
      C'est vrai qu'en "mode code" 1=l (L)
      1<>l
      0
    2. ascascasc
       
      MERCI !!!! CA fonctionne ouf ! merci beaucoup...

      J'aurai une autre petite question... En fait mon tableau d'entrée d'ingrédient est de A5 à A9 (pour le code) et de B5 à B9 (pour l'ingrédient) de façon à ce qu'on puisse rentrer plusieurs ingrédients en meme temps. Pouvez vous me dire s'il y a un moyen de l'intégrer dans la formule plutot que de traiter que la ligne A5;B5 ?? Merci d'avance
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Avec une petite boucle. Essaye :
      Private Sub Label1_Click()
      Dim Dico As Object, i As Long, Ingredient As String, DrLg As Long, code, Lig As Byte
      
      For Lig = 5 To 9
          With Sheets("Feuil2")
              Ingredient = .Range("A" & Lig).Value
              code = .Range("B" & Lig).Value
          End With
      
          With Sheets("Feuil1")
              Set Dico = CreateObject("Scripting.Dictionary")
              DrLg = .Range("B" & Rows.Count).End(xlUp).Row
              For i = 2 To DrLg
                  Dico(UCase(.Cells(i, 2))) = ""
              Next i
              If Not Dico.exists(UCase(Ingredient)) Then
                  .Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = code
                  .Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Value = Ingredient
              Else
                  MsgBox "Ingrédient déjà existant", vbCritical + vbOKOnly, "Erreur Fatale!"
              End If
          End With
      Next Lig
      End Sub
      
      
      0
    4. ascascasc
       
      "erreur de compilation End sub attendu" pourtant je l'ai marqué ???!!
      Aussi, la fin de ma macro ne s'excécute plus depuis l'insersion de ton code, saurais tu pourquoi ?

      Sub nbvalingredient()

      Application.ScreenUpdating = False
      '

      'création nb val
      Sheets("INGREDIENTS et VIANDES").Select
      Range("G8").Select
      ActiveCell.FormulaR1C1 = "=COUNTA(C[-6])"
      x = Cells(8, 7).Value
      y = x + 1

      'création nb val pour nouvelles données
      Sheets("Entrée ingrédients").Select
      Range("G1").Select
      ActiveCell.FormulaR1C1 = "=COUNTA(RC[-6] : R[9] C[-6])"
      Z = Cells(1, 7).Value + 4


      'copier les données dans ing & viandes
      Sheets("Entrée ingrédients").Select
      Range("A5:D" & Z).Select
      Selection.Copy
      Sheets("INGREDIENTS et VIANDES").Select
      Cells(y, 1).Select
      ActiveSheet.Paste
      Application.CutCopyMode = False

      TON CODE EST ICI

      'effacer les données entrées
      Sheets("Entrée ingrédients").Select
      Range("A5:D" & Z).Select
      Selection.ClearContents

      'fitrer par ordre du plus petit au plus grand
      Range("A3").Select
      ActiveWorkbook.Worksheets("INGREDIENTS et VIANDES").AutoFilter.Sort.SortFields. _
      Clear
      ActiveWorkbook.Worksheets("INGREDIENTS et VIANDES").AutoFilter.Sort.SortFields. _
      Add Key:=Range("A4:A476"), SortOn:=xlSortOnValues, Order:=xlAscending, _
      DataOption:=xlSortNormal
      With ActiveWorkbook.Worksheets("INGREDIENTS et VIANDES").AutoFilter.Sort
      .Header = xlYes
      .MatchCase = False
      .Orientation = xlTopToBottom
      .SortMethod = xlPinYin
      .Apply
      End With


      Sheets("INGREDIENTS et VIANDES").Select
      Range("G8").Select

      Sheets("Entrée ingrédients").Select
      Range("A3").Select

      Application.ScreenUpdating = True

      End Sub
      0
  10. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    De mon code, il faut retirer :
    Private Sub Label1_Click()
    et
    End Sub

    Aussi, la fin de ma macro ne s'excécute plus depuis l'insersion de ton code, saurais tu pourquoi ?
    peut être à cause de l'erreur de compilation...
    0
    1. ascascasc
       
      Le problème c'est que maintenant, comme l'ordi fait une boucle, meme si la ligne est vide il m'affiche le message d'erreur ?! Dois je rajouter un IF ??? pour dire si la ligne est vide, ne pas afficher le message d'erreur ?!

      ensuite le soucis est que le message d'erreur s'affiche : "l'ingrédient existe déjà" mais se copie quand meme dans le répertoire, je voudrai que le message s'affiche qu'on clique sur ok et qu'on revienne sur la page, si l'ingrédient n'est pas enregistré, qu'il se copie dans le répertoire.

      En tout cas merci beaucoup pour ton aide.
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      J'ai inversé code et ingredient entre A5 et B9 :
      Dim Dico As Object, i As Long, Ingredient As String, DrLg As Long, code, Lig As Byte
      
      For Lig = 5 To 9
          With Sheets("Feuil2")
              Ingredient = .Range("B" & Lig).Value
              code = .Range("A" & Lig).Value
          End With
      
          With Sheets("Feuil1")
              Set Dico = CreateObject("Scripting.Dictionary")
              DrLg = .Range("B" & Rows.Count).End(xlUp).Row
              For i = 2 To DrLg
                  Dico(UCase(.Cells(i, 2))) = ""
              Next i
              If Not Dico.exists(UCase(Ingredient)) Then
                  .Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = code
                  .Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Value = Ingredient
              Else
                  MsgBox Ingredient & " Ingrédient déjà existant", vbCritical + vbOKOnly, "Erreur Fatale!"
              End If
          End With
      Next Lig


      Sinon, après tests, le code fait exactement ce que tu souhaites, je ne comprends pas...
      0
    3. ascascasc
       
      j'effectivement recopié ton code. Mais par exemple si je rentre :

      Ligne 5 : V5852
      Ligne 6 : W2000
      Ligne 7 : W1000
      Ligne 8 : vide
      Ligne 9 : vide

      L'ordi affiche 5 fois "ingrédient existe déjà" alors que seul V5852 existe dans mon répertoire. De plus, ces 5 lignes se recopient alors que si possible après le message je voudrai que si le message est apparu, on ne copie pas les données.
      0
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      inversion entre code et ingrédient???
      0
    5. ascascasc
       
      j'ai inversé et maintenant, le message s'affiche plus qu'une fois meme si l'ingrédient existe déja dans le répertoire!
      0
  11. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    peux tu me transmettre ton fichier via cjoint.com?
    0
  12. ascascasc
     
    http://cjoint.com/?3GqqoorXRUk

    Voici le fichier simplifié. Merci pour ton aide j'espere ne pas trop t'embeter avec toutes mes questions.

    L'idéal serait de pouvoir rentrer des nouveaux ingrédients dans le répertoire et que si le message d'alerte s'affiche que les données ne se copient pas.
    0
  13. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    intégré à ta macro12
    https://www.cjoint.com/?BGqqDXXAyqs
    il manquait des points devant les lignes :
    .Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = code
    .Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Value = Ingredient

    et code et ingredient étaient inversés ici :
    With Sheets("Feuil2")
            Ingredient = .Range("B" & Lig).Value
            code = .Range("A" & Lig).Value
        End With


    0