Aide à la suppression des données en double dans plusieurs conditions
Bonjour
J'ai cinq colonnes
Code produit
Nom du produit
Quantité
Nom du magasin
Validité du produit
Il y a une répétition dans le code produit et le nom du magasin en raison de la date de péremption différente du produit
Par exemple
100 : Produit : 12 : magasin : 01/05/2024
100 : Produit : 26 : magasin : 01/01/2024
Lorsque la quantité est 26 (zéro), il effectue une suppression définitive
Pour ce qui est de
Lorsque la quantité est de 12 (zéro)
Il ne le supprime pas car il n'est pas dupliqué
depuis
100 : Produit : 12 : magasin : 01/05/2024
à
100 : Produit : 0 : magasin : 01/05/2024
Sub KeepZeroDuplicates()
Dim ws As Worksheet
Dim lastRow As Long
Dim checkRange As Range
Dim checkCols As Variant
Dim data As Variant
Dim i As Long, j As Long, k As Long
' Set worksheet and last row
Set ws = ActiveSheet ' Replace with your sheet name if needed
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' Adjust column if needed
' Specify columns to check for duplicates and zero values
checkCols = Array(1, 2, 3, 4, 5) ' Replace with column numbers
' Store data in an array for efficient processing
data = ws.Range("A1:E" & lastRow).Value ' Adjust range as needed
' Loop through data array
For i = 2 To UBound(data, 1) ' Start from second row
For j = 2 To i - 1
' Check for duplicate in specified columns
If IsDuplicate(data, i, j, checkCols) Then
' Check if any value in check columns is zero
For k = LBound(checkCols) To UBound(checkCols)
If data(i, checkCols(k)) = 0 Then Exit For
Next k
If k <= UBound(checkCols) Then
' Duplicate found with zero value, keep it
Exit For
Else
' Duplicate without zero value, delete row
ws.Rows(i).Delete
i = i - 1
Exit For
End If
End If
Next j
Next i
End Sub
Function IsDuplicate(data As Variant, row1 As Long, row2 As Long, checkCols As Variant) As Boolean
Dim k As Long
For k = LBound(checkCols) To UBound(checkCols)
If data(row1, checkCols(k)) <> data(row2, checkCols(k)) Then
IsDuplicate = False
Exit Function
End If
Next k
IsDuplicate = True
End Function
Bonjour,
Merci de bien vouloir renseigner la version de ton produit Excel : 365 ? 2021 ? 2019 ? ...
Quel est le résultat attendu ? Peux-tu fournir un fichier exemple pour une aide adaptée du forum ?
Merci.
Excel 2010
Quant au fichier, il s'agit de PSI comme indiqué sur la photo
Je veux dire, lorsque le code produit est avec le nom du magasin, si la quantité est nulle et qu'il n'y a rien d'autre, alors il ne doit pas être supprimé.
Mais si vous regardez que le code produit et le nom du magasin sont des doublons, sachant qu'il y a un solde dans le magasin, qui est la quantité (12)
Le code est activé de sorte que le code produit, ainsi que le nom du magasin et la quantité, s'il est répété avec le numéro (zéro), le supprimeront, sachant qu'il y a un numéro (12) présent.
Quel est le problème avec le code ?
Je souhaite combiner le code produit avec le nom du magasin car ce que l'on entend par répétition n'est pas la quantité nulle, mais plutôt le code produit et le nom du magasin ensemble.
C'est pour clarifier
Sub KeepZeroDuplicates()
Dim ws As Worksheet
Dim checkRange As Range
Dim lastRow As Long
Dim checkCols As Variant
Dim data As Variant
Dim i As Long, j As Long, k As Long
'Set worksheet and last row
Set ws = ActiveSheet 'Replace with your sheet name if needed
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row 'Adjust column if needed
'Specify columns to check for duplicates and zero values
checkCols = Array(1, 2, 3, 4, 5) 'Replace with column numbers
'Store data in an array for efficient processing
data = ws.Range("A1:E" & lastRow).Value 'Adjust range as needed
'Loop through data array
For i = 2 To UBound(data, 1) 'Start from second row
For j = 2 To i - 1
'Check for duplicate in specified columns
If IsDuplicate(data, i, j, checkCols) Then
'Check if any value in check columns is zero
For k = LBound(checkCols) To UBound(checkCols)
If data(i, checkCols(k)) = 0 Then
ws.Rows(i).Delete
'i = i - 1
i = i
Exit For
End If
Next k
End If
Next j
Next i
End Sub
Function IsDuplicate(data As Variant, row1 As Long, row2 As Long, checkCols As Variant) As Boolean
Dim k As Long
For k = LBound(checkCols) To UBound(checkCols)
If data(row1, checkCols(k)) <> data(row2, checkCols(k)) Then
IsDuplicate = False
Exit Function
End If
Next k
IsDuplicate = True
End FunctionBref, il supprime la quantité si elle est nulle si le code produit et le nom du magasin sont en double
Si le code produit et le nom du magasin ne sont pas dupliqués et que la quantité est nulle, il ne sera pas supprimé
N.-B.
Cela est dû au fait de conserver les données du code produit et du nom du magasin dans les données de la feuille et d'empêcher leur suppression, même si la quantité est nulle.
Oui, c'est ce qui est requis
Cependant, si le code produit était 100 pour ce magasin, la quantité 12 devient nulle, elle ne sera donc pas supprimée car elle n'est pas dupliquée.
