XL03 VB Agrandissement plage de selection offset gauche & droite

Résolu/Fermé
SpcCwb Messages postés 65 Date d'inscription mardi 7 mai 2013 Statut Membre Dernière intervention 26 novembre 2020 - Modifié par jordane45 le 7/01/2015 à 13:27
SpcCwb Messages postés 65 Date d'inscription mardi 7 mai 2013 Statut Membre Dernière intervention 26 novembre 2020 - 7 janv. 2015 à 15:18
Bonjour CCM,

Et une très bonne année 2015 à tous!

Mon soucis: je pars d'un
For each c in range("D2:D787")
    if c.value = "" or c.value = 0 Then
 

Et là j'aimerais sélectionner les 3 cellules à gauche de c et la suivante sur la droite

J'ai essayé de bricoler quelque chose du genre:
         range("c.offset(,-3):c.offset(,1).select
         Selection.Delete Shift:=xlUp  

(oui le but est de supprimer les cellules se trouvant sur la même ligne que c ( mais pas au delà de la colonne E)

J'ai farfouillé à gauche et à droite et je crois bien qu'à force je suis plus capable de dicerné le bon du mauvais.

Un petit coup de main svp? :D

EDIT : ajout des balises de code
A voir également:

3 réponses

jordane45 Messages postés 38173 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 10 mai 2024 4 665
7 janv. 2015 à 13:27
Bonjour,

1 - Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum.
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

2 -
Sub toto()
For Each c In Range("D2:D787")
    If c.Value = "" Or c.Value = 0 Then
     Range(c.Offset(, -3), c.Offset(, 1)).Select
         Selection.Delete Shift:=xlUp
     End If
Next
End Sub

0
SpcCwb Messages postés 65 Date d'inscription mardi 7 mai 2013 Statut Membre Dernière intervention 26 novembre 2020 1
7 janv. 2015 à 14:41
Désolé jordane, un oubli de ma part...
0
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 078
7 janv. 2015 à 13:36
Bonjour,

Le problème est que ton code s'arrêtera sur ta dernière cellule de ta sélection, pour que le code s'arrête sur la première cellule vide ajoute un exit sub

Range(c(1, 1), c(1, -1)).Select
Exit Sub
0
SpcCwb Messages postés 65 Date d'inscription mardi 7 mai 2013 Statut Membre Dernière intervention 26 novembre 2020 1
Modifié par SpcCwb le 7/01/2015 à 14:40
J'ai essayé ton code Mike, alors le coup du Exit Sub n'est pas nécessaire car une cellule vide dans la colonne D ne signifie pas celles qui suivent le sont également.

Donc pour faire ce que je décris dans ma problématique ce code fonctionne très bien:

For Each c In range("D2:D787")
If c.Value = "" Or c.Value = 0 Then
range(c(1, -2), c(1, 2)).Select
Selection.Delete Shift:=xlUp
End If
Next c


En revanche ça soulève un autre problème, lors de la suppression de la ligne en cas de cellule c vide, la ligne c+1 remonte d'un cran (logique) et VBA continue donc à lire le code et passe sur Next c (logique encore une fois), le problème c'est que du coup la cellule c+1 n'est pas traité par le code...

Pour être plus claire, admettons que la première cellule vide c soit en D1, les cellules D2 et D3 étant vide aussi (ce que je souhaite serait donc que ces 3 lignes soient supprimées...). Le code commence, la cellule D1 qui correspond donc à c1 (au niveau du compteur du For) est supprimée, les cellules D2 et D3 montent donc d'une ligne chacune et se retrouvent respectivement en D1 et D2 ...or la prochaine cellule c, la c2 (toujours au niveau du compteur du For) va correspondre à la cellule D2 qui sera à son tour supprimée, ce qui nous laisse avec la cellule D1 (anciennement D2) qui est pourtant vide.

Une idée sur le code qui me permettrait de traité ces cellules "oubliées"?
0
jordane45 Messages postés 38173 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 10 mai 2024 4 665
7 janv. 2015 à 14:45

t VBA continue donc à lire le code et passe sur Next c (logique encore une fois), le problème c'est que du coup la cellule c+1 n'est pas traité par le code...

Oui c'est normal..
Il faut donc faire ta boucle en partant du bas et en remontant....

Sub toto()
Dim L as Long
Dim c as Range

For L = 787 to 2 step -1
Set c = Cells(L,"D")
    If c.Value = "" Or c.Value = 0 Then
     Range(c.Offset(, -3), c.Offset(, 1)).Select
         Selection.Delete Shift:=xlUp
     End If
Next
End Sub

0
SpcCwb Messages postés 65 Date d'inscription mardi 7 mai 2013 Statut Membre Dernière intervention 26 novembre 2020 1
7 janv. 2015 à 15:18
Plus qu'une chose à dire: PARFAIT, MERCI BEAUCOUP vous deux!
0