Faire tourner ma macro en boucle jusqu'à cellule vide [Résolu]

- - Dernière réponse :  jrmsky - 21 nov. 2012 à 15:32
bonjour le forum

habituellement je trouve des réponses que j'adapte ensuite à mon problème,
mais cette fois ci je bloque sur quelque chose qui me parait pourtant simple.
oui je suis débutant en macro

je souhaite que ma macro tourne en boucle jusqu'à ce que la cellule selectionnée ("b3") est vide
       
For i = 1 To n

If Range("b3") <> "" Then
    Range("B3:B5").Select
    Selection.Copy
    Sheets("Feuil2").Select
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    Rows("1:1").Select
    Application.CutCopyMode = False
    Selection.Insert Shift:=xlDown
    Sheets("Feuil1").Select
    Rows("3:7").Select
    Selection.Delete Shift:=xlUp
    
Next i
Else
End If
End Sub


merci d'avance à ceux qui auront prit le temps de lire ce sujet et à ceux qui pourront m'aider à solutionner mon petit problème

et avec quelques explications ce serait parfait pour mon instruction.


bonne journée à tous
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
3
Merci
Salut

Ton code manque de commentaires.
On ne sait pas trop par quel miracle B3 va devenir vide.
Remplace ta boucle For-Next et le test de B3 vide par un Do-Loop :
Do While Range("B3").Value <> ""
    ' Ton code
    DoEvents ' nécessaire dans toutes les boucles
Loop
Le DoEvents permet de garder la maitrise de Excel si jamais la boucle ne se terminait jamais; en cas d'erreur de programme par exemple; et ça arrive fréquemment, je te le garantis.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)

Merci cs_Jack 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 103 internautes ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
14319
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 décembre 2018
3
Merci
Bonjour,

A la place d'une boucle For, utilises plutôt une boucle Do/Loop.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---

Merci NHenry 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 103 internautes ce mois-ci

Commenter la réponse de NHenry
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
3
Merci
Attention aussi :
Tu changes de feuille dans ta boucle.
Range("B3") va prendre la cellule B3 de la feuille courante.
Ca peut donner des résultats bizarres.
Pense à bien préciser le nom de la feuille :
Do While Sheets("Feuil1").Range("B3").Value <> ""
(à vérifier)

Ton code est issu de l'enregistreur de macro.
Il est bardé de ".Select" ce qui veut dire que les cellules seront sélectionnées à l'écran.
Si, pendant que ta macro tourne, quelqu'un clique ailleurs, il y a un risque que ta macro perde les pédales.
Donc, après avoir récupéré du code, pense à l'optimiser pour faire disparaitre les ".Select" et autre "Selection", exemple :
    Range("B3:B5").Select
    Selection.Copy
    ' est équivalent à 
    Range("B3:B5").Copy
    '------------------------------------------------------------
    Sheets("Feuil2").Select
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteAll, _
                           Operation:=xlNone, _
                           SkipBlanks:= False, _
                           Transpose:=True
    ' est équivalent à 
    Sheets("Feuil2").Range("A1").PasteSpecial Paste:=xlPasteAll, _
                                              Operation:=xlNone, _
                                              SkipBlanks:= False, _
                                              Transpose:=True

Merci cs_Jack 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 103 internautes ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
Bonjour,
Et la première cellule vide de la colonne B est tout simplement à la ligne :
Range("B1:B" & Rows.Count).SpecialCells(xlCellTypeBlanks).Row
Reste à savoir si la formulation a été bonne et qu'il ne s'agit pas de la ligne suivant la dernière ligne remplie (car c'est autre chose), d'une colonne, hein ... (formulation, quand tu nous tiens ...)

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
0
Merci
merci pour vos réponse, la macro tourne correctement maintenant, j'ai juste fais une recherche pour trouver qu'il fallait placer Loop entre end If et end Sub

Ton code manque de commentaires.
On ne sait pas trop par quel miracle B3 va devenir vide.
Remplace ta boucle For-Next et le test de B3 vide par un Do-Loop :


je récupère des info sur internet pour alimenter un tableau excel

les données bruts et je veux:
sont du genre:
A1 A1 A2 A3
A2 B1 B2 B3
A3 C1 ...

B1
B2
B3

C1
...

je supprime les 3 lignes copier(feuil 1) après recopie transposée (feuil 2) ou j'y insert une ligne ensuite pour laisser la place à la copie suivante , B1 passe en A1 (ca se passe en Feuil1 "B3")
et ainsi de suite, à la derniere triple ligne éffacé de mon tableau la macro s'arretera

merci à vous pour la réponse et pour le petit cours de syntax macro
Commenter la réponse de jrmsky
0
Merci
à la validation ça a retirer les espacements en surnombre

il faut lire:

donnée brut feuille 1

A1
A2
A3

B1
B2
B3

C1 ...


et j'obtiens feuille 2:

A1 A2 A3
B1 B2 B3
C1 ...
Commenter la réponse de jrmsky

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.