Problème avec l'instruction Range() sur une boucle For

stid59

XLDnaute Nouveau
Bonjour à tous,

Après avoir importé des données sur le web, celles ci ne se mettent pas comme il faut dans Excel : les 1ères données se mettent en A2 : D2, les 2ème en A10 : D10, les 3èmes en A18 : D18 et ainsi de suite. J'aimerai qu'elle se mettent en A2 : D2, A3 : D3, A4 : D4 et ainsi de suite. C'est assez simple à l'aide d'une macro :

Range("A10 : D10").Select
Selection.Cut Destination:=Range("A3 : D3")
Range("A18 : D18").Select
Selection.Cut Destination:=Range("A4 : D4")
Range("A26 : D26").Select
Selection.Cut Destination:=Range("A5 : D5")

Cette macro fonctionne pour un nombre de données prédéfini mais le problème c'est qu'il peut y avoir 5 données comme 20. Il faudrait donc remplacé les chiffres par des variables. J'ai essayé ceci :

Dim i, j, k, l As Integer

For i = 10 To 80 Step 8
For j = 10 To 80 Step 8
For k = 3 To 10
For l = 3 To 10
Range("A" & i " : D " & j).Select
Selection.Cut Destination:=Range("A" & k " : D " & l)
Next l
Next k
Next j
Next i

Mais ça ne fonctionne pas au niveau des concaténations. Est ce que quelqu'un saurez me dire ce qui ne va pas ?

Merci d'avance
 
Dernière édition:

Odesta

XLDnaute Impliqué
Re : Problème avec l'instruction Range() sur une boucle For

Bonjour

Je propose non pas de copier/coller mais de supprimer les lignes vides.

Code:
ligne = 1
While ligne < SpecialCells(xlCellTypeLastCell).Row
If Cells(i, 1) <> "" Then
Range(Cells(ligne, 1), Cells(ligne, 4)).Delete Shift:=xlUp
Else
ligne = ligne + 1
Wend

Essayez et dites-moi si cela convient

Cordialement
 

porcinet82

XLDnaute Barbatruc
Re : Problème avec l'instruction Range() sur une boucle For

Salut,

Je vais peut être dire une bêtise, mais pourquoi ne pas plutôt supprimer les lignes vides entre les lignes pleines ?
Si oui, essaye ceci :
Code:
Sub Supp_ligne()
Dim i&

For i = Range("A65536").End(xlUp).Row To 1 Step -1
    If Cells(i, 1).Value = "" Then Rows(i).Delete
Next i
End Sub

@+

Edition : Tu as été plus rapide que moi Odesta !! ;-)
 

Odesta

XLDnaute Impliqué
Re : Problème avec l'instruction Range() sur une boucle For

et pour répondre à votre question, c'est pas vraiment la concaténation qui ne fonctionne pas, mais plutot les boucles :
For k = 3 To 10
For l = 3 To 10
Range("A" & i " : D " & j).Select
Selection.Cut Destination:=Range("A" & k " : D " & l)
Next l
Next k

Cela indique que k va passer de 3 à 10.
Pour chacunes des boucles l va aussi passer de 3 à 10.Ce qui donne pour k = 3 : l = 3 puis 4 puis 5 jusqu'à 10. Puis k = 4 : l=3, puis 4 puis 5, ect.

Pourquoi ne pas simplement mettre Range("A" & k " : D " & k)
pour que la ligne soit toujours la même ?

Et le problème est le même pour la ligne source.
il y a plusieur façons de répondre au problème, l'une d'elles consiste à faire une multiplication :

For i = 1 To 7
Range("A" & i * 8 +2 " : D " & i * 8 + 2 ).Select ' Explications : ligne = i * 8 + 2 => 1*8+2=10 de 8 en 8
Selection.Cut Destination:=Range("A" & i + 2 " : D " & i + 2) ' Explications : ligne = i + 2 => 1+2=3 de 1 en 1
Next l
Next k

