Vérifier et éviter les doublons lors d'ajout de ligne dans tableau
Bonjour,
TABprestataire est mon tableau de facturation : avec différents prestataires de services sur une année.
- Prestataire de service en première colonne
- Année = 12 mois, sur les 12 prochaines colonnes.
Ce tableau est évolutif : Il peut, durant une année, y avoir un AJOUT ou une SUPRESSION de prestataire (donc de ligne).
Des boutons / Macros (« Ajout prestataires » et « Suppression prestataire ») sont là pour cela.
Problématique :
- Lors d’un ajout : Ma macro ne vérifie pas si la « valeur » est déjà présente. Et auquel cas, mettre une msgbox disant « le prestataire est déjà présent » serait l'idéal.
- Lors de la suppression : si l’utilisateur écrit depuis la msgbox un prestataire inexistant ou mal orthographié, ma macro bug.
Dans ce cas j’aimerais savoir comment faire pour : exit sub suivi d’une msgbox « prestataire inexistant. Vérifiez l’orthographe. »
Ajout :
Sub INPBX_AJOUT_PRESTATAIRE()
'********************************
'Procédure permettant d'incrémenter automatiquement le tableau TABprestations avec
'le nouveau prestataire depuis la saisie de l'INPUTBOX
'********************************
Range("B15").End(xlDown)(2) = InputBox("Ajouter votre nouveau prestataire.", "Ajout prestataire.")
End Sub
Suppression:
Sub INPBX_SUPPRESSION_PRESTATAIRE()
'***********************************
'Définition des variables
'***********************************
Dim code As String
Dim CellTrouvee As Range
'***********************************
'Rechercher dans le tableau TABprestations
'le prestataire à supprimer depuis une inputbox
'***********************************
code = InputBox("Saisir la prestation à supprimer.", "Suppression prestataire")
If code = "" Then Exit Sub
Set CellTrouvee = Range("B:B").Find(what:=code, LookIn:=xlValues, lookat:=xlWhole)
If Application.WorksheetFunction.CountIf(Range("B15:B" & Cells(Rows.Count, "B").End(xlUp).Row), code) = 0 Then
MsgBox "Prestataire introuvable. Vérifeir l'orthographe."
Exit Sub
End If
'If Application.WorksheetFunction.CountIf(Range(" chercher dans la colonne 1 du tableau " TABprestations" " & Cells(Rows.Count, "B").End(xlUp).Row), code) = 0 Then
' MsgBox "Prestataire introuvable. Vérifeir l'orthographe."
' Exit Sub
'End If
CellTrouvee.EntireRow.Delete
End Sub
Je vous remercie d’avoir pris le temps de me lire et pour votre future réponse.
Au plaisir de vous lire.
Amicalement.
Ps : je joint le fichier avec le tableau et les macros.
Bonjour,
Voilà une première partie pour l'ajout d'un prestataire, je reviendrais plus tard pour la deuxième partie
Sub INPBX_AJOUT_PRESTATAIRE()
Dim BD As Worksheet
Dim Presta As String
Dim i As Integer, PremLig As Integer, DernLig As Integer
'********************************
'Procédure permettant d'incrémenter automatiquement le tableau TABprestations avec
'le nouveau prestataire depuis la saisie de l'INPUTBOX
'********************************
Set BD = ThisWorkbook.Worksheets("PRESTATIONS")
PremLig = 15
DernLig = BD.Range("B" & BD.Rows.Count).End(xlUp).Row
Presta = InputBox("Ajouter votre nouveau prestataire.", "Ajout prestataire.")
If Presta = "" Then Exit Sub
For i = PremLig To DernLig
If UCase(BD.Cells(i, 2)) = UCase(Presta) Then MsgBox "Le prestataire existe déjà dans la liste.", vbExclamation, "Ajout d'un prestataire": Exit Sub
Next i
BD.ListObjects("TABprestations").ListRows.Add (1)
BD.Range("B15") = Presta
End Sub
Voilà le code qui devrais répondre à tes deux questions :
Dim BD As Worksheet
Dim Presta As String
Dim i As Integer, PremLig As Integer, DernLig As Integer
Sub INPBX_AJOUT_PRESTATAIRE()
Set BD = ThisWorkbook.Worksheets("PRESTATIONS")
PremLig = 15
DernLig = BD.Range("B" & BD.Rows.Count).End(xlUp).Row
Presta = InputBox("Ajouter votre nouveau prestataire.", "Ajout d'un prestataire.")
If Presta = "" Then Exit Sub
For i = PremLig To DernLig
If UCase(BD.Cells(i, 2)) = UCase(Presta) Then MsgBox "Le prestataire existe déjà dans la liste.", vbExclamation, "Ajout d'un prestataire": Exit Sub
Next i
BD.ListObjects("TABprestations").ListRows.Add (1)
BD.Range("B15") = Presta
MsgBox "Prestataire ajouté avec succès.", vbInformation, "Ajout d'un prestataire"
End Sub
Sub INPBX_SUPPRESSION_PRESTATAIRE()
Dim MSG As String
Set BD = ThisWorkbook.Worksheets("PRESTATIONS")
PremLig = 15
DernLig = BD.Range("B" & BD.Rows.Count).End(xlUp).Row
ResetCode:
Presta = InputBox("Saisir la prestation à supprimer.", "Suppression d'un prestataire")
If Presta = "" Then Exit Sub
For i = PremLig To DernLig
If UCase(BD.Cells(i, 2)) = UCase(Presta) Then
BD.ListObjects("TABprestations").DataBodyRange.Rows(i - PremLig + 1).Delete
MsgBox "Prestataire supprimé avec succès.", vbInformation, "Suppression d'un prestataire"
Exit Sub
End If
Next i
MSG = MsgBox("Impossible de trouver le prestataire dans la liste. Merci de vérifier l’orthographe." & Chr(10) & Chr(10) & _
"Essayer à nouveau ?", vbExclamation + vbYesNo, "Suppression d'un prestataire")
If MSG = vbYes Then GoTo ResetCode
End Sub
Bonjour GGautier,
Juste super pour tes 2 codes !
Ils fonctionnent à merveille !
Merci pour le temps passé, ta rapidité et ton altruisme.
Au plaisir de te relire.
Amicalement,
Alex
Parfait si ça te convient, n'hésite pas si jamais tu as des questions
Bonne continuation, Gautier
Bon, ok j'avoue, j'ai encore besoin d'un petit coup de pouce.
Dans le code "suppression", je n'arrive pas à lire (interpréter) la ligne de code qui sélectionne la colonne à rechercher.
Je cherche à dupliquer cette macro pour d'autre "Feuil" de mon classeur, et sur ces feuilles la colonne de recherche n'est plus B mais D. (sinon tous le reste est identique)
DernLig = BD.Range("B" & BD.Rows.Count).End(xlUp).Row
Je me dis, tout simplement, je change B par D... Et là... plus rien.
Et dans le code, aucune autre ligne ne fait référence à une colonne pour recherche. Je pense qu'il faudrait chercher vers :
If UCase(BD.Cells(i, 2)) = UCase(Presta) Then
BD.ListObjects("TABprestations").DataBodyRange.Rows(i - PremLig + 1).Delete
Mais je sèche totalement. Que veux dire "UCase"?
J'attends ton retour avec impatience.
Merci d'avance.
Bonjour :)
Alors,
DernLig = BD.Range("B" & BD.Rows.Count).End(xlUp).Row
Cette ligne de code permet de récupérer la dernière cellule non vide de la colonne B sur la feuille représentée par la variable BD (la feuille prestations)
Set BD = ThisWorkbook.Worksheets("PRESTATIONS")
En suite je compare le'ensemble des cellules de la plage définie juste au dessus et les compare à la saisie faite dans le "InpuBox". La fonction UCase()
permet de mettre le contenue en majuscule.
Je m'explique, si on cherche à savoir si "PrestationN°1" existe mais que la personne saisie "prestation N°1" alors excel dira que cette valeur n'existe pas (vue qu'il différencie les majuscules et minuscules). Donc je passe tout en majuscule pour faire la comparaison.
Donc UCase(PrestationN°1)=PRESTATIONN°1, valeur comparée à PRESZTATIONN°1 donc égale, donc excel te dira que la prestation existe bel et bien (donc ok pour suppression)
J'espère que tu as compris car je répond un peu vite ^^