Problème double boucle For Next

Hadriennoel Messages postés 7 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 19 novembre 2010 - 20 sept. 2010 à 13:59
djokalif Messages postés 9 Date d'inscription samedi 29 septembre 2007 Statut Membre Dernière intervention 7 janvier 2011 - 29 déc. 2010 à 20:58
Bonjour,

Je rencontre un problème sur une double boucle For Next. J'aimerais copier coller chaque ligne de la feuille 1 du classeur repartition geographique jusqu'à la dernière sur la feuille d'un autre classeur. Le comptage commencerait a partir de la première ligne vide et le but est de coller sur chaque nouvelle ligne vide. Seulement il n'intègre pas de manière dynamique ce comptage (juste deux lignes seront trouvées). De plus le copier coller se renouvelle sur les lignes antérieurement ajouté, les ecrasant donc au passage.

Merci de votre future aide! Pour information je suis en excel 2007

Sub test2()

Dim d As Integer
Dim e As Integer
Dim i As Integer
Dim j As Integer

d = Workbooks("repartition geographique.xlsx").Worksheets(1).Columns(1).Find("", , , , xlByRows, xlNext).Row
e = Workbooks("base de données des fonds.xlsm").Worksheets("Répartition géographique pays").Columns(1).Find("", , , , xlByRows, xlNext).Row

For i = 2 To d - 1
For j = e To 10


Workbooks("repartition geographique.xlsx").Worksheets(1).Activate
Rows(i).Select
Selection.Copy

Workbooks("base de données des fonds.xlsm").Worksheets("Répartition géographique pays").Activate
Rows(j).Select
ActiveSheet.Paste

Next
Next

End Sub

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 sept. 2010 à 15:00
Salut

-1- Pour trouver la première cellule vide d'une colonne, on peut regarder dans l'aide, déjà, puis s'inspirer de ce code simple :
    Dim oRange As Range
    Set oRange = Range("A1").End(xlDown)
    Set oRange = oRange.Offset(1, 0)
    oRange.Value = "Et voilà"
Code ressemblant à ce qui serait généré en faisant un Ctrl-Flèche_Bas en tête d'une colonne pour trouver la dernière cellule pleine puis en allant à la cellule suivante.

-2- Ensuite, pense à utiliser les objets.
Dans ton cas, ton programme passe son temps à changer de classeur/feuille. A l'écran, ça doit bien flasher !
Commence par sélectionner un Range complet et pas se baser sur une boucle, pour identifier les données sources :
    Dim oFeuilleOrigine As Worksheet
    Dim oRangeOrigine As Range
    Set oFeuilleOrigine = Workbooks("repartition geographique.xlsx").Worksheets(1)
    Set oRangeOrigine = oFeuilleOrigine.Range( _
                             oFeuilleOrigine.Range("A1"), _
                             oFeuilleOrigine.Range("A1").End(xlDown).Offset(1, 0))

Idem pour l'adresse de la première cellule cible :
    Dim oFeuilleCible As Worksheet
    Dim oRangeCible As Range
    Set oFeuilleCible = Workbooks("base de données des fonds.xlsm").Worksheets("Répartition géographique pays")
    Set oRangeCible = oFeuilleCible.Range("A1").End(xlDown).Offset(1, 0)

-3- La recopie se fait simplement en collant les Ranges :
    oRangeOrigine.Copy
    oRangeCible.PasteSpecial xlPasteAll


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)
0
Hadriennoel Messages postés 7 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 19 novembre 2010
20 sept. 2010 à 15:36
Rebonjour !

Tout d'abord merci pour ton aide et la rapidité avec laquelle tu as répondu !!

Je dois dire que ton code simplifie bien des choses, ne serait ce que pour eviter les flashs ;).
Toutefois je dois parametrer dans le code la colonne sortante du range spécifié afin d'obtenir la largueur voulue.
oFeuilleOrigine.Range("A1").End(xlDown).Offset(1, 0))

Ce qui peut ne pas etre un trop gros probleme sachant que normallement le nombre de colonne du tableau ne devrait pas changer dans le futur.

Mais ce qui me rebloque derrière, sauf si il existe une astuce, c'est que le copié/collé bloque entièrement le tableau alors que j'aurais aimé pouvoir écraser les données d'un doublon occasionnel sur la ligne qu'il occupait précédemment.

En tout cas encore merci de ton temps !

Hadrien
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
20 sept. 2010 à 19:32
A1 : Oui, si tu dois copier les 4 premières colonnes, tu peux remplacer A1 par la syntaxe adéquat : ("A1:D1").End(...

Doublons : là, ce n'est pas la même manipulation et il faudra surement énumérer chaque ligne pour faire ce tri.
0
Hadriennoel Messages postés 7 Date d'inscription mercredi 12 mars 2008 Statut Membre Dernière intervention 19 novembre 2010
21 sept. 2010 à 08:55
Yep ca marche ! Merci encore en tout cas pour ton aide!!!! Je vais continuer dans ce sens et tester deux trois choses pour les doublons par la suite ! Ca fonctionne tres bien !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
djokalif Messages postés 9 Date d'inscription samedi 29 septembre 2007 Statut Membre Dernière intervention 7 janvier 2011
29 déc. 2010 à 20:58
Bonjour,

Je suis confronté au même problème que Hadriennoel mais j'ai du mal à mettre en application les conseil de Jack.
Je conçois un planing:

Dans la feuil("ResultatRecherche") je sélectionne un nom de salarié dont la source est de feuil("Liste des salarié") puis validé par un bouton( voir le code ci-dessous).

Le code doit parcourir les feuils qui sont crées automatiquement au moment où on ajoute un nouveau et porte le nom correspondant comme feuil("NomPrenom")

Mon problème est que la boucle ne s'arrête pas, sa flash. J'ai besoin d'aide merci d'avance.

Code:

Private Sub CommandButton1_Click()
For i = 1 To Worksheets.Count

'MsgBox (Worksheets(i).Name)

If Feuil8.Range("A3") = Worksheets(i).Name Then
'Copier
Worksheets(i).Select
Selection.Range("A5:AN113").Copy

'Coller
Worksheets("ResultatRecherche").Select
Range("A5:AN113").Select
ActiveSheet.Paste
Exit For
Exit Sub
End If
Next i

End Sub
0
Rejoignez-nous