Cordialement

EDIT : Bonjour porcinet82; nous avons la même façon de voir les choses ^^
De plus, je pense que travailler sur une autre feuille que la feuille d'import des données serait une bonne chose !
 
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : Problème avec l'instruction Range() sur une boucle For

Bonjour à tous

c'est fait, alors je donne...

Code:
Option Explicit
Sub test()
Dim i As Long, j As Integer
j = 3
For i = 10 To Range("A65536").End(xlUp).Row Step 8
    Cells(i, 1).Resize(, 4).Cut Cells(j, 1)
    j = j + 1
Next i
End Sub

Surtout histoire de saluer l'ami Romain:), cela faisait un bon bout de temps que l'on t'avais vu par ici...

bon après midi.
@+
 

stid59

XLDnaute Nouveau
Re : Problème avec l'instruction Range() sur une boucle For

Merci pour vos réponses si rapide :)

J'ai essayé votre version odesta mais il y a un problème à cette instruction : While ligne < SpecialCells(xlCellTypeLastCell).Row et le mot SpecialCells est surligné avec un message comme quoi la fonction n'est pas défini.

Par contre la version de porcinet82 fonctionne parfaitement mais j'ai du mal à la comprendre ... :s je ne suis qu'un petit stagiaire qui a appris les bases de chez bases en VB ^^
 

stid59

XLDnaute Nouveau
Re : Problème avec l'instruction Range() sur une boucle For

Bonjour et merci pour vos réponses :)

J'ai essayé les 2 versions. Celle d'Odesta avait une erreur au niveau de SpecialCells : VB disait que la fonction n'était pas déclarée. Par contre la version de porcinet82 fonctionne comme il faut même si je ne la comprends pas ... je ne suis qu'un stagiaire qui a appris les bases de chez bases en VB :s
 

stid59

XLDnaute Nouveau
Re : Problème avec l'instruction Range() sur une boucle For

Bonjour et merci pour vos réponses :)

J'ai essayé les 2 versions. Celle d'Odesta avait une erreur au niveau de SpecialCells : VB disait que la fonction n'était pas déclarée. Par contre la version de porcinet82 fonctionne comme il faut même si je ne la comprends pas ... je ne suis qu'un stagiaire qui a appris les bases de chez bases en VB :s
 

Odesta

XLDnaute Impliqué
Re : Problème avec l'instruction Range() sur une boucle For

J'ai essayé votre version odesta mais il y a un problème à cette instruction : While ligne < SpecialCells(xlCellTypeLastCell).Row et le mot SpecialCells est surligné avec un message comme quoi la fonction n'est pas défini.

Mon code est très mauvais et plein de bétises, ce qui prouve que 1) j'aurai dût le tester, et 2) faire attention à ce que je fais.
En effet, il faut toujours supprimer de bas en haut et non l'inverse....

Cdt
 

porcinet82

XLDnaute Barbatruc
Re : Problème avec l'instruction Range() sur une boucle For

re,

Quelques explications sur mon code pour que tu comprennes de quoi il retourne.
Code:
Sub Supp_ligne()
'Déclaration de la variable i en type Long
Dim i&

'Boucle allant de la dernière ligne pleine rencontrée en partant de la dernière ligne (d'un classeur excel avant 2003) jusqu'à la première ligne
For i = Range("A65536").End(xlUp).Row To 1 Step -1
    'Si la cellule ligne i, colonne 1 (donc colonne A) est vide, alors on supprime la ligne
    If Cells(i, 1).Value = "" Then Rows(i).Delete
Next i
End Sub

Au passage, salut Pierrot !! :) C'est vrai que ca fait un moment que je ne suis pas passé ici car je n'avais pas vraiment le temps. Mais comme je dois former une collègue, je me remets doucement dans le bain !! ;)

@+
 

Discussions similaires

Statistiques des forums

Discussions
312 502
Messages
2 089 047
Membres
104 011
dernier inscrit
dfr