Problème de boucle FOR pour trouver les valeurs manquantes

  • Auteur de la discussion Boubou129
  • Date de début

Boubou129

Nouveau membre
Bonjour,

Je suis débutante en VBA et je dispose d'une feuille TEST où il y a une colonne avec des noms et à coté une colonne où il y a soit une valeur soit #N/A, mon but étant de rapatrier les N/A dans la feuille ERREUR.

J'ai écris ce programme :

Sub Erreur()
Sheets("TEST").Select
For i = 1 To 3
If IsError(Cells(i, "B")) Then
Cells(i, "A").Select
Selection.Copy
Sheets("ERREUR").Select
Cells(i + 1, "A").Select
ActiveSheet.Paste
End If
Next i
End Sub

Le problème c'est qu'il ne fonctionne que pour la 1ere ligne, la boucle FOR ne tourne pas si quelqu'un peu m'aider je l'en remercie.
 

PC-Facile13

Nouveau membre
Bonsoir,

Ton problème ne vient pas de la boucle elle-même, mais du fait qu'il faille resélectionner ta feuille "TEST" si une erreur a été trouvée, ce qui donne:

Sub Erreur()
Sheets("TEST").Select
For i = 1 To 3
If IsError(Cells(i, "B")) Then
Cells(i, "A").Select
Selection.Copy
Sheets("ERREUR").Select
Cells(i + 1, "A").Select
ActiveSheet.Paste
Sheets("TEST").Select
End If
Next i
End Sub
 

zeb

Modérateur
Bonjour,

Merci de respecter le règlement : utilisez la balise
Code:
 pour présenter vos morceaux de code !
 

zeb

Modérateur
Bien que ton code n'ait pas été correctement présenté, PC-facile, j'ai lu ce que tu proposes à Boubou.

M'enfin, tu cherche à faire clignoter Excel comme un sapin de Noël ?
A quoi bon tous ces Select ?

Code:
Option Explicit
Sub Erreur
	Dim ws_test As Worksheet
	Dim ws_errr As Worksheet
	Dim i       As Long
	
	Set ws_test = Worksheets("TEST")
	Set ws_errr = Worksheets("ERREUR")

	For i = 1 To 3
		If IsError(ws_test.Cells(i, "B")) Then
			ws_test.Cells(i, "A").Copy Destination:=ws_errr.Cells(i, "A")
		End If
	Next
End Sub

Voici une bonne façon de faire. Pas de Select inutile, des variables bien déclarées (on peut supposer que dans les morceaux de code proposés, cela avait été omis ;) ), du code bien indenté, et donc pas de rappel de variable derrière le Next, nous ne sommes plus en 1985 !

Sauf que je suppose que 1 To 3 c'est pour l'exemple.
Autre problème, si la ligne 1 et la ligne 3 sont en erreur, nos données se retrouvent en ligne 1 et 3 sur l'autre feuille, avec un "trou" en ligne 2.

Je propose donc de déclarer une cellule dans la feuille cible, et de faire bouger cette cellule au besoin.
Ensuite, on parcourt la feuille source, ligne par ligne et on copie les valeurs intéressantes vers la cible.

Code:
Sub Erreur
	Dim row    As Range ' ligne dans TEST
	Dim target As Range ' cellule dans ERREUR
	
	Set target = Worksheets("ERREUR").Cells(1, 1)
	
	For Each row In Worksheets("TEST").Cells.Rows

		' Il n'est pas nécessaire de parcourir toute la feuille.
		' On s'arrête à la première ligne vide.		
		If row.Cells(1) Then 
			Exit For
		End If
		
		If IsError(row.Cells(2)) Then
			target.Value = row.Cells(2).Value
			Set target = target.Offset(1)
		End If
	Next
End Sub
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 103
Membres
1 586 287
Dernier membre
lucilleguffey
Partager cette page
Haut