explication de macro

archi

XLDnaute Impliqué
Bjr,

pourrait on m'expliquer les commandes de cette macro ligne par ligne
merci

-----------------------------------

Sub macro()
Dim Lig As Integer, Lig1 As Integer
Dim Col As Integer

Application.ScreenUpdating = False
With Sheets('Saisie')
Lig = .Range('B5').End(xlDown).Row
Col = .Range('B' & Lig).End(xlToRight).Column
Range(.Range('B5'), .Range('J' & Lig)).Copy
End With
With Sheets(Sheets('Saisie').Range('C2').Value)
.Paste Destination:=.Range('A65536').End(xlUp).Offset(1, 0)
Lig = .Range('A65536').End(xlUp).Row
Range(.Range('B7'), .Range('I' & Lig)).Validation.Delete
Lig1 = .Range('K65536').End(xlUp).Row
Range(.Range('K' & Lig1), .Range('N' & Lig1)).AutoFill _
Destination:=Range(.Range('K' & Lig1), .Range('N' & Lig)), Type:=xlFillDefault
Range(.Range('A6'), .Range('I' & Lig)).Sort Key1:=.Range('A6'), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
Sheets('Saisie').Activate
Range('C2').Select
Application.ScreenUpdating = True
End Sub
 

pat1545.

XLDnaute Accro
salut, bon , je me lance, on me reprendra en cas d'erreur !
commentaire sous les lignes
' je n'ai pas testé ce code !!!
Dim Lig As Integer, Lig1 As Integer
Dim Col As Integer
' déclaration des variables (préférable de mettre en tout prmier Option explicit pour etre sur d'utiliser ces variables et pas d'autres qui seraient alors inconnues

Application.ScreenUpdating = False
' ne pas afficher à l'écran les modif, depalcement etc...permet d'accélérerle code

With Sheets('Saisie')
' on prends la feuille 'saisie'

Lig = .Range('B5').End(xlDown).Row
'on cherche la dernière ligne occupée de la colonne B

Col = .Range('B' & Lig).End(xlToRight).Column
' on cherche la dernière colonne occupée à droite depuis B
Range(.Range('B5'), .Range('J' & Lig)).Copy
' on copie le range B5:J et la ligne trouvée plus haut
End With

With Sheets(Sheets('Saisie').Range('C2').Value)
' dans C2 de la feuille saisie

.Paste Destination:=.Range('A65536').End(xlUp).Offset(1, 0)
' on copie la valeur dans la colonne A, 1 ligne sous la dernière occupée
Lig = .Range('A65536').End(xlUp).Row
Range(.Range('B7'), .Range('I' & Lig)).Validation.Delete
' on enlève la validation du range B7:Ixxx

Lig1 = .Range('K65536').End(xlUp).Row
Range(.Range('K' & Lig1), .Range('N' & Lig1)).AutoFill _
Destination:=Range(.Range('K' & Lig1), .Range('N' & Lig)), Type:=xlFillDefault
' autofill = la meme action que quand tu double clique sur une cellule pour la faire recopier vert le bas

Range(.Range('A6'), .Range('I' & Lig)).Sort Key1:=.Range('A6'), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
' tri sur base de la colonne A de la zone Axx:Ixx
End With
Sheets('Saisie').Activate
' activation de 'saisie'
Range('C2').Select
' selection de C2
Application.ScreenUpdating = True
'remise de l'interrupteur du début (non obligatoire)
End Sub
' oufffffffffffffffffff
Patrick
 

Robert

XLDnaute Barbatruc
Repose en paix
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
 

archi

XLDnaute Impliqué
Merci à tous pour cette explication

toutefois, en applicant plus ou moins cette macro à mon exemple (voir fichier joint), je n'arrive m'en sortir il me reste des bug
nottament au niveau de l'instruction Copy
please help

@+ [file name=Test_BDV5_20050627094625.zip size=38920]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Test_BDV5_20050627094625.zip[/file]
 

Pièces jointes

  • Test_BDV5_20050627094625.zip
    38 KB · Affichages: 24

archi

XLDnaute Impliqué
merci bebere mais j'ai toujours le même bug ?

question:
peut-on faire seulement un copy (dans macro 1 et 2) des valeur et fomat des cellules (B5:I8) ou (B13:I16) sans attacher les formules ??

merci de m'aider

Message édité par: archi, à: 29/06/2005 14:10
 

Discussions similaires

Statistiques des forums

Discussions
312 339
Messages
2 087 410
Membres
103 541
dernier inscrit
Sebast'o