besoin d'aide sur boucle

guigui971

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

Voici son code :
Sub Synthese()
Application.ScreenUpdating = False
Dim I As Long
Dim Var As String
Sheets("Synthese").Visible = True
Range("AL9:AM37").Select
'Application.CutCopyMode = False
Selection.Copy
Sheets("Synthese").Select
I = Range("IV4").End(xlToLeft).Column
I = I + 1
Sheets("Synthese").Cells(1, I).Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone
Application.CutCopyMode = False
'ActiveWindow.SelectedSheets.Visible = False
Worksheets(Worksheets.Count).Activate
Application.CutCopyMode = False
Application.ScreenUpdating = False

' message de synthèse réussie
Var = "Synthèse réussie"
MsgBox "Les données ont été" & vbLf & "ajoutées à la synthèse", vbOKOnly + vbInformation, "Validation Synthèse"
Application.GoTo Range("A1"), Scroll:=True
End Sub

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.
 

JBARBE

XLDnaute Barbatruc
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:

job75

XLDnaute Barbatruc
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:

job75

XLDnaute Barbatruc
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+
 

job75

XLDnaute Barbatruc
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+
 

guigui971

XLDnaute Junior
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
 

job75

XLDnaute Barbatruc
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+
 

guigui971

XLDnaute Junior
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

Envoyé par guigui971
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

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
 

Discussions similaires

Statistiques des forums

Discussions
312 322
Messages
2 087 288
Membres
103 508
dernier inscrit
max5554