Aide sur une fonction à base de select case
Bonjour à tous,
Mon projet: je veux écrire une fonction qui en fonction du contenu de la cellule supprime ou non la ligne. Les lignes à garder sont celle dont la valeur de la cellule dans la colonne A commence par 13 ou 16 ou 29 ... (voir dans le code ci dessous), le nombre de cas à garder étant exhaustif. Les lignes à supprimer sont donc celle qui ne répondent pas à ces critères.
En résumé, je veux inspecter la valeur de la Cellule A de la ligne (pour être précis seuls les 2 premiers chiffres suffisent) afin de déterminer si la ligne doit être supprimée ou non. Je précise que le contenu de la colonne A est un nombre stocké sous forme de texte.
Voilà ce que j'ai fait:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| Sub SuppLigneCondition()
Dim vCellule As Range
Dim vCol As Range
Dim vCode As String
Set vCol = Range("A4:A" & Range("A65536").End(xlUp).Row)
For Each vCellule In vCol
vCode = Left(vCellule.Value, 2)
Select Case vCode
Case "13"
Case "16"
Case "29"
Case "30"
Case "37"
Case "42"
Case "58"
Case "62"
Case "65"
Case "72"
Case Else
vCellule.EntireRow.Delete
End Select
Next vCellule
End Sub |
Le problème c'est tout simplement que ça foire ! Après l'éxécution de la macro il me reste encore des lignes non désirées (dont la valeur dans la cellule A commence par 10 par exemple ou même par des lettres) et je suis quasi sur que des lignes que je dois garder sont supprimées.
Je ne sais pas s'il s'agit d'une erreur de syntaxe ou d'une mauvaise utilisation de select case.
Merci de m'aider à résoudre ce mystère !:ccool:
Tout seul comme un grand !!
Problème résolu!!
La cause en supprimant la ligne pendant la boucle celle-ci saute une ligne (la ligne en dessous de la ligne analysée remonte d'un cran et n'est pas éxaminée).
Solution : créer une variable Range qui contient toute les lignes à supprimer pendant la boucle et après la boucle on peut effacer la plage.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| Sub SuppLigneCondition()
Dim vCellule As Range
Dim vCol As Range
Dim vCode As String
Dim vLigneSupp As Range
Set vCol = Range("A4:A" & Range("A65536").End(xlUp).Row)
For Each vCellule In vCol
vCode = Left(vCellule.Value, 2)
Select Case vCode
Case "13"
Case "16"
Case "29"
Case "30"
Case "37"
Case "42"
Case "58"
Case "62"
Case "65"
Case "72"
Case Else
If vLigneSupp Is Nothing Then
Set vLigneSupp = vCellule.EntireRow
Else
Set vLigneSupp = Union(vLigneSupp, vCellule.EntireRow)
End If
End Select
Next vCellule
vLigneSupp.Delete
End Sub |