Problème de boucle excel

papillon.matthieu

XLDnaute Nouveau
Bonjour,

Je viens vers vous en espérant trouver une réponse à ma question: j'ai programmé une macro pour faire des copier-coller si une case est supérieure ou égale à 16 dans une autre feuille

Concrètement j'ai 2 problèmes:
- Il ne va pas chercher toutes les lignes en question dans la Feuil1
- les copier - coller dans la Feuil2 se font tous sur la meme ligne, ce qui ne sert à rien

Mon code ci dessous

Dim n
Range("A13").Select
Range(Selection, Selection.End(xlDown)).Select
n = Selection.Rows.Count
Dim i
i = 1
If Cells(i, 9) >= 16 Then
For i = 1 To n
Dim j
j = 10
Cells(i, 1).Select
Selection.Copy
Sheets("Feuil1").Select
Cells(j, 1).Select
ActiveSheet.Paste
Sheets("Feuil2").Select
Cells(i, 2).Select
Selection.Copy
Sheets("Feuil1").Select
Cells(j, 2).Select
ActiveSheet.Paste
Sheets("Feuil2").Select
Cells(i, 4).Select
Selection.Copy
Sheets("Feuil1").Select
Cells(j, 3).Select
ActiveSheet.Paste
Sheets("Feuil2").Select
Cells(i, 6).Select
Selection.Copy
Sheets("Feuil1").Select
Cells(j, 4).Select
ActiveSheet.Paste
Sheets("Feuil2").Select
Cells(i, 8).Select
Selection.Copy
Sheets("Feuil1").Select
Cells(j, 5).Select
ActiveSheet.Paste
Sheets("Feuil2").Select
Cells(i, 12).Select
Selection.Copy
Sheets("Feuil1").Select
Cells(j, 6).Select
ActiveSheet.Paste
Sheets("Feuil2").Select
j = j + 1
Next i

End If

D'avance merci pour votre aide :)
 

papillon.matthieu

XLDnaute Nouveau
Re : Problème de boucle excel

en fait j'avais modifié le code pour le rendre plus générique et mon "A13" est passé a travers les mailles.
Le vrai code est :

Dim i
i = 13
If Cells(i, 9) >= 16 Then
For i = 13 To n
Dim j
j = 41
Cells(i, 1).Select
Selection.Copy
Sheets("Synthèse de l'étude").Select
Cells(j, 1).Select
ActiveSheet.Paste
Sheets("Etape 6 Analyse de risques").Select
Cells(i, 2).Select
Selection.Copy
Sheets("Synthèse de l'étude").Select
Cells(j, 2).Select
ActiveSheet.Paste
Sheets("Etape 6 Analyse de risques").Select
Cells(i, 4).Select
Selection.Copy
Sheets("Synthèse de l'étude").Select
Cells(j, 3).Select
ActiveSheet.Paste
Sheets("Etape 6 Analyse de risques").Select
Cells(i, 6).Select
Selection.Copy
Sheets("Synthèse de l'étude").Select
Cells(j, 4).Select
ActiveSheet.Paste
Sheets("Etape 6 Analyse de risques").Select
Cells(i, 8).Select
Selection.Copy
Sheets("Synthèse de l'étude").Select
Cells(j, 5).Select
ActiveSheet.Paste
Sheets("Etape 6 Analyse de risques").Select
Cells(i, 12).Select
Selection.Copy
Sheets("Synthèse de l'étude").Select
Cells(j, 6).Select
ActiveSheet.Paste
Sheets("Etape 6 Analyse de risques").Select
j = j + 1
Next i

End If
 
Dernière édition:

En 1 Clic

XLDnaute Nouveau
Re : Problème de boucle excel

Il y avait plusieurs problème dans ton code.
Déjà tu as inversé les deux boucles que tu utilises.
Ensuite tu définis j=41 dans la boucle for, ce qui fait qu'elle est a chaque fois redéfini à 41, et tes données importées se copient les unes sur les autres.

Tu peux essayer le code suivant:

Dim n As Integer, j As Integer, i As Integer

Sheets("Etape 6 Analyse de risques").Select

n = Range("A65000").End(xlUp).Row
j = 41
i = 13

For i = 13 To n
If Cells(i, 9) >= 16 Then
Cells(i, 1).Select
Selection.Copy
Sheets("Synthèse de l'étude").Select
Cells(j, 1).Select
ActiveSheet.Paste

Sheets("Etape 6 Analyse de risques").Select
Cells(i, 2).Select
Selection.Copy
Sheets("Synthèse de l'étude").Select
Cells(j, 2).Select
ActiveSheet.Paste

Sheets("Etape 6 Analyse de risques").Select
Cells(i, 4).Select
Selection.Copy
Sheets("Synthèse de l'étude").Select
Cells(j, 3).Select
ActiveSheet.Paste

Sheets("Etape 6 Analyse de risques").Select
Cells(i, 6).Select
Selection.Copy
Sheets("Synthèse de l'étude").Select
Cells(j, 4).Select
ActiveSheet.Paste

Sheets("Etape 6 Analyse de risques").Select
Cells(i, 8).Select
Selection.Copy
Sheets("Synthèse de l'étude").Select
Cells(j, 5).Select
ActiveSheet.Paste

Sheets("Etape 6 Analyse de risques").Select
Cells(i, 12).Select
Selection.Copy
Sheets("Synthèse de l'étude").Select
Cells(j, 6).Select
ActiveSheet.Paste

Sheets("Etape 6 Analyse de risques").Select
j = j + 1

End If
Next i
 

Dormeur74

XLDnaute Occasionnel
Re : Problème de boucle excel

Pas mal de fondamentaux à apprendre ou a revoir.

1 - déclaration explicite de toutes tes variable par Option Explicit
2 - choisir la portée de tes variables pour économiser au mieux ta mémoire vive : Dim i, c'est plus que de la paresse, car tu connais le nombre de lignes dans une feuille Excel, donc tu sais s'il s'agit d'une variable Integer ou Long
3 - on peut écrire des données de la feuille A vers la feuille B sans pour autant donner le focus à la feuille B.
4 - un code, ça s'indente et ça se renseigne pour faciliter la lecture de celui qui voudra ensuite le modifier (ou ici te corriger)
5 - je serais très intéressé par ton pseudo algorithme. Un truc du genre :

- je lis le contenu de la cellule A13 de la Feuil1
- je veux connaître le nombre de lignes de mon tableau
- etc.

Si tu corriges, tu apprends.
J'ai bien compris ce que tu voulais faire, mais je préfèrerais que ça vienne de toi.
 

papillon.matthieu

XLDnaute Nouveau
Re : Problème de boucle excel

je ne suis que débutant sur les macros (d'ou mes erreurs de novice d'ailleurs) mais je ne demande qu'a apprendre.
Rassure toi je ne me suis pas contenté de copier-coller le code: l'idée c'est quand meme de devenir autonome la dessus, voire à l'avenir d'aider les autres.
Le problème est que l'aide ne ligne n'est pas hyper explicite pour quelqu'un qui débute en prog/macro donc j'avais vraiment besoin d'un coup de main.
J'ai commandé le VBA pour les nuls (il faut reconnaitre son niveau parfois) mais il n'est pas encore arrivé
Si vous avez des conseils en plus/ des astuces, je suis preneur
 

Dormeur74

XLDnaute Occasionnel
Re : Problème de boucle excel

Alors, je reviens très rapidement sur ce que j'ai écrit.

En gros, quelque soit le langage de programmation que tu dois utiliser, il me paraît important de déclarer systématiquement tes variables. Visual Basic (au moins jusqu'à la version 6.0) présente de très graves défauts que je classerais dans l'ordre décroissant comme suit :
- possibilité de paramétrer son interface de développement sans déclaration obligatoire des variables (la ligne "Option Explicit" n'existe pas)
- possibilité de déclarer des variables sans en préciser le type : un peu ce que tu as fait en tapant "Dim i" au lieu de "Dim i as Long".
- possibilité d'utiliser une variable non initialisée. Curieusement, tu as initialisé "i" en tapant i = 1. Ce n'était pas utile en VB, mais le rappel à l'ordre est immédiat dans des langages plus proches du processeur (C/C++, etc.).

Tu dois indenter tes programmes. Tu conviendras que

Code:
For i = 1 To n
Dim j
j = 10
Cells(i, 1).Select
Selection.Copy
Sheets("Feuil1").Select
Cells(j, 1).Select
ActiveSheet.Paste
Sheets("Feuil2").Select
Cells(i, 2).Select
Selection.Copy
Sheets("Feuil1").Select
Cells(j, 2).Select
ActiveSheet.Paste
Sheets("Feuil2").Select
Cells(i, 4).Select
Selection.Copy
Sheets("Feuil1").Select
Cells(j, 3).Select
ActiveSheet.Paste
Sheets("Feuil2").Select
Cells(i, 6).Select
Selection.Copy
Sheets("Feuil1").Select
Cells(j, 4).Select
ActiveSheet.Paste
Sheets("Feuil2").Select
Cells(i, 8).Select
Selection.Copy
Sheets("Feuil1").Select
Cells(j, 5).Select
ActiveSheet.Paste
Sheets("Feuil2").Select
Cells(i, 12).Select
Selection.Copy
Sheets("Feuil1").Select
Cells(j, 6).Select
ActiveSheet.Paste
Sheets("Feuil2").Select
j = j + 1
Next i

est moins facile à comprendre que

Code:
For i = 1 To n
	Dim j
	
	j = 10 ' initialisation

	Cells(i, 1).Select
	Selection.Copy
	Sheets("Feuil1").Select

	Cells(j, 1).Select
	ActiveSheet.Paste
	Sheets("Feuil2").Select

	Cells(i, 2).Select
	Selection.Copy
	Sheets("Feuil1").Select

	Cells(j, 2).Select
	ActiveSheet.Paste
	Sheets("Feuil2").Select

	Cells(i, 4).Select
	Selection.Copy
	Sheets("Feuil1").Select

	Cells(j, 3).Select
	ActiveSheet.Paste
	Sheets("Feuil2").Select

	Cells(i, 6).Select
	Selection.Copy
	Sheets("Feuil1").Select

	Cells(j, 4).Select
	ActiveSheet.Paste
	Sheets("Feuil2").Select

	Cells(i, 8).Select
	Selection.Copy
	Sheets("Feuil1").Select

	Cells(j, 5).Select
	ActiveSheet.Paste
	Sheets("Feuil2").Select

	Cells(i, 12).Select
	Selection.Copy
	Sheets("Feuil1").Select

	Cells(j, 6).Select
	ActiveSheet.Paste
	Sheets("Feuil2").Select

	j = j + 1
Next i

Enfin, tu dois impérativement mettre des remarques dans tes programmes :
Code:
j = 10
est moins compréhensible que
Code:
j = 10 ' initialisation de la variable j
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 677
Messages
2 090 825
Membres
104 677
dernier inscrit
soufiane12