Macro sur feuille active sous Excel

Résolu/Fermé
Chonbie Messages postés 145 Date d'inscription vendredi 2 juillet 2010 Statut Membre Dernière intervention 2 septembre 2014 - 9 août 2011 à 17:30
Chonbie Messages postés 145 Date d'inscription vendredi 2 juillet 2010 Statut Membre Dernière intervention 2 septembre 2014 - 12 août 2011 à 14:37
Bonjour,

J'ai des tableaux à remplir pour répertorier des achats de matériaux chez différents fournisseurs. Je voudrais qu'une fois mes nouvelles lignes ajoutées, je puisse lancer une macro pour trier le tableau de ma page active selon un ordre bien précis.

J'ai essayé l'enregistrement banal de macro mais évidemment il enregistre le fait qu'il faut appliquer la macro dans une feuille nommée "feuille1" et non dans la feuille active...

C'est cette ligne qui ne va pas (répétée plusieurs fois dans mon script):
ActiveWorkbook.Worksheets("feuille1").Sort.SortFields.Add _

Des idées?

Je vous remercie d'avance.
A voir également:

3 réponses

cousinhub29 Messages postés 882 Date d'inscription mardi 10 août 2010 Statut Membre Dernière intervention 25 avril 2024 334
10 août 2011 à 00:42
Bonjour,

Peut-être en remplaçant tout simplement :

ActiveWorkbook.Worksheets("feuille1")


par :

ActiveSheet


Bonne journée
0
Chonbie Messages postés 145 Date d'inscription vendredi 2 juillet 2010 Statut Membre Dernière intervention 2 septembre 2014 53
11 août 2011 à 10:04
Impeccable ça marche merci !!

Une 2ème question qui va bien avec:
"lorsque je fais ma macro sur une feuille, il applique le tri au tableau de la feuille active en enregistrant les dimensions de ce tableau, or les tableaux des différentes feuilles ne sont pas tous de la même taille, il faudrait modifier cette ligne:
Range("C4:C517")
Pour que la macro prenne toute la colonne à partir de C4 par exemple...
Une idée?"

Merci.
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
11 août 2011 à 10:27
Bonjour,

Pour trouver la dernière ligne renseignée :

' Ici pour la colonne 4
Dim LastLig As Long
LastLig = Range("C65536").End(xlUp).Row


Ton code devient :

Range("C4:C" & LastLig) 


Bon courage

;o)
0
Chonbie Messages postés 145 Date d'inscription vendredi 2 juillet 2010 Statut Membre Dernière intervention 2 septembre 2014 53
11 août 2011 à 12:14
Erreur dans le Range.
Ancien code:
Sub tri_tab()
'
' tri_tab Macro
'
' Touche de raccourci du clavier: Ctrl+k
'
    Range("B3:I3").Select
    ActiveSheet.Sort.SortFields.Clear
   ActiveSheet.Sort.SortFields.Add Key:= _
        Range("B4:B13"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:= _
        Range("C4:C13"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:= _
        Range("E4:E13"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveSheet.Sort
        .SetRange Range("B3:I13")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub


Nouveau code:
Sub tri_tab()
'
' tri_tab Macro
'
' Touche de raccourci du clavier: Ctrl+k
'
    Range("B3:I3").Select
    ActiveSheet.Sort.SortFields.Clear
   ActiveSheet.Sort.SortFields.Add Key:= _
        Range("B4:B" & LastLig), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:= _
        Range("C4:C" & LastLig), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:= _
        Range("E4:C" & LastLig), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveSheet.Sort
        .SetRange Range("B3:I" & LastLig)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub


D'après lui:
"Range(Cell1,[Cell2]) As Range"

Merci de ta réponse ;)
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
11 août 2011 à 12:22
Tu as mis où la déclaration de la variable LastLig ?
Ainsi que LastLig =Range("C65536").End(xlUp).Row ?

Essaie avec ça:

Sub tri_tab()
'
' tri_tab Macro
'
' Touche de raccourci du clavier: Ctrl+k
'
Dim LastLig As Long
LastLig = Range("C65536").End(xlUp).Row

    Range("B3:I3").Select
    ActiveSheet.Sort.SortFields.Clear
   ActiveSheet.Sort.SortFields.Add Key:= _
        Range("B4:B" & LastLig), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:= _
        Range("C4:C" & LastLig), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:= _
        Range("E4:C" & LastLig), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveSheet.Sort
        .SetRange Range("B3:I" & LastLig)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub


;o)
0
chossette9 Messages postés 4239 Date d'inscription lundi 20 avril 2009 Statut Contributeur Dernière intervention 12 septembre 2014 1 306
11 août 2011 à 13:32
Bonjour,

Polux31 : pour déterminer la dernière ligne d'une colonne, il est malhabile d'utiliser le Range("C65536"), car ceci n'est valable que pour Excel 2003 (même si je te l'accorde, il est rare de voir un fichier excel sur plus de 65000 lignes, même en version 2007 ou 2010).

Grâce à pijaku (que je remercie au passage), il est maintenant préférable d'utiliser
Range("C"& Rows.Count)
, qui donne la même chose au final, mais qui fait que le code fonctionnera aussi bien sur Excel 2007 ou sur les versions plus anciennes.

Cordialement.
0
Chonbie Messages postés 145 Date d'inscription vendredi 2 juillet 2010 Statut Membre Dernière intervention 2 septembre 2014 53
11 août 2011 à 14:54
@Polux31:
Je n'avais pas compris ça comme une variable effectivement !!
J'ai compris et cela fonctionne à merveille :D !! Je l'ai même adapté pour une mise en forme des bordures et aucun soucis. Juste que pour Excel 2007 il faut utiliser "1 048 576" de lignes.

@chossette9:
"Rows.count" permet de compter le nombre de ligne de la feuille c'est ça? Donc il faudrait rajouter une variable en plus avant c'est ça? Cela permet cependant de s'adapter à tous les fichiers excel peut importe l'année c'est bien ça?

@Tous:
Merci pour vos commentaires !!
0
Chonbie Messages postés 145 Date d'inscription vendredi 2 juillet 2010 Statut Membre Dernière intervention 2 septembre 2014 53
12 août 2011 à 10:55
Ah finalement une autre question, j'ai ce code pour mettre les bordures du contour d'un tableau automatiquement:
Sub tour_tab()
'
' tour_tab Macro
'
' Touche de raccourci du clavier: Ctrl+m
'
    Range("B5:BE1048576").Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    Selection.Borders(xlEdgeTop).LineStyle = xlNone
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone

Dim ligne As Long
ligne = Range("B1048576").End(xlUp).Row

    Range("B5:BE" & ligne).Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlMedium
    End With
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
End Sub


Donc cela fonctionne bien, il me vide la feuille de toute bordure à partir d'une ligne voulue et me crée le contour au niveau de ma dernière cellule en B. Sauf que cela marche dans un sens mais pas dans l'autre...

Lorsque j'agrandis le tableau aucun soucis, effacement puis création.
Mais lorsque je supprime des lignes, il me recrée le tableau au niveau de l'ancienne ligne?! Comme si il ne changeait pas la variable pour diminuer, juste pour augmenter sa valeur?!

Merci d'avance ;D !!
0
Chonbie Messages postés 145 Date d'inscription vendredi 2 juillet 2010 Statut Membre Dernière intervention 2 septembre 2014 53
12 août 2011 à 14:37
Problème résolu !!

En fait au lieu de supprimer la case qui me servait à repérer la dernière ligne du tableau, je mettais un "espace" (fâcheuse habitude à supprimer en tapant un espace...) et du coup la macro le prenais comme un caractère à part entière.
0