Bonjour Archi, bonjour le forum,
T'as de la chance, j'adore ça... (je sais ça se soigne...)
Sub macro()
'déclare les variables Lig et Lig1 (Integer = entier de -32 768 à 32 767)
'ces deux variables serviront à déterminer chacune la dernière ligné éditée d'une colonne
Dim Lig As Integer, Lig1 As Integer
'déclare la variable col (pour déterminer la dernière colonne)
'étrange car dans le code cette variable est définie mais non utilisée ???
Dim Col As Integer
'désactivation de la mise à jour de l'écran (les changements ne sont pas visibles)
Application.ScreenUpdating = False
'With évite de taper chaque fois 'Sheets('Saisie')' au lieu de ça on tape juste un point .
With Sheets('Saisie')
'détermine la variable Lig (on part de B5 et on atteint la dernière cellule éditée en descendant)
Lig = .Range('B5').End(xlDown).Row 'si il y a des données j'usquà B54 par exemple, Lig=54
'je vais considérer que l'exemple est réel et remplacer maintenant Lig par 54
'détermine la variable Col (on part de B54 et on atteint la dernière cellule éditée à droite)
Col = .Range('B' & Lig).End(xlToRight).Column 'si il y a des données jusqu'a V54, Col=22
'grâce à ce système de variables la macro va toujours atteidre les dernières valeurs même
'si il y a eu des chagement (ajout ou suppression de cellules)
'copie la plage B5:J54 (personnellement j'aurait plutôt écris : .Range('B5:J' & Lig).Copy)
Range(.Range('B5'), .Range('J' & Lig)).Copy
End With 'fin de la référence à l'onglet 'Saisie'
'la cellule C2 de l'onglet 'Saisie' contient le nom d'un autre onglet (sinon y a bug)
'c'est maintenant dans cet autre onglet que la macro agit, appelons-le 'X'
With Sheets(Sheets('Saisie').Range('C2').Value)
'pour déterminer où va être collée la plage copiée, la macro recherche la première ligne vide
'de la colonne A. On part de la dernière cellule A65536 on atteint la première éditée en montant
'(xlUp) et on redescant d'un ligne (Offset(1,0). la plage copiée est alors collée
.Paste Destination:=.Range('A65536').End(xlUp).Offset(1, 0) 'considérons que c'est A65
'redétermine la variable Lig on part de la dernière cellule A65536 et on atteint la
'première cellule éditée en remontant (xlUp)
Lig = .Range('A65536').End(xlUp).Row 'maintenant Lig=115 (A65+50 lignes copiées)
'toutes les indications de Données/Validations de la plage B7:I115 sont effacées
'(de la même manière j'aurais personnelement écrit : .Range('B7:I' & Lig).Validation.Delete)
Range(.Range('B7'), .Range('I' & Lig)).Validation.Delete
'détermine la variable Lig1 (dernière ligne éditée de la colonne K)
Lig1 = .Range('K65536').End(xlUp).Row 'considérons que Lig1=86
'Autofill correpond à la poignée de recopie (remplissage auto des cellules)
'la plage K86:N86 est sélectionnée (.Range('K' & Lig1 & ':N' & Lig1) aurait été mieux...)
'la poignée de recopie est utilisée jusqu'à K861:N115!!
Range(.Range('K' & Lig1), .Range('N' & Lig1)).AutoFill _
Destination:=Range(.Range('K' & Lig1), .Range('N' & Lig)), Type:=xlFillDefault
'sélectionne la plage A6:I115 et la trie en ordre Ascendant par rapport à la colonne A, etc...
Range(.Range('A6'), .Range('I' & Lig)).Sort Key1:=.Range('A6'), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With 'fin de la référence à l'onglet 'X'
Sheets('Saisie').Activate 'sélectionne l'onglet 'Saisie' ( au cas ou la macro aurait été
'lancée à partir d'un autre onglet)
Range('C2').Select 'sélectionne la cellule C2
'résactivation de la mise à jour de l'écran (les changements sont visibles)
'il faut toujours redonner la valeur True à la fin pour éviter de mauvaises surprises
Application.ScreenUpdating = True
End Sub
'En gros la macro copie la plage B5:J54 de l'onglet 'Saisie'
'elle passe à longlet 'X'
'recherche la première cellule vide de la colonne A (A65)
'là elle colle la plage copiée.
'elle supprime toutes les indications 'Données/Validation' de la plage B7:B115
'(la plage copiée est prise en compte car Lig est redéfinit)
'elle sélectione K86:N86 pour un auto remplissage (=poignée de recopie) jusqu'à la ligne 115
'la plage A6:I115 est triée (par rapport à la colonne A) en ordre ascendant
'elle revient à l'onglet 'Saisie' est sélectionné et la cellule C2 aussi.
Édition
Damned Pat est déjà passé ! Salut Pat désolé j'ai pas raffraichi avant d'envoyer...
Message édité par: Robert, à: 25/06/2005 20:31