Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

besoin d'aide sur boucle

  • Initiateur de la discussion Initiateur de la discussion guigui971
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

guigui971

XLDnaute Junior
Bonjour,
Je viens de faire ma première macro!

Voici son code :

Cette macro me copie certaines données de 2 colonnes d'une feuille 1 pour les mettre dans 2 colonnes d'une feuille 2 "synthèse"
A chaque fois que je l'active, elle va coller les résultats voulus dans la colonne située juste à droite de la dernière colonne qu'il a remplie.
Sauf que :
-On voudrait limiter le nombre de colonnes disponibles en feuille 2
-On voudrait pouvoir effacer manuellement le contenu d'une colonne en feuille 2. A ce moment, la macro doit voir qu'une nouvelle colonne s'est liberée et qu'elle peut donc y coller de nouvelles données.

J'ai dans l'idée que pour tout çà, on peut définir un tableau de n colonnes en feuille 2
Lorsque la macro veut coller des données dedans, elle va dans la première colonne.
Si celle-ci est pleine, elle tente la seconde.
Et ainsi de suite...
Si arrivée à la dernière colonne n c'est encore plein, elle ne colle rien mais met le message : "tableau de synthèse complet".
L'opérateur devra alors effacer le contenu d'au moins 1 colonne dans feuille 2 pour y libérer une place

Donc ce doit être une boucle, mais comme je vous le disais, je débute total!

Merci d'avance pour vos lumières.
 
Re : besoin d'aide sur boucle

Bonjour,

Voici le genre de boucle "copier-coller" avec une feuille nommée "Synthese " et des données cellules( A1:B37) !

A modifier selon sa convenance !

Code:
Sub Synthese()
Application.ScreenUpdating = False
Dim i As Integer
Sheets("Synthese").Select
Range("A1:B37").Copy
For i = 3 To 10 Step 2
Cells(1, i).Select
ActiveSheet.Paste
'Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone
'Application.CutCopyMode = False
Cells(1, i + 1).Select
Next
Application.CutCopyMode = False
' message de synthèse réussie
MsgBox "Les données ont été" & vbLf & "ajoutées à la synthèse", vbOKOnly + vbInformation, "Validation Synthèse"
Application.ScreenUpdating = True
End Sub
 
Dernière édition:
Re : besoin d'aide sur boucle

Bonjour guigui971, JBARBE, le forum,

Si vous voulez que le tableau ne dépasse pas la dernière valeur en ligne 4, il faut que 2 colonnes soient libres en dessous pour coller les données.

Alors essayez :

Code:
Sub Synthese()
Dim n As Byte, col As Byte
With Sheets("Synthese")
  .Visible = True
  n = .[IV4].End(xlToLeft).Column
  col = .[A9:IV37].Find("*", , xlFormulas, , xlByColumns, xlPrevious).Column
  If col > n - 2 Then MsgBox "Tableau de synthèse complet...": Exit Sub
  .Cells(9, col + 1).Resize(29, 2) = .[AL9:AM37].Value 'copie les valeurs
End With
MsgBox "Les données ont été" & vbLf & "ajoutées à la synthèse", vbOKOnly + vbInformation, "Validation Synthèse"
End Sub
La méthode Find recherche la dernière colonne renseignée de la plage A9:I37.

A+
 
Dernière édition:
Re : besoin d'aide sur boucle

Re,

Si la plage A9:IV37 est vide, Find ne trouve rien et la macro précédente beugue.

Si l'on est pointilleux on peut donc écrire :

Code:
Sub Synthese()
Dim n As Byte, cel As Range
With Sheets("Synthese")
  .Visible = True
  n = Range("IV4").End(xlToLeft).Column
  Set cel = .[A9:IV37].Find("*", , xlFormulas, , xlByColumns, xlPrevious)
  If cel Is Nothing Then Exit Sub 'si le tableau est vide
  If cel.Column > n - 2 Then MsgBox "Tableau de synthèse complet...": Exit Sub
  .Cells(9, cel.Column + 1).Resize(29, 2) = .[AL9:AM37].Value 'copie les valeurs
End With
MsgBox "Les données ont été" & vbLf & "ajoutées à la synthèse", vbOKOnly + vbInformation, "Validation Synthèse"
End Sub
A+
 
Re : besoin d'aide sur boucle

Re, pour terminer,

Il est sans doute mieux de limiter la recherche aux n colonnes du tableau :

Code:
Sub Synthese()
Dim n As Byte, cel As Range
With Sheets("Synthese")
  .Visible = True
  n = Range("IV4").End(xlToLeft).Column
  Set cel = .[9:37].Resize(, n).Find("*", , xlFormulas, , xlByColumns, xlPrevious)
  If cel Is Nothing Then Exit Sub 'si le tableau est vide
  If cel.Column > n - 2 Then MsgBox "Tableau de synthèse complet...": Exit Sub
  .Cells(9, cel.Column + 1).Resize(29, 2) = .[AL9:AM37].Value 'copie les valeurs
End With
MsgBox "Les données ont été" & vbLf & "ajoutées à la synthèse", vbOKOnly + vbInformation, "Validation Synthèse"
End Sub
A+
 
Re : besoin d'aide sur boucle

Salut,
Merci job75, JBARBE pour cette aide et désolé pour ma réaction tardive
Je viens d'essayer le dernier code proposé par job75
Cà marche!

A ce propos que signifie n = Range("IV4) ?

J'aimerai bien que tu vous me mettiez des -'blabla- en fin de chaque ligne avec leur rôle. Je pourrais ainsi commencer à comprendre le principe.

Autre chose : il colle tjs les valeurs à droite de la colonne la plus à droite, dans la limite de "n" colonnes.
J'aimerai qu'il colle tjs dans la première colonne trouvée vide en regardant de la gauche vers la droite .

Merci
 
Re : besoin d'aide sur boucle

Bonjour guigui971,

A ce propos que signifie n = Range("IV4) ?i

Vous devriez le savoir puisque vous utilisez la même formule dans la macro du post #1 (la vôtre dites-vous).


Autre chose : il colle tjs les valeurs à droite de la colonne la plus à droite, dans la limite de "n" colonnes.
J'aimerai qu'il colle tjs dans la première colonne trouvée vide en regardant de la gauche vers la droite .

Ce n'est pas cohérent, d'ailleurs vous aviez écrit, toujours pour la macro du post #1 :

A chaque fois que je l'active, elle va coller les résultats voulus dans la colonne située juste à droite de la dernière colonne qu'il a remplie

A+
 
Re : besoin d'aide sur boucle

Désol Job75 mais dans mon premier post, j'aurai mieux fait de dire "j'ai utilisé pour la première fois une macro, que j'ai récupérée sur ce super forum" plutôt que "j'ai fait ma premiere macro".
D'où le fait que je ne sache pas à quoi sert n=range("IV4")
Je suppose que cela défini la valeur de "n" mais je ne vois pas ce que viens faire une cellule si éloignées (à moins que ce ne soient pas les coordonnées d'une cellule?)

Pour le reste


Je ne vois pas ce qu'il y a de non cohérent :
le code tel que vous l'avez très sympathiquement suggéré colle toujours plus à droite, dans la limite de n.
Si on atteint n, çà bloque.
Ce que je voudrais c'est, sans avoir à effacer toutes les colonnes ainsi remplies, du moment que j'efface une des colonnes située à gauche de la dernière remplie, le code voit qu'il y a une place libre à gauche, sans avoir à rajouter une colonne vers la droite.

Suis-je clair?

Merci encore
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
18
Affichages
314
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…