OVH Cloud OVH Cloud

Problème de boucles - VBA

26 réponses
Avatar
Patrick BASTARD
Bonjour à tous.

Grand merci à qui voudra bien m'aider à modifier ce code pour qu'il copie
chacune des 17 zones (A2:D10, A13:D21, ...) d'un nombre de feuilles entre 28
et 31 (suivant les mois) sur la feuille "TOTAL", de manière à ce que les
premières (A2:D10) soient les unes sous les autres à partir de la cellule
A2, les deuxièmes les unes sous les autres à partir de la cellule F2, etc...
Un titre est déja inscrit dans les cellules de la ligne 1.

J'ai pensé à une boucle pour décaler chaque zone à copier (en la définissant
avec offset? ) mais ça dépasse mes connaissances actuelles.

Question subsidiaire :
Dans un cas comme celui-ci, est-il plus judicieux de traiter chaque zone de
la première feuille, puis de la suivante, ou bien la première zone de chaque
feuille, puis la zone suivante?

Bien cordialement,

Patrick.

Sub Recopie()

For f = 1 To 8
'modifier pour compter le nb réel de feuilles dans le classeur(-1 pour
"TOTAL")

ThisWorkbook.Worksheets(ThisWorkbook.ActiveSheet.Index + f).Select
Range("A2:D10").Copy
Sheets("TOTAL").Select
Range("A65536").End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues
'ici, la sélection se fait sur "TOTAL", et non sur la bonne feuille
Range("A13:D21").Copy
Sheets("TOTAL").Select
Range("f65536").End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues

Next f

Range("A1:I1").Select
Selection.AutoFilter
End Sub

6 réponses

1 2 3
Avatar
Patrick BASTARD
Bonsoir, *Michel *

Merci de ta proposition :

Je l'ai allégé, mais j'ai gardé la structure avec les onglets annexes, et il
fait 250 KO.

Bien cordialement,

Patrick.


http://cjoint.com/?bpxBJK3pV3

Envoie-moi ton classeur si tu veux en enlevant "ASupp"



Avatar
Daniel.M
Salut Patrick

Quelques erreurs :

On exclue certains onglets en les reliant par des AND (pas par des OR)
Le 'i' doit être incrémenté à l'intérieur du If
La formulation de copie peut être abrégée et elle copiait 9 lignes dans 17.

Ça donne :

Sub Report()
Dim z As Integer
Dim TCol As Integer, TLig As Long
Dim FLig As Long
Dim F As Worksheet

Application.ScreenUpdating = False
Sheets("Anomalies").Activate
TLig = 2 ' Ligne de départ pour la zone de destination (sur Anomalies)

For Each F In ThisWorkbook.Sheets

If F.Name <> "Anomalies" And F.Name <> "Administration" _
And F.Name <> "Premier" And F.Name <> "Modèle" _
And F.Name <> "TOTAL" _
Then

TCol = 1
FLig = 2
For z = 0 To 21
Cells(TLig, TCol).Resize(9, 4).Value = _
F.Cells(FLig, 1).Resize(9, 4).Value
TCol = TCol + 5
FLig = FLig + 9
Next
TLig = TLig + 9
End If
Next F

End Sub


Salutations,

Daniel M.
Avatar
Patrick BASTARD
Bonjour, "Daniel"

Et merci pour ton aide.
Grâce à ton intervention, et à celles de Pounet95, de Michel et de Bruno,
j'y vois maintenant plus clair, et ce que je voulais faire est maintenant
presque abouti.

Et, pour tout comprendre, encore 2 questions :

1° question :
Cells(TLig, TCol).Resize(9, 4).Value = F.Cells(FLig, 1).Resize(9, 4).Value
recopie les formules de départ sur la cible.
Quelle serait la syntaxe pour ne recopier que les valeurs ?

2° question :
Pourquoi, bien que ne figure pas "Application.ScreenUpdating = True",
l'affichage est-il mis à jour en fin de proc ?

Bon dimanche à vous tous,

Bien cordialement,

Patrick.


Sub Report()
Dim z As Integer
Dim TCol As Integer, TLig As Long
Dim FLig As Long
Dim F As Worksheet

Application.ScreenUpdating = False
Sheets("Anomalies").Activate
TLig = 2 ' Ligne de départ pour la zone de destination (sur Anomalies)

For Each F In ThisWorkbook.Sheets

If F.Name <> "Anomalies" And F.Name <> "Administration" _
And F.Name <> "Premier" And F.Name <> "Modèle" _
And F.Name <> "TOTAL" _
Then

TCol = 1
FLig = 2
For z = 0 To 21
Cells(TLig, TCol).Resize(9, 4).Value = _
F.Cells(FLig, 1).Resize(9, 4).Value
TCol = TCol + 5
FLig = FLig + 9
Next
TLig = TLig + 9
End If
Next F

End Sub


Salutations,

Daniel M.





Avatar
AV
1° question :
Cells(TLig, TCol).Resize(9, 4).Value = F.Cells(FLig, 1).Resize(9, 4).Value
recopie les formules de départ sur la cible.
Quelle serait la syntaxe pour ne recopier que les valeurs ?


Heu...Es-tu sur que cette syntaxe recopie tout et pas seulement les valeurs ?

2° question :
Pourquoi, bien que ne figure pas "Application.ScreenUpdating = True",
l'affichage est-il mis à jour en fin de proc ?


C'est comme ça ...Réinitialisation de la valeur par défaut ("true")

AV

Avatar
Patrick BASTARD
Bonjour, *Alain*


Merci de ta réponse pour le # 2°
Est-ce à dire que Application.ScreenUpdating = True est toujours inutile en
fin de procédure ?


Pour ce qui est du # 1° :
Je m'aperçois après vérification que ma formule :
=STXT(CELLULE("nomfichier";A$1);TROUVE("]";CELLULE("nomfichier";A$1))+1;32)
était dans une cellule formatée en tant que texte ( ce que je ne savais pas
possible) et que c'est chaîne de texte qui a été recopiée.

Donc pour moi, maintenant, tout est OK

Agréable fin de WE,

Bien cordialement,

Patrick.



1° question :
Cells(TLig, TCol).Resize(9, 4).Value = F.Cells(FLig, 1).Resize(9,
4).Value recopie les formules de départ sur la cible.
Quelle serait la syntaxe pour ne recopier que les valeurs ?


Heu...Es-tu sur que cette syntaxe recopie tout et pas seulement les
valeurs ?

2° question :
Pourquoi, bien que ne figure pas "Application.ScreenUpdating = True",
l'affichage est-il mis à jour en fin de proc ?


C'est comme ça ...Réinitialisation de la valeur par défaut ("true")

AV



Avatar
AV
Est-ce à dire que Application.ScreenUpdating = True est toujours inutile en
fin de procédure ?


A 99% (qques exceptions pour l'affichage d'userform ou msgbox sur le "parcours"
de la proc où il faut jouer sur la succession de false/true) c'est réponse oui
Pour les inquiets et comme ça mange pas de pain, on peut rajouter la ligne avant
le end sub
AV

1 2 3