Macro sur feuille active sous Excel

Résolu
Chonbie Messages postés 183 Statut Membre -  
Chonbie Messages postés 183 Statut Membre -
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.

3 réponses

  1. cousinhub29 Messages postés 1114 Date d'inscription   Statut Membre Dernière intervention   380
     
    Bonjour,

    Peut-être en remplaçant tout simplement :

    ActiveWorkbook.Worksheets("feuille1")


    par :

    ActiveSheet


    Bonne journée
    0
    1. Chonbie Messages postés 183 Statut Membre 53
       
      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
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
    1. Chonbie Messages postés 183 Statut Membre 53
       
      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
    2. Polux31 Messages postés 7219 Statut Membre 1 204
       
      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
    3. chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 313
       
      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
    4. Chonbie Messages postés 183 Statut Membre 53
       
      @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
  3. Chonbie Messages postés 183 Statut Membre 53
     
    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
    1. Chonbie Messages postés 183 Statut Membre 53
       
      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