XL 2016 Boucle sur lignes avec isempty() et sauts de lignes

maroon

XLDnaute Junior
Bonjour,

Avec cette macro j'aimerais copier les ligne d'une feuille 1 vers une feuille 2 en sautant une ligne à chaque fois sur la feuille 2. En revanche si la ligne i de la feuille 1 est vide alors ne rien faire et passer à la ligne suivante. Avec le code suivant:
VB:
Dim i&
Dim j&
Dim line As Variant

Derlig = worksheets("feuille1").Range("A" & Rows.Count).End(xlUp).Row
j = 1

For i = 1 To Derlig
    line = worksheets("feuille1").Rows(i)
           If IsEmpty(Rows(i).Value) = False Then
                  worksheets("feuille2").Rows(j).Value = line
                  j = j + 2
           Else: j = j
           End If
  
Next i
Mais en faisant du "pas à pas " je me rends compte que même lorsque la ligne rows(i) est vide la variable "j" est incrémentée à "j+2" alors que je voudrais que "j" reste à sa valeur et ne passe à j+2 que si rows(i) est non vide...

Si quelqu'un peut m'aider merci d'avance!!
 
Dernière édition:
Solution
Re

Voici comment je ferai (sans trop me casser la tête)
;)
VB:
Sub Recopie()
Dim T, tmp As Worksheet, i&
Sheets("Feuil1").Copy After:=Sheets(Sheets.Count)
Set tmp = ActiveSheet
tmp.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
T =tmp.[A1].CurrentRegion.Value
Sheets("Feuil2").Cells(1).Resize(UBound(T, 1), UBound(T, 2)) = T
Application.DisplayAlerts = False
tmp.Delete
With Sheets("Feuil2")
For i = .Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
.Cells(i, 1).Offset(1).EntireRow.Insert
Next
End With
End Sub
NB: La feuille 2 doit être vide avant de tester
Et sur la feuille 1 , il doit y avoir des données et du vide en colonne A

EDITION: Bonjour jmfmarques.

maroon

XLDnaute Junior
Re,
Oui c'est bien ça, mais copier sur la feuille 2 en sautant une ligne à chaque fois.
Le problème c'est que sur la feuille 1 il y a des fois déjà des lignes vides et il ne faudrait pas les prendre en compte.
Donc si sur la feuille 1 j'ai :
ligne 1 = contenu1
ligne 2 = contenu 2
ligne 3 = vide
ligne 4 = vide
ligne 5 = contenu5
ligne 6 = contenu6

Sur feuille 2 il faut:
ligne 1 = contenu1
ligne 2 = vide
ligne 3 = contenu 2
ligne 4 = vide
ligne 5 = contenu5
ligne 6 = vide
ligne 7 =contenu6

Mais j'aimerais aussi comprendre pourquoi le code que j'utilise ne fonctionne pas puisque je pensais avoir bien placé le "j = j+2" ? :oops:
 

jmfmarques

XLDnaute Accro
Bonjour
1) Un rang est un objet et non une chaîne de caractères
2) On affecte un objet à une variable par une instruction Set et non une simple égalité
3) la fonction Isempty n'accepte comme paramètre qu'une chaîne de caractères
4) un rang n'a pas de valeur; ce sont les cellules qui ne composent, qui en ont.

5) et surtout : préciser la propriété utilisée n'est pas un luxe, mais un devoir. s'en remettre au bon vouloir de VBA pour deviner de quelle propriété il s'agit relève de l'audace et de l'aventure.

Il est peut-être temps de commencer .... par le ... commencement (l'apprentissage des rudiments)

EDIT : ce serait par ailleurs la moindre des choses de coller ici le code tel qu'écrit dans ton classeur (et donc par copier/coller rigoureux). Un détail du code que tu nous montres met en évidence que ce n'est pas le cas.
 
Dernière édition:

maroon

XLDnaute Junior
Bonjour jmfmarques,

Merci pour ta réponse!
Il est peut-être temps de commencer .... par le ... commencement (l'apprentissage des rudiments)
Je suis tout à fait d'accord mais j'ai mis de côté l'apprentissage pour le moment (impératif professionnel, mais j'ai l'intention de m'y remettre, j'avais commencé il y a quelques années...), si je poste des questions c'est parce que je fais quelques macros ponctuellement pour facilité un travail que j'ai à faire....
1) Un rang est un objet et non une chaîne de caractères
Je ne comprends où j'ai déclarer une chaîne de caractère? Pourrais-tu préciser cela?
2) On affecte un objet à une variable par une instruction Set et non une simple égalité
Je l'ai fait au cours de mes différentes tentatives mais c'est lorsque je retirais le "set" que ça fonctionnait (je sais que ce procédé est dangereux mais comme j'ai dit je cherchais une solution qui marcherait juste dans mon cas très ponctuellement)
la fonction Isempty n'accepte comme paramètre qu'une chaîne de caractères
ok, j'ai essayé avec d'autres méthodes (ifnot...is nothing, while, loop...) mais j'y arrivais pas...
un rang n'a pas de valeur; ce sont les cellules qui ne composent, qui en ont.
Ok

et surtout : préciser la propriété utilisée
je ne comprends pas bien de quoi il s'agit?...

J'essaye encore avec les infos et cours que je trouve... A+
 

Staple1600

XLDnaute Barbatruc
Re

Voici comment je ferai (sans trop me casser la tête)
;)
VB:
Sub Recopie()
Dim T, tmp As Worksheet, i&
Sheets("Feuil1").Copy After:=Sheets(Sheets.Count)
Set tmp = ActiveSheet
tmp.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
T =tmp.[A1].CurrentRegion.Value
Sheets("Feuil2").Cells(1).Resize(UBound(T, 1), UBound(T, 2)) = T
Application.DisplayAlerts = False
tmp.Delete
With Sheets("Feuil2")
For i = .Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
.Cells(i, 1).Offset(1).EntireRow.Insert
Next
End With
End Sub
NB: La feuille 2 doit être vide avant de tester
Et sur la feuille 1 , il doit y avoir des données et du vide en colonne A

EDITION: Bonjour jmfmarques.
 
Dernière édition:

maroon

XLDnaute Junior
Salut Staple1600,

Merci pour ton aide et le code que tu m'as envoyé!
Cependant je n'arrive pas à le faire fonctionner:
** le code crée une nouvelle feuille mais ne copie pas les données (sauf le bouton de macro qui est sur ma feuille 1)
** sur ma feuille 1 la colonne A n'est pas vide (je l'ai vidée pour tester ton code...) et à terme ce n'est pas possible pour moi de laisser la colonne A vide!
** le code est un peu compliqué pour moi donc c'est difficile de l'adapter (peut-être avec quelques commentaires sur les lignes je pourrais y arriver... si c'est pas trop demander:oops:)

Mais quand même étant donné que le code que j'ai envoyé fonctionnait (il copie bien les lignes de la feuille 1 sur la feuille 2 en ajoutant un saut d'une ligne à chaque fois mais il prends en compte les lignes vides de la feuille 1, ce que je ne veux pas comme expliqué dans mon msg #5) donc je pensais qu'avec une adaptation légère ça pourrait fonctionner?...

@jmfmarques oui les lignes vides de la feuilles 1 sont entièrement vides mais je ne veux pas que mon incrémentation les prennent en compte comme expliqué en #5. J'essaye d'adapter avec les commentaires que tu m'as fait en #6...
 

Discussions similaires

Statistiques des forums

Discussions
312 276
Messages
2 086 711
Membres
103 377
dernier inscrit
fredy45