Tableau Forfait

Bonjour à tous le forum,

J'espère que vous avez la santé.

Je viens à vous ce soir car j'aimerai créer une nouvelle macro.

Le but de cette macro est de faire les actions suivantes :

"Pour toutes les feuilles de calculs sélectionnées préalablement, si dans la colonne G (HT Goal), une cellule indique "Forfait". Tu supprimes toute la ligne de calcul correspondante."

Ainsi si dans la colonne G de la ligne 103, le mot "Forfait" est présent, la macro supprime toute la ligne 103.

Je vous joins l'Excel.

Je suis disponible si vous avez des questions.

Je vous remercie par avance de votre aide et vous souhaite une bonne soirée.

Laplacea

Bonjour,

Une proposition à étudier.

Les données sont sous forme de tableaux structurés et on consolide avec une requête Power Query.

Cdlt.

Salut,

Evite absolument de placer des instructions - telles que tes feuilles vides avec des noms en forme d'information - car on ne sait plus ce qui est ''Info pour le Forum'' ou ''Info pour l'utilisateur''. De plus, il est difficile d'avoir l'historique des infos, car il faudrait - au bout de quelques échanges - rouvrir plusieurs fichiers Excel à la place d'avoir simplement l'historique dans les différents messages du fil.

Ceci étant dit, dans le fichier ci-joint, j'ai placé un bouton sur la feuille ''Base'' auquel est relié une macro qui devrait répondre à ton attente. Les inconvénients étant que cette feuille doit exister (ou que tu dois déplacer ce bouton sur une feuille existante de ton fichier réel) et que cette feuille contenant le bouton doit être sélectionnée en premier parmi toutes les feuilles que tu veux sélectionner pour traitement (autrement le bouton n'est pas visible à la fin de ta sélection de feuilles).

Si cette solution ne te convient pas, on pourra trouver une solution afin de déclencher la macro d'une autre manière, par exemple par une combinaison de touches ou par un bouton placé dans le ruban du sommet.

Il y a quand même une chose qui m'interpelle : pourquoi effectuer une sélection de feuilles à traiter et non pas dire : "La macro doit traiter toutes les feuilles contenant ''HT goal'' en G2'' ou ''La macro doit traiter toutes les feuilles dont le nom est comme-ci, comme-ça'' ou ''La macro doit traiter toutes les feuilles dont le nom commence par un chiffre'' ou que sais-je d'autre ?

EDIT : Salut Jean-Eric, j'arrive un peu tard !

10laplacea-v1.xlsm (426.84 Ko)

Salut Yvouille,

Je te remercie pour ton retour et pour le temps que tu as consacré à ma demande. C'est vraiment sympa.

Je n'ai pas tout à fait compris la deuxième partie de ton premier paragraphe. Si je peux améliorer ma communication pour être ensemble plus efficace, je le ferai sans souci !

Concernant la macro, elle répond pleinement à mes attentes. Je comprends le problème que tu soulèves mais aucun souci de mon côté.

Pour ta suggestion, je comprends tout à fait pourquoi tu l'as pose et c'est top de me la proposer pour tenter d'optimiser mon Excel. Mais, je n'ai pas besoin de traiter toutes les feuilles de calcul d'un Excel. C'est en quoi je préfère d'abord sélectionner les feuilles correspondantes avant de d'utiliser la macro.

Je te remercie pour ton temps et je te souhaite un bon après-midi Yvouille.

Bien à toi.

Laplacea

Salut,

Jean-Eric a également répondu à ta demande. Ce serait sympa de lui dire deux mots au sujet de sa solution.

Les inconvénients étant que cette feuille doit exister (ou que tu dois déplacer ce bouton sur une feuille existante de ton fichier réel) et que cette feuille contenant le bouton doit être sélectionnée en premier parmi toutes les feuilles que tu veux sélectionner pour traitement (autrement le bouton n'est pas visible à la fin de ta sélection de feuilles).

Je ne sais pas si c'est de cette partie de mon texte auquel tu fais mention, mais si c'est bien le cas, je vais tenter de dire la même chose autrement.

Si tu veux sélectionner plusieurs feuilles, c'est la première qui reste affichée à l'écran. Ainsi, dans mon fichier, si tu ne sélectionnes pas la feuille ''Base'' avant de sélectionner les feuilles à traiter, tu ne peux plus cliquer sur le bouton en place sur la feuille ''Base''.

Ensuite, comme j'ai créé cette feuille ''Base'' car il fallait bien placer ce bouton quelque part et je ne pouvais effectivement pas le placer sur l'une des feuilles ''traitables'', car sinon, si tu devais justement ne pas traiter cette feuille, tu n'aurais pas le bouton à disposition. Mais si cette feuille ''Base'' t'embête, je t'ai indiqué que tu pouvais déplacer le bouton sur une autre feuille qui existait éventuellement dans ton fichier mais qui n'aura jamais à être traitée par la macro.

Si ce n'est pas cette partie du texte qui te causait problème, cite le passage exact concerné.

A te relire.

Désolé Jean-Eric, pour être tout à fait honnête je me suis fixé sur l'image de Yvouille et je suis resté sur son message que j'ai oublié de te répondre.

Je te remercie pour le temps que tu as consacré pour ce fichier.

Je comprends la logique des tableaux que tu as réalisés. Mais je souhaitais vraiment avoir une macro comme Yvouille l'a présenté. Cela partait d'une bonne idée et je t'en remercie.

Et excuses moi encore pour cette impolitesse. Heureusement que Yvouille est là !

Pour notre échange Yvouille,

Il s'agit bien de cette partie là.

Je comprends la praticité du bouton. Mais je préfère qu'il n'y ait pas de bouton car j'enchaine plusieurs macros ensuite. J'aimerai simplement une macro qui s'exécute sur les feuilles sélectionnées. Si tu peux réécrire la macro de sorte qu'elle s'exécute sur toutes les feuilles sélectionnées je suis preneur.

Je te remercie par avance à ta demande et je suis à votre disposition sur le forum.

Je te souhaite une bonne soirée.

Laplacea

Re-bonjour,

J'aimerai simplement une macro qui s'exécute sur les feuilles sélectionnées. Si tu peux réécrire la macro de sorte qu'elle s'exécute sur toutes les feuilles sélectionnées je suis preneur.

Il n'y a pas besoin de réécrire cette macro, il faut juste trouver comment tu souhaites qu'elle soit lancée. J'avais proposé un bouton en premier, mais il doit y avoir 100 à 200 manières de lancer une macro (bon, j'exagère surement un peu, mais il y en a en tous cas plusieurs ).

Comme tu indiques qu'il y a d'autres macros en jeu, on pourrait éventuellement appelé mon bout de code par l'intermédiaire d'une autre macro que tu lancerais. Mais ne connaissant pas ton fichier, je ne peux pas te dire si cette possibilité est réalisable ou non. De plus, il faudrait malgré tout que toutes les feuilles à traiter soient sélectionnées au moment du lancement de cette autre macro.

Ou alors on pourrait appeler ma macro depuis une autre macro malgré que fait que les feuilles à traiter ne seraient pas sélectionnées au préalable, mais il faudrait alors trouver une autre manière de déterminer quelles feuilles doivent être traitées, lesquelles non (par exemple selon leur nom, ou selon une ou des cellules quelconques de chaque feuille qui contiendrait une information permettant de dire s'il faut traiter telle ou telle feuille, ou traiter systématiquement toutes les feuilles et effacer toutes les lignes contenant ''Forfait'' en colonne G, etc.)

Autrement je t'ai déjà proposé d'autres pistes :

Si cette solution ne te convient pas, on pourra trouver une solution afin de déclencher la macro d'une autre manière, par exemple par une combinaison de touches ou par un bouton placé dans le ruban du sommet.

Comme tu veux "jouer à cache-cache" et ne pas me montrer ton fichier réel, il est difficile pour moi de bien comprendre tes souhaits et de t'aider au mieux. Je ne peux émettre que sur des suppositions, effectuer des tentatives ....... Mais je continue volontiers à t'aider dans ces conditions si ton fichier est réellement ultra-secret et qu'il ne doit en aucun cas tomber en mains ennemies

Chaleureusement.

Hello Yvouille,

J'espère que tu vas bien.

Je ne peux pas te présenter l'Excel final car il est en construction. Donc je n'ai pas une totale visibilité sur la fichier final.

Je te remercie pour toutes tes propositions ! C'est vraiment sympa de t'impliquer autant sur nos fichiers. Et je vois que tu as plus d'un tour dans ton sac ahah.

Quand j'aurai plus de visibilité, dans ce cas je te propose de revenir vers toi.

En tout cas merci pour ta générosité, ton implication et pour le temps que tu consacres sur chacune des demandes du forum.

D'ici là, prends soin de toi et je suis disponible si tu veux me présenter d'autres de tes tours ahah.

Bien à toi.

Laplacea

Hello Yvouille, bonsoir le forum,

J'espère que tu vas bien.

Je reviens à toi concernant la macro que tu as réalisé pour le forfait.

J'aimerai la modifier de telle sorte à ce que la macro analyse chaque ligne de la colonne B à partir de la ligne 3 et chercher si le mot "Forfait"apparait.

On va avoir des cellules avec inscrit "19.03. 16:00Forfait" Dans ce cas si "Forfait" apparait, j'aimerais que la macro supprime l'ensemble de la ligne.

Je suis à ta disposition si tu as des questions et je te remercie par avance pour ton temps Yvouille !

Prends soin de toi.

Laplacea

Bonjour,

Une proposition.

La procédure agit sur les feuilles préalablement sélectionnées.

ALT F8 et exécuter Main ou utiliser le raccourci clavier Ctrl + m.

Cdlt.

Public Sub Main()
Dim ws As Worksheet
    For Each ws In ActiveWindow.SelectedSheets
        Clean_Data ws
    Next
    Worksheets(1).Select
End Sub

Private Sub Clean_Data(ws As Worksheet)
Dim lastRow As Long
Dim rngData As Range, rngToDelete As Range, Cell As Range
    With ws
        lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
        Set rngData = .Cells(3, 2).Resize(lastRow - 2)
        For Each Cell In rngData
            If LCase(Cell) Like "*forfait*" Then
                If rngToDelete Is Nothing Then
                    Set rngToDelete = Cell.Resize(, 6)
                Else
                    Set rngToDelete = Union(rngToDelete, Cell.Resize(, 6))
                End If
            End If
        Next Cell
        If Not rngToDelete Is Nothing Then rngToDelete.Delete
        Set rngToDelete = Nothing
        .Cells(3, 2).Resize(, 6).EntireColumn.AutoFit
    End With
End Sub

Hello Jean-Eric,

Je te remercie pour ton retour.

La macro fonctionne bien, merci beaucoup !

Je profite de l'occasion pour m'excuser auprès de toi de la maladresse que j'ai eu dans les premiers messages de la conversation.

Je te souhaite une bonne journée et prends soin Jean-Eric

Laplacea

Bonjour Jean-Eric, Yvouille, le forum,

J'espère que vous allez bien.

Je viens à vous car j'aimerai ajouté une condition supplémentaire au code suivant :

Public Sub Main()
Dim ws As Worksheet
    For Each ws In ActiveWindow.SelectedSheets
        Clean_Data ws
    Next
    Worksheets(1).Select
End Sub

Private Sub Clean_Data(ws As Worksheet)
Dim lastRow As Long
Dim rngData As Range, rngToDelete As Range, Cell As Range
    With ws
        lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
        Set rngData = .Cells(3, 2).Resize(lastRow - 2)
        For Each Cell In rngData
            If LCase(Cell) Like "*forfait*" Then
                If rngToDelete Is Nothing Then
                    Set rngToDelete = Cell.Resize(, 6)
                Else
                    Set rngToDelete = Union(rngToDelete, Cell.Resize(, 6))
                End If
            End If
        Next Cell
        If Not rngToDelete Is Nothing Then rngToDelete.Delete
        Set rngToDelete = Nothing
        .Cells(3, 2).Resize(, 6).EntireColumn.AutoFit
    End With
End Sub

Ici, j'aimerais que la macro regarde sur chaque ligne jusqu'à la dernière qui a du contenu, à partir de la 3ᵉ comme précédemment.

Si dans une ligne le mot "Forfait" apparait soit dans la colonne B, soit dans le colonne G, soit dans les 2, de supprimer toutes la ligne

Je vous remercie par avance pour votre aide et je vous souhaite un bon début de week-end !

Bien à vous.

Laplacea

Bonjour,

Essaie ainsi :

Private Sub Clean_Data(ws As Worksheet)
Dim lastRow As Long
Dim rngData As Range, rngToDelete As Range, Cell As Range
    With ws
        lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
        Set rngData = .Cells(3, 2).Resize(lastRow - 2)
        For Each Cell In rngData
            If LCase(Cell) Like "*forfait*" Or LCase(Cell.Offset(, 5)) Like "*forfait*" Then
                If rngToDelete Is Nothing Then
                    Set rngToDelete = Cell.Resize(, 6)
                Else
                    Set rngToDelete = Union(rngToDelete, Cell.Resize(, 6))
                End If
            End If
        Next Cell
        If Not rngToDelete Is Nothing Then rngToDelete.Delete
        Set rngToDelete = Nothing
        .Cells(3, 2).Resize(, 6).EntireColumn.AutoFit
    End With
End Sub

Salut Jean-Eric, le forum,

Je te remercie pour ton retour.

Cela fonctionne bien ! Je t'en remercie.

Je te souhaite une bonne soirée.

Bien à toi.

Laplacea

Rechercher des sujets similaires à "tableau forfait"