Macro avec 7 opérations

(j'ai reformulé mon annonce)

Bonjour à tous,

Je souhaite créer une macro (ou 2 Macro ?), qui permet de faire les 7 manipulations suivantes :

Sur la Feuille 1:

1- Supprimer les colonnes C, D ensuite I, J, K

2- Supprimer les lignes 5, 6, 7

3- Mettre ligne A10:L10 en couleur gris clair

4- Mettre un filtre à la cellule I10, et filtrer I10 par un ordre décroissant

Sur la Feuille 2:

1- Supprimer les colonnes C, D

2- Mettre A6:H6 en couleur gris clair

3- Mettre un filtre à la cellule A6

Je souhaite, si c’est possible, pouvoir exécuter la Macro sur n’importe quel fichier que j'ouvre, et même si les noms des onglets changent svp.

J’ai essayé en plusieurs reprises à créer celle-ci à l’aide de ‘’l’enregistrement Macro’’, mais ma Macro plante durant l’exécution pour une raison inconnue.

Si vous me permettez, je vous transmets le fichier Excel.

En vous souhaitant une bonne réception.

Cher internaute, je vous serai beaucoup reconnaissant, cette Macro m’aidera beaucoup, je vous remercie à l'avance pour votre précieux aide.

Salut las-dias,

voici une première solution dont j'espère les critiques (toujours constructives ) des vrais cracks!

A ce stade, je ne vois qu'une possibilité :

- copier cette macro dans CHACUN de tes classeurs dans le module 'ThisWorkBook'

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
'
If Not Intersect(Target, Range("A1")) Is Nothing Then
    If Left(ActiveSheet.Name, 8) = "Training" Then Application.Run ("PERSONAL.XLSB!Training")
    If Left(ActiveSheet.Name, 10) = "Attendance" Then Application.Run ("PERSONAL.XLSB!Attendance")
End If
'
End Sub

- copier les deux macros suivantes dans le module de ton fichier personnel 'PERSONAL.XLSB'

Public Sub Training()
'
Application.ScreenUpdating = False
'
For x = 1 To 5
    iCol = Choose(x, 13, 12, 11, 4, 3)
    Columns(iCol).Delete shift:=xlToLeft
Next
Rows("5:7").Delete shift:=xlUp
Range("A10:L10").Interior.Color = RGB(215, 215, 215)
Range("A10:L10").BorderAround LineStyle:=xlContinuous
iRow = Range("A" & Rows.Count).End(xlUp).Row
Range("A11:L" & iRow).Sort key1:=Range("I11"), order1:=xlDescending, Orientation:=xlTopToBottom
'
Application.ScreenUpdating = True
'
End Sub
'

Public Sub Attendance()
'
Application.ScreenUpdating = False
'
For x = 1 To 2
    iCol = Choose(x, 4, 3)
    Columns(iCol).Delete shift:=xlToLeft
Next
Range("A6:h6").Interior.Color = RGB(215, 215, 215)
Range("A6:h6").BorderAround LineStyle:=xlContinuous
'
Application.ScreenUpdating = True
'
End Sub

Maintenant, il faudrait bien se mettre d'accord :

  • vu que le traitement ne peut se faire qu'une fois par feuille, je trouve inutile de créer un bouton : un simple double-clic en [A1] suffit, me semble-t-il...
Faut pas déc... non plus!

Je veux bien prévoir quantité de trucs mais il faudrait peut-être nous donner des critères précis et calculables pour savoir quelle macro doit être mise en œuvre en fonction de la feuille active!!!!!

Ici, cela ne fonctionnera QUE si le nom des feuilles commence par TRAINING ou ATTENDANCE.

- Peux-tu préciser quels tris tu comptes opérer sur tes données?

° uniquement sur 'Remaining' en feuille TRAINING ?

° quel filtre sur quelle colonne en feuille ATTENDANCE ?

Teste toujours ceci et on verra la suite à donner...

A+

Bonjour Curulis57,

Je vous remercie pour le temps que vous avez consacré à cet exercice

Suite à vos remarque, j'ai reformulé les points suivants de mon annonce :

En effet, je souhaite 1 macro (ou 2 Macro ?), qui permet de:

Sur la Feuille 1:

3- Mettre la ligne A10:L10 en couleur gris clair

4- Mettre un filtre à la cellule I10, et filtrer I10 par un ordre décroissant

Sur la Feuille 2:

2- Mettre A6:H6 en couleur gris clair

3- Mettre un filtre à la cellule A6

Par contre, Est ce que c'est possible d'exécuter la Macro même si les noms des onglets changent svp ? car je travaille sur différents fichiers avec différents noms d'onglets.

Bonjour las-dias,

Si les noms d'onglets changent mais que la structure est la même (emplacement et type des données),

tu peux accéder aux feuilles par leur numéro d'index ; exemple : Worksheets(5) est toujours la 5ème

feuille du classeur, quelque soit son nom ; bien sûr, il y aura une erreur si pas de 5ème feuille.

Ce que j'ai écrit est juste une piste, car avec plusieurs fichiers différents, ce serait vraiment

une grosse coïncidence que « ça colle » parfaitement dans tous les cas !

curulis57 aura peut-être une meilleure idée ou une solution miracle ?

Cordialement

Bonsoir Dhany,

Je vous remercie pour votre réponse.

OUI, les noms d'onglets changent mais la structure reste toujours est la même, en conséquence, les manipulations colleront avec tous les fichiers sur lesquels je travaille !

Comme je suis nul en VBA, je souhaite savoir si vous pouvez m'éclairer ou m'illustrer votre réponse au sujet du changement du nom de l'onglet "Worksheets.." en VBA si c'est possible SVP ?

Ce que j'ai écrit précédemment était en VBA.

Exemple : pour sélectionner la feuille 5, puis mettre le nombre 24 en cellule D8 :

Worksheets(5).Select: [D8] = 24

Pour mettre le nombre 24 dans la cellule D8 de la feuille 5 sans la sélectionner :

Worksheets(5).[D8] = 24

Autre exemple, pour faire plusieurs choses différentes pour la feuille 5 :

Sub Essai()
  With Worksheets(5)
     .[D8] = 24  ' mettre le nombre 24 dans la cellule D8 de la feuille 5
     MsgBox .[D8]  ' afficher le contenu de la cellule D8 de la feuille 5
  End With
End Sub

Attention : ne pas oublier le point ( . ) devant [D8] car c'est cela qui

le fait dépendre de ce qui est indiqué par With : Worksheets(5)


Si tu veux changer de feuille, mets juste un autre n° d'index :

With Worksheets(3) ' avec la 3ème feuille du classeur


Pour changer le nom d'une feuille :

a) si cette feuille est la feuille active : ActiveSheet.Name = "Nom feuille"

b) pour une feuille bien précise, même si elle n'est pas active :

Worksheets(3).Name = "Nom feuille" ' nom pour la 3ème feuille

Bonjour tous

Voici une nouvelle proposition

curulis57 a écrit :

voici une première solution dont j'espère les critiques (toujours constructives ) des vrais cracks!

sans critique, peut être plus "vrais cracks" sans aucune prétention

Ce code est à mettre sur un nouveau classeur qui se charge de lire "les fichiers à traiter", de faire les transformations

Tout cela en 2 étapes

1) par la procédure TraiterClasseurs

1.1) Sélection des fichiers à traiter,

1.2) Sélection des onglets 1 et 2 à traiter

2) par la procédure TransformerClasseurs => Transformation

Public tabClasseur()
Public nbrClasseurs

Public wsTransf As Object
Public wsActive As Object

Function FiltreRange(bloc As Range, codClasseur)
Dim tabTemp()
Dim cptTemp, colTemp
Dim tabFilt()
Dim nbrFilt

    tabTemp = bloc
    nbrFilt = 0
    ReDim tabFilt(1 To 3, 1 To 1)
    For cptTemp = 1 To UBound(tabTemp, 1)
        If tabTemp(cptTemp, 1) = codClasseur Then
            If Not IsEmpty(tabTemp(cptTemp, 3)) Then
                nbrFilt = nbrFilt + 1
                ReDim Preserve tabFilt(1 To 3, 1 To nbrFilt)
                For colTemp = 1 To 3
                    tabFilt(colTemp, nbrFilt) = tabTemp(cptTemp, colTemp)
                Next
            End If
        End If
    Next

    If nbrFilt > 1 Then
        FiltreRange = WorksheetFunction.Transpose(tabFilt)
    Else
        FiltreRange = False
    End If

End Function
Sub TransformerClasseurs()
Dim cptClasseurs
Dim tabOnglets
Dim cptOnglets
Dim enCours

    Set wsTransf = Workbooks(ActiveWorkbook.Name)
    tabClasseur = Range(Cells(2, 1), Cells(LigneFin - 1, 2))
    For cptClasseurs = 1 To UBound(tabClasseur, 1)
        tabOnglets = FiltreRange(Range(Cells(2, 4), Cells(LigneFin(4), 6)), tabClasseur(cptClasseurs, 2))
        enCours = tabClasseur(cptClasseurs, 1)
        If Not (VarType(tabOnglets) = vbBoolean) Then
            enCours = enCours & " " & UBound(tabOnglets, 1)
            MsgBox enCours
            Workbooks.Open tabClasseur(cptClasseurs, 1)
            Set wsActive = Workbooks(ActiveWorkbook.Name)
            With wsActive
                '------------------------------------------------------------------------------------------------
                'Sur la Feuille 1:
                '1- Supprimer les colonnes C, D ensuite I, J, K
                '2- Supprimer les lignes 5, 6, 7
                '3- Mettre ligne A10:L10 en couleur gris clair
                '4- Mettre un filtre à la cellule I10, et filtrer I10 par un ordre décroissant
                '
                'Sur la Feuille 2:
                '1- Supprimer les colonnes C, D
                '2- Mettre A6:H6 en couleur gris clair
                '3- Mettre un filtre à la cellule A6
                '------------------------------------------------------------------------------------------------
                For cptOnglets = 1 To UBound(tabOnglets, 1)
                    Select Case tabOnglets(cptOnglets, 3)
                        Case 1
                            With .Sheets(tabOnglets(cptOnglets, 2))
                                Range(.Cells(1, 9), .Cells(1, 11)).EntireColumn.Delete
                                Range(.Cells(1, 3), .Cells(1, 4)).EntireColumn.Delete
                                Range(.Cells(5, 1), .Cells(7, 1)).EntireRow.Delete
                                With Range(.Cells(10, 1), .Cells(10, 12))
                                    .Interior.Color = 14540253
                                    .AutoFilter
                                End With
                                .AutoFilter.Sort.SortFields.Clear
                                    ligFin = .Cells(Rows.Count, 1).End(xlUp).Row
                                .AutoFilter.Sort.SortFields.Add _
                                    Key:=Range(.Cells(11, 9), .Cells(ligFin, 9)), _
                                    SortOn:=xlSortOnValues, _
                                    Order:=xlAscending, _
                                    DataOption:=xlSortNormal
                                .AutoFilter.Sort.Header = xlYes
                                .AutoFilter.Sort.Apply
                            End With
                        Case 2
                            With .Sheets(tabOnglets(cptOnglets, 2))
                                Range(.Cells(1, 3), .Cells(1, 4)).EntireColumn.Delete
                                Range(.Cells(6, 1), .Cells(6, 8)).Interior.Color = 14540253
                                Range(.Cells(6, 1), .Cells(6, 8)).AutoFilter
                            End With
                    End Select
                Next

                .SaveAs "OK " & tabClasseur(cptClasseurs, 1)
                .Close False
            End With
            Set wsActive = Nothing

        Else
            MsgBox enCours & " Aucun"
        End If

    Next
    Set wsTransf = Nothing

End Sub
Sub TraiterClasseurs()
Dim mesClasseurs
Dim lotClasseurs As Boolean
Dim cptClasseurs

    Application.ScreenUpdating = False
    Set wsTransf = Workbooks(ActiveWorkbook.Name)
    Range(Cells(2, 1), Cells(LigneFin, 2)).ClearContents
    Range(Cells(2, 4), Cells(LigneFin(4), 6)).ClearContents

    nbrClasseurs = 0
    mesClasseurs = Application.GetOpenFilename("Fichiers Excel (*.xls*), *.xls*", MultiSelect:=True)
    If VarType(mesClasseurs) = vbBoolean Then
        MsgBox "Aucun fichier à Traiter"
    Else
        lotClasseurs = VarType(mesClasseurs) > vbArray
        If lotClasseurs Then
            For cptClasseurs = 1 To UBound(mesClasseurs, 1)
                TraiterOnglets mesClasseurs(cptClasseurs), cptClasseurs
            Next
        Else
            TraiterOnglets mesClasseurs, cptClasseurs
        End If
    End If

    Set wsTransf = Nothing
    Application.ScreenUpdating = True
End Sub

Sub TraiterOnglets(nomClasseur, numClasseur)
Dim ligFin
Dim cptOnglet
Dim nomCourt

    Workbooks.Open nomClasseur
    Set wsActive = Workbooks(ActiveWorkbook.Name)
    With wsActive
        ligFin = LigneFin
        nomCourt = Split(nomClasseur, "\")
        wsTransf.Sheets(1).Cells(ligFin, 1) = nomCourt(UBound(nomCourt, 1))
        wsTransf.Sheets(1).Cells(ligFin, 2) = numClasseur
        For cptOnglet = 1 To .Sheets.Count
            ligFin = LigneFin(4)
            wsTransf.Sheets(1).Cells(ligFin, 4) = numClasseur
            wsTransf.Sheets(1).Cells(ligFin, 5) = .Sheets(cptOnglet).Name
            ligFin = ligFin + 1
        Next
        .Close False
    End With
    Set wsActive = Nothing
End Sub

Function LigneFin(Optional colRef = 1)
    LigneFin = wsTransf.Sheets(1).Cells(Rows.Count, colRef).End(xlUp).Row + 1
End Function
capture 20171025 001

Bonjour à tous,

Je vous remercie pour vos réponses intéressantes.

J'ai fini ma Macro, je me situe à la dernière étape dont j'aurai encore besoin de votre aide svp !

BUT: Je souhaite afficher ma Macro dans TOUS les fichiers excel que j'ouvre.

J'ai consulté quelques forums qui ont déjà traité ce sujet, certes comme je suis assez nul en excel j'ai pas réussi à faire ceci. Pourriez-vous m'expliquer étape par étape svp ?

Je vous remercie d'avcance.

Bonjour (..)

las-dias a écrit :

J'ai consulté quelques forums qui ont déjà traité ce sujet, certes comme je suis assez nul en excel j'ai pas réussi à faire ceci. Pourriez-vous m'expliquer étape par étape svp ?

tu as réussi à faire quoi ? Que veux tu que l'on t'explique ? Il n'y a pas de fichier, de code... ?

Bonjour las-dias,

Tu a écrit :

BUT: Je souhaite afficher ma Macro dans TOUS les fichiers excel que j'ouvre.

Pour qu'une macro puisse être utilisée de façon générale dans plusieurs classeurs différents,

il faut la placer dans un classeur spécial nommé "Personal.xlsb" ; voir ce lien :

https://support.office.com/fr-fr/article/Cr%C3%A9er-et-enregistrer-toutes-vos-macros-dans-un-classeur-unique-aa439b90-f836-4381-97f0-6e4c3f5ee566

Cordialement

Salut l'équipe,

je serais très curieux de voir cette macro!

Comme nous n'avions pas beaucoup de précisions quant à l'organisation de tes fichiers (nombre de feuilles par classeur, structure, ordre...), je ne vois pas comment écrire une macro générale!

As-tu essayé la bombe atomique de NCC, très impressionnante ?

Tu ne nous dit pas non plus comment tu comptes déclencher cette macro!

Bref, pour moi (à mon petit niveau), c'est encore fort nébuleux... mais je ne demande qu'à me tromper, bien sûr!

A+

Bonjour curulis57,

Dans son message d'hier à 00:53,

las-dias a écrit :

OUI, les noms d'onglets changent mais la structure reste toujours la même, en conséquence,

les manipulations colleront avec tous les fichiers sur lesquels je travaille !

Je pense que c'est grâce à cela que le demandeur peut écrire une macro générale.

Cordialement

Salut dhany,

oui, j'ai bien lu aussi, évidemment!

Mais, ce serait vraiment miraculeux que tout se goupille aussi parfaitement!

Je suis un peu comme St-Thomas...

A+

Bonjour (..)

@curulis57

curulis57 a écrit :

As-tu essayé la bombe atomique de NCC, très impressionnante ?

Ce n'est pas une bombe atomique c'est un peu de VBA avec un brin de

curulis57 a écrit :

Comme nous n'avions pas beaucoup de précisions quant à l'organisation de tes fichiers (nombre de feuilles par classeur, structure, ordre...),

que j'ai tenté d'
curulis57 a écrit :

écrire une macro générale!

en me disant que
dhany a écrit :

Dans son message d'hier à 00:53,las-dias a écrit:OUI, les noms d'onglets changent mais la structure reste toujours la même, en conséquence,les manipulations colleront avec tous les fichiers sur lesquels je travaille !Je pense que c'est grâce à cela que le demandeur peut écrire une macro générale.

cependant comme toi
curulis57 a écrit :

oui, j'ai bien lu aussi, évidemment!Mais, ce serait vraiment miraculeux que tout se goupille aussi parfaitement!Je suis un peu comme St-Thomas...

j'aimerais bien savoir quelle est la solution finalement adoptée

Sub Macro1()

'

' Macro1 Macro

'

'

[u] Range("A10:L15").Select

[/u] ExecuteExcel4Macro "PATTERNS(1,0,65535,TRUE,2,3,0,0)"

End Sub

Bonjour, dans la petite macro ci-dessus, le VBA sélection la plage A10:L5 (de la cellule A10 à L15).

Je souhaite dire à la Macro, de sélectionner de A10 à L10, puis ensuite d'aller jusqu'à la dernière ligne non vide de la plage.

Quelles sont les modifications qu'il faut apporter SVP ? je vous remercie encore une fois votre aide précieux :rol

Sub Macro1()

'

' Macro1 Macro

'

'

[u] Range("A10:L15").Select

[/u] ExecuteExcel4Macro "PATTERNS(1,0,65535,TRUE,2,3,0,0)"

End Sub

Bonjour, dans la petite macro ci-dessus, le VBA sélection la plage A10:L5 (de la cellule A10 à L15).

Je souhaite dire à la Macro, de sélectionner de A10 à L10, puis ensuite d'aller jusqu'à la dernière ligne non vide de la plage.

Quelles sont les modifications qu'il faut apporter SVP ? je vous remercie encore une fois votre aide précieux :roll

Salut las-dias,

pas sûr d'avoir compris...

'
iRow = Range("L" & Rows.Count).End(xlUp).Row
Range("A10:L" & iRow).Select
'

A+

D'accord, je vous remercie pour votre réponse.

Certes, comme je suis nul en VBA, je souhaite savoir ou faut-il mettre votre VBA dans ma macro SVP ?

Si j'ai compris est ce qu'il faut remplacer :

Range("A10:L15").Select

PAR

'

iRow = Range("L" & Rows.Count).End(xlUp).Row

Range("A10:L" & iRow).Select

'

Et le tour est joué ?

Salut las-dias,

en théorie et si j'ai bien compris le but recherché : OUI.

A+

Bonjour ( ..)

@plas-dias

Certes tu es nul en macro et en VBA, mais pas que... tu peux nous expliquer ce que tu veux vraiment ?

Rechercher des sujets similaires à "macro operations"