Votre question

VBA Supprimer lignes sous condition

Tags :
  • Next
  • Programmation
  • VB
Dernière réponse : dans Programmation
16 Mai 2011 15:20:11

Bonjour,

Je suis débutant en VBA, et une fonction me résiste.
Je cherche à supprimer toutes les lignes de mon tableau dans lesquelles la cellule de la colonne S ne contient PAS l'expression #N/A.

J'ai essayé ce code, mais il m'affiche le message d'erreur "incompatibilité de type".

  1. Dim nbligne As Long
  2. nbligne = Range("S2").CurrentRegion.Rows.Count
  3.  
  4. For i = nbligne To 1 Step -1
  5.  
  6. If Not Cells(i, 19) = "#N/A" Then
  7. Cells(i, 19).EntireRow.Delete
  8.  
  9. End If
  10. Next i



Je vous remercie par avance :) 

Autres pages sur : vba supprimer lignes condition

17 Mai 2011 09:46:30

salut essaye cela :
  1. Dim i As Integer
  2. Dim f As Worksheet
  3. Set f = Worksheets(1)
  4.  
  5. For i = f.Cells(f.Rows.Count, 1) .end(xlup)To 1 Step -1
  6. If Cells(i, 19).Text <> "N/A" Then
  7. f.Rows(i).Delete
  8. End If
  9. Next
m
0
l
a b L Programmation
17 Mai 2011 13:38:28

Salut,

Merci d'indenter correctement ton code. Pour 10 lignes, on pourrait s'en foutre. Spa une raison. Fais-le par principe.

Bien vu le Step -1 ;) 

Tu remontes jusqu'à 1. Alors pourquoi ce S2 ? Imagine que la cellule S1 soit vide. Ton nombre de lignes ne correspondra pas à l'adresse de la dernière ligne de ta zone. Le code à adopter est un peu plus lourd :
  1. Dim zone As Range
  2. Dim der_ligne As Long
  3. Set zone = Range("S2" ).CurrentRegion
  4. der_ligne = zone.Rows(zone.Rows.Count).Row


Ton code :
  1. Cells(i, 19).EntireRow

Le mien :
  1. Rows(i)
:sol: 

A la ligne 6, tu compares une cellule et un texte. Ce n'est pas la cellule qu'il faut prendre en considération, mais sa valeur. Donc il faut écrire :
  1. Cells(i, 19).Value
.

"#N/A" signifie Not applicable, et ce n'est pas du texte. Mais une erreur xlErrNA, qu'il faut comparer à celle de la cellule.

m
0
l
Contenus similaires
17 Mai 2011 13:46:28

zeb a dit :

"#N/A" signifie Not a number, et ce n'est pas du texte. Mais une valeur, xlErrNA, qu'il faut comparer à celle de la cellule.


ah ok merci ;) 
m
0
l
17 Mai 2011 14:31:23

Merci pour vos réponses, j'ai modifié le code qui ne marche toujours pas, cela bloque toujours à la ligne 7 :( 

  1. Dim zone As Range
  2. Dim der_ligne As Long
  3. Set zone = Range("S2").CurrentRegion
  4. der_ligne = zone.Rows(zone.Rows.Count).Row
  5.  
  6. For i = der_ligne To 1 Step -1
  7. If Not Cells(i, 19).Value = "xlErrNA" Then
  8. Cells(i, 19).EntireRow.Delete
  9.  
  10. End If
  11. Next i


Sachant que mon #N/A n'est pas une formule mais bien une valeur. J'ai en effet copié dans ma colonne S les résultats donnés par une formule d'une autre colonne.
m
0
l
a b L Programmation
17 Mai 2011 15:59:18

xlErrNA est une constante...
m
0
l
17 Mai 2011 16:03:32

salut,

eh salvation, on viens de te dire plus haut que n/a n'est pas du texte... pk tu met entre ".." ?
si c'est une valeur que prend la cellule et bien enleve les guillemets . !!
m
0
l
17 Mai 2011 17:34:17

Mon nouveau code bloque toujours à la ligne 7
  1. Dim zone As Range
  2. Dim der_ligne As Long
  3. Set zone = Range("S2").CurrentRegion
  4. der_ligne = zone.Rows(zone.Rows.Count).Row
  5.  
  6. For i = der_ligne To 1 Step -1
  7. If Not Cells(i, 19).Value = xlErrNA Then
  8. Rows(i).Delete
  9.  
  10. End If
  11. Next i


Je suis un vrai débutant, je ne comprends pas en quoi le fait que cele soit une constante diffère...
m
0
l
17 Mai 2011 17:42:59

J'ai réussi ! Pour info le code :

  1. Dim zone As Range
  2. Dim der_ligne As Long
  3. Set zone = Range("S2").CurrentRegion
  4. der_ligne = zone.Rows(zone.Rows.Count).Row
  5.  
  6. For i = der_ligne To 1 Step -1
  7. If Not Cells(i, 19).Text = "#N/A" Then
  8. Rows(i).Delete
  9.  
  10. End If
  11. Next i
m
0
l
a b L Programmation
17 Mai 2011 17:48:01

INDENTATION DU CODE. DERNIERE SOMMATION.
[:zeb:4]

-----------------------------------

Oups, à faire tout de tête, j'ai oublié un tout petit détail :honte:
Merci de relire mon message précédent.

If faut écrire
  1. If Cells(i, 19).Value <> CVErr(xlErrNA) Then


-----------------------------------

Pour connaître la différence entre xlErrNA et "xlErrDiv0", merci d'étudier le code suivant :
  1. MsgBox xlErrNA
  2. MsgBox "xlErrNa"

m
0
l