Code:
Sub test()
Sheets("Feuil1").Select
'On fait les déclarations de variables
Dim cellule As Range ' celle-ci pour la liste
Dim i As Double 'i pour le premier compteur de passage et savoir si c'est pair/impair
Dim j As Double 'j pour le compteur de lignes dans la colonne cible
i = 0
' A améliorer ici (la flemme et il est tard :D )
For Each cellule In Range("A:A") ' On prend chaque cellule de la colonne A et l'on boucle dessus
i = i + 1 'on compte les lignes une à une (à tous les passages)
If i Mod (2) = 0 Then 'Si la valeur est pair (le modulo est le reste d'une division j'y reviendrai ensuite)
j = j + 1 ' alors j'incrémente le numéro de ligne de la colonne cible
Dim source As String 'Je définis la source
Dim dest As String ' Je définis la cible
source = "A" + CStr(i) 'Je construis le nom de la source
dest = "A" + CStr(j) 'Je construis le nom de la cible
'Transfert de la valeur d une cellule à l autre via le nom de la feuille 1 et 2 et le nom/position de la cellule
Worksheets("Feuil2").Range(dest).Value = Worksheets("Feuil1").Range(source).Value
End If
Next cellule
'Fin du code
End Sub
Bon là je ne fais que commenter vite fait mon code.
Pour l'expliquer plus clairement:
1° Je procède à la sélection de toute la colonne A (le range initial)
2° je boucle sur chaque cellule
3° Si le numéro incrémenté i est pair (modulo) j'incrémente la position de la cellule cible
Là j'explique
Premier passage pair: j'entre et je fais un j+1. Comme j commence à zéro, cela donne un.
donc la cellule cible est "A1" dans le feuillet "feuil2" (dans mon exemple
Et ainsi de suite
ligne 4 de feuil1: A2 sur feuil2
Etc etc.
Ce qui manque clairement dans le code
- Comment traiter les cellules vides
- Comment ne pas copier inutilement au-delà de la sélection utile (bouffe de la ressource en vain jusqu'à planter)
- Comment traiter (si on le souhaite) les éventuels doublons de valeurs
- Ajouter un éventuel affichage de progression (bargraph?)
- Envisager un bouton sur le fichier excel considéré pour que cela fasse le boulot au clic et non en debug
- Procéder à un affichage en fin d'exécution via une fenêtre d'alerte
- Afficher comme le propose
@svoglimacci les cellules en cours de traitement.
Pour ce dernier point je suis circonspect: d'un point de vue esthétique et pédagogique pourquoi pas, à l'usage courant non merci, cela squatte de la ressource technique pour rien. Mais là comme on est sur une sorte de cours de codage...
Bref: copie le code que je t'ai filé pour voir les commentaires que j'ai mis, exécute en pas à pas via le mode débug, mets des points d'arrêt et observe l"évolution des variables. Mieux encore, trace visuellement sur un papier les résultats.
Perso :
j'adore ce bout de code de
@svoglimacci
Code:
fin = Range("A" & Rows.Count).End(xlUp).Row ' On trouve le numéro de la dernière ligne qui j'espère devrait être la dernière ligne de toute la page.
While (i <= fin) ' on boucle
' ici à toi d'adapter
Wend ' Fin de boucle.
Il corrige le bug flagrant de surconsommation mémoire et de temps de mon code précédent. Mais comme tu es là pour apprendre, charge à toi d'inclure l'un sur l'autre pour en piger le fonctionnement... il a le mérite (petite piste) de ne pas aller traiter au-delà du nécessaire et de faire donc le minimum requis, ce qui est une excellente optimisation de ma proposition.