Bonsoir.
Une piste:
j'ai cru comprendre que tu cherches à purifier une plage excluant les lignes où la colonne c contiendrait une valeur d'erreur.
J'ai noté que la première ligne est inutile.
Je proposes de copier la feuille
1 2 3
| dim Cible as range,rx as range
Sheets("Probleme").Copy Sheets.Count
Sheets("Probleme").UsedRange.Clear |
Créer la valeur d'erreur dans la première ligne de la colonne 3
1 2
| Set rx = Sheets(Sheets.count).Range("C1")
rx.Formula="=MATCH(""wwy"",RC[1]:RC[3],0)" |
Demander à Excel un objet range qui exclue toutes les cellules qui contiennent cette valeur
Set cible = Sheets(Sheets.count).Range("a1").CurrentRegion.Columns(3).ColumnDifferences(rx)
il te faut 5 variables numérique de type Long
1 2 3 4 5 6 7
| Dim Area_Compte as long, Area_Lignes as Long, Dest_Ligne as Long, n
as long, i as Long
Do
n=n+1
Loop Until n = areas_Compte |
Tout se déroule dans une seule boucle. Les propriétés range nous éviteront un codage fastidieux de boucles.
Cette boucle ci-dessus balaie les Areas renvoyés par cible.
l'idée serait de faire une déduction dans cette boucle pour renvoyer la plage correspondante aux coordonnée de l'areas(n) sans passer par un balayage ligne par ligne.
Il faut savoir bien poser tes crans pour la destination:
Dest_Ligne = Sheets("Probleme").Range("a1").CurrentRegion.Rows.count
te renverra toujours la dernière ligne de données à incrémenter d'un pas.
Area_Lignes = Cible.Areas(n).Rows.Count
tu obtiens le nombre de lignes de l'areas en cours.
Area_Lignes et Dest_Ligne te suffisent pour déterminer la nouvelle plage de destination.
pour t'orienter un peu plus
Sheets("Probleme").Range(cells(dest_ligne + 1,1),cells(dest_ligne + area_lignes+1,nombre_colonnes)).value=cible.areas(n).value
N'oublie pas qu'avant d'entrer dans la boucle, il te faut activer la feuille Problème
sheets("probleme").activate
n'oublie pas qu'il est essentiel de désactiver le rafraîchissement d'écran et éventuellement mettre le mode de calcul à manuel en début de procédure,
en fin de procédure, remettre le rafraîchissement d'écran en place après avoir supprimé la copie crée.
Sheets(Sheets.count).Delete
Application.ScreenUpdating=True
je penses t'avoir fourni suffisamment d'indications pour aborder ton problème.
Bon code!
Les explications ci-haut sont incomplètes.
En fait il s'agit d'obtenir la plage purifiée et non la colonne.
Il faut référencer directement la plage avec le nom de colonne n°1 et le nom de colonne en dernier:
Sheets("Probleme").Range.....Value = Sheets(Sheets.count).Range("A" & Cible.Areas(n).Row & ":C" & Cible.Areas(n).Row + Area_Lignes).Value
Autre chose:
Application.InterActive=False
Vu la longueur du temps, interdire les manipulations Clavier/Souris durant l'opération éviterait l'inattendu.
Ne pas oublier de le remettre à True à la fin.
Partager