Peut-on faire en 1 macro ce que j'ai en 3 ?

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à toutes et à tous,

Voilà longtemps … LOL

Me voici avec un « petit souci » que je n’arrive pas à résoudre et j’ai besoin de votre aide, si vous le voulez bien.

Dans le classeur ci-joint(feuilles protegées sans MdP), j’ai besoin :
- De copier de la feuille « Repondeurs », en appuyant sur un bouton, des cellules dans une autre feuille.
- De supprimer la ligne copiée,

Le principe de fonctionnement est le suivant :
- Je sélectionne « OUI » dans une cellule de ma feuille « Repondeurs » en colonne W
- Je clique sur le bouton GO correspondant à la feuille destinatrice,
- La macro sélectionne les cellules à copier de la ligne sur laquelle j’ai mis OUI dans la cellule en W,
- La macro me créé une ligne et fait la copie dans la feuille destinatrice des cellules sélectionnées dans "Répondeurs",
- Enfin, la macro revient sur « Répondeurs », supprime la ligne concernée et me repositionne dans la feuille destinatrice,

Ça fonctionne bien mais, Mon « petit souci »:
Pour y arriver, j’ai du faire 3 macros :
- TransfertRepondeursDuMatin,
- TransfertRepondeursDuSoir,
- TransfertRepondeursDuRdV,

Est-il possible de faire cela en une seule macro ?

Avec mes remerciements pour votre aide toujours si précieuse,
Je vous souhaite à toutes et à tous un très beau dimanche.
Amicalement,
Lionel,
 

Pièces jointes

  • Copie vers autre feuille.xlsm
    65.7 KB · Affichages: 34
  • Copie vers autre feuille.xlsm
    65.7 KB · Affichages: 47
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re : Peut-on faire en 1 macro ce que j'ai en 3 ?

Bonjour Hieu,

Merci pour cette réponse si rapide.

ça marche mais l'optimisation serait de n'avoir qu'1 macro au lieu de 3 car dans mon fichier de travail, j'ai beaucoup de feuilles destinatrices.

Un grand merci pour ce code.
Amicalement,
Lionel,
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re : Peut-on faire en 1 macro ce que j'ai en 3 ?

Rectification :
J'ai répondu trop vite car je pensait que ça marchait mais ce n'est pas le cas à cause du code :
If [Selection] <> "OUI" Then Exit Sub

En effet, selon la feuille choisi, le code "ActiveCell.Offset(0, -16).Select" change selon la feuille destinatrice :
ActiveCell.Offset(0, -16).Select si la feuille destinatrice est DuMatin,
ActiveCell.Offset(0, -17).Select si la feuille destinatrice est DuSoir,
ActiveCell.Offset(0, -16).Select si la feuille destinatrice est RdV,

Je pense que la solution se trouve dans le code : If [Selection] <> "OUI" Then Exit Sub
Il faudrait trouver le code qui tienne compte dans [Selection] de la colonne ( W, X ou Y ) où est le OUI

Bonne fin de dimanche,
Amicalement,
Lionel,
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : Peut-on faire en 1 macro ce que j'ai en 3 ?

Bonjour Lionel, Hieu

@Lionel: je ne comprends pas pourquoi dans le module Ligne tu as 3 fois la même macro.?? :confused:

Ensuite, on ne cesse de répéter qu'il est conseillé de ne pas utiliser SELECT à tout bout de champs comme tu l'a fait.

Voici l'une des macros corrigée

Code:
Sub CopieLigneDuMatin()
    Application.ScreenUpdating = False
    Sheets("DuMatin").Activate
    With ActiveSheet
    .Unprotect Password:=""
    .Range("A5").FormulaR1C1 = "=0"

    With .Range("A6")
    .EntireRow.RowHeight = 35
    .FormulaR1C1 = "0"
    End With
    
    With .Range("E6")
    .FormulaR1C1 = "=TODAY()"
    .EntireRow.Copy .Cells(Rows.Count, 1).End(xlUp)(2)
    End With
    
   With  .Range("E7:E2000")
           .Copy    'COLLER OÙ ???
    End With

    .Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True
    .EnableSelection = xlUnlockedCells
End With
    Application.MoveAfterReturn = True
    
End Sub


Une autre chose me chifonne: .Range("E7:E2000").Copy, tu fait un copier-coller dans la même colonne?? :confused:
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : Peut-on faire en 1 macro ce que j'ai en 3 ?

RE Lionel

Une correction de la correction ;)

Code:
Sub CopieLigneDuMatin()
    Application.ScreenUpdating = False
    With Sheets("DuMatin")
    .Unprotect Password:=""
    .Rows("6:6").RowHeight = 35
    .Range("A5").FormulaR1C1 = "=0"
    .Range("A6").FormulaR1C1 = "0"
    .Range("E6").FormulaR1C1 = "=TODAY()"
    .Range("E6").Copy .Cells(Rows.Count, 1).End(xlUp)(2)
    '.Range("E7:E2000").Copy   'COLLER OÙ ???
End With
    Application.MoveAfterReturn = True
    With Sheets("DuMatin")
    .Rows("6:6").RowHeight = 0
     .Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True
   .EnableSelection = xlUnlockedCells
    End With
End Sub

En corrigeant aussi la macro de l'autre module et en l'ajoutant à celle-ci, tu pourra faire 1 seule macro.

EDIT: en ce qui concerne ceci

ActiveCell.Offset(0, -16).Select si la feuille destinatrice est DuMatin,
ActiveCell.Offset(0, -17).Select si la feuille destinatrice est DuSoir,
ActiveCell.Offset(0, -16).Select si la feuille destinatrice est RdV

Tu ne peux mettre seulement ActiveCell, il faut qu'elle soie en référence avec sa propre feuille; et dans ce cas

With Sheets("DuMatin") .Cells.Offset(0, -16) etc
With Sheets("DuSoir") .Cells.Offset(0, -17) etc
With Sheets("RdV") .Cells.Offset(0, -16) etc
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re : Peut-on faire en 1 macro ce que j'ai en 3 ?

Re-Bonjour,

Voici mes réponses :
Lionel: je ne comprends pas pourquoi dans le module Ligne tu as 3 fois la même macro.??
Ensuite, on ne cesse de répéter qu'il est conseillé de ne pas utiliser SELECT à tout bout de champs comme tu l'a fait.


Effectivement, une fois suffit et j'avais omis de rectifier, c'est fait dans le classeur joint et j'ai modifié la macro avec ton code rectifié.


Une autre chose me chiffonne: .Range("E7:E2000").Copy, tu fais un copier-coller dans la même colonne??
C'est un besoin que j'avais précédemment dans mon classeur principal mais qui n'est plus d'utilité, j'ai enlevé ces codes.

Crois-tu qu'il y a une possibilité pour ma première question ?

Merci d'avoir été là encore une fois.
Bonne fin de dimanche,
Amicalement,
Lionel,
 

Pièces jointes

  • Copie vers autre feuille.xlsm
    71.1 KB · Affichages: 37
  • Copie vers autre feuille.xlsm
    71.1 KB · Affichages: 31
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re : Peut-on faire en 1 macro ce que j'ai en 3 ?

Re-Bonjour Lone-Wolf,

Pour le reste c'est vu et c'est très bien. Merci :eek:
A la place de :
With .Select.Sheets("DuMatin") .Cells.Offset(0, -16)
With Sheets("DuSoir") .Cells.Offset(0, -17)
With Sheets("RdV") .Cells.Offset(0, -18)

On ne pourrait pas mettre :
With si le OUI est dans la colonne X .Cells.Offset(0, -16)
With si le OUI est dans la colonne Y .Cells.Offset(0, -17)
With si le OUI est dans la colonne Z .Cells.Offset(0, -18)

car les -15, *16 et -17 (cellules à copier) sont dans la feuille "Repondeurs"
Mais je ne sais pas faire.

Si on y arrive pas, je laisserai les 3 macros.

Encore merci.
Amicalement,
Lionel,
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : Peut-on faire en 1 macro ce que j'ai en 3 ?

Re,

à quoi correspondent [Selection] et .Cells.Offset(0, -16/-17/-18)??

Si le OUI est dans la colonne X, Y et Z; mais de quelle feuille??

EDIT: Il y a une erreur dans la dernière macro, si tu veux copier de la feuille DuMatin à la feuille Repondeur.

Sheets("DuMatin").Range("E6").Copy Sheets("Repondeur").Cells(Rows.Count, 1).End(xlUp)(2). La macro que tu as mis n'est pas la bonne, il faut prendre la dernière que j'ai corrigé.
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re : Peut-on faire en 1 macro ce que j'ai en 3 ?

Re,

[Selection] correspond à la cellule qui contient "OUI" (cela peut être en X, Y ou Z sur n'importe quelle ligne)

Cells.Offset(0, -16/-17/-18)

Correspond au renvoi à la cellule de la même ligne colonne -16 si "oui" en col X(-17 si "oui" en col Y - -18 si "oui" en col Z)

donc -16,-17 ou -18 pour sélectionner la première cellule à partir de laquelle la copie sera faite,

Exemple avec "oui en col X :
ActiveCell.Offset(0, -16).Select

Ce code ci-dessous sélectionne 5 cellules à copier y compris la première atteinte précédemment.
ActiveCell.Offset(0, 0).Resize(, 5).Select
Selection.Copy


Je pense qu'il faudrait que le code exécute :

si cellule qui contient "OUI" est en col X = code ActiveCell.Offset(0, -16).Select
si cellule qui contient "OUI" est en col Y = code ActiveCell.Offset(0, -17).Select
si cellule qui contient "OUI" est en col Z = code ActiveCell.Offset(0, -18).Select

Mais ça, je ne sais pas faire.

Merci de m'avoir encore répondu,
Lionel,
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : Peut-on faire en 1 macro ce que j'ai en 3 ?

Re

De la façon dont tu écrit [Selection], celà veux dire que c'est une plage nommée et dans définir un nom elle n'y est pas. Tu n'a pas répondu à mes questions. À quelle colonne correspondent -16 -17 -18??? À la colonne B C D??? De quelle Feuille? DuSoir DuMatin?? DeLAprèsMidi???
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re : Peut-on faire en 1 macro ce que j'ai en 3 ?

Re,

[Selection] n'est pas une plage nommée mais le code qui renvoie à la cellule sélectionnée au moment ou j'écris OUI dans une cellule.

J'ai pourtant répondu de mon mieux à tes questions mais je dois mal m'expliquer :

[Selection] correspond à la cellule qui contient "OUI" (cela peut être en X, Y ou Z sur n'importe quelle ligne)

Cells.Offset(0, -16/-17/-18)

Correspond au renvoi à la cellule de la même ligne colonne -16 si "oui" en col X(-17 si "oui" en col Y - -18 si "oui" en col Z)

donc -16,-17 ou -18 pour sélectionner la première cellule à partir de laquelle la copie sera faite,

Exemple avec "oui en col X :
ActiveCell.Offset(0, -16).Select

Ce code ci-dessous sélectionne 5 cellules à copier y compris la première atteinte précédemment.
ActiveCell.Offset(0, 0).Resize(, 5).Select
Selection.Copy


Je pense qu'il faudrait que le code exécute :

si cellule qui contient "OUI" est en col X = code ActiveCell.Offset(0, -16).Select
si cellule qui contient "OUI" est en col Y = code ActiveCell.Offset(0, -17).Select
si cellule qui contient "OUI" est en col Z = code ActiveCell.Offset(0, -18).Select

Voici le code complet qui s'exécute après avoir écrit (par sélection validation de donnée) OUI dans une cellule et après avoir cliqué sur le bouton GO de la colonne concernée (dans lequel j'ai mis le OUI :

Code:
Sub TransfertRepondeursDuMatin()
Application.EnableEvents = False
Application.ScreenUpdating = False

Sheets("DuMatin").Select
ActiveSheet.Unprotect Password:=""
Sheets("Repondeurs").Select
ActiveSheet.Unprotect Password:=""

If [Selection] <> "OUI" Then Exit Sub
Sheets("DuMatin").Select
Call CopieLigne
ActiveSheet.Cells(Rows.Count, "G").End(xlUp)(1).Select

Sheets("Repondeurs").Select
ActiveCell.Offset(0, -16).Select
ActiveCell.Offset(0, 0).Resize(, 5).Select
Selection.Copy

Application.EnableEvents = False
Application.ScreenUpdating = False
Sheets("DuMatin").Select
ActiveSheet.Cells(Rows.Count, "G").End(xlUp)(1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        
Application.EnableEvents = True
Application.ScreenUpdating = True
ActiveCell.Offset(0, 5).Select
ActiveCell.FormulaR1C1 = "A RAPPELER"

Application.EnableEvents = False
Application.ScreenUpdating = False
Sheets("Repondeurs").Select
ActiveSheet.Unprotect Password:=""
Selection.EntireRow.Delete
ActiveSheet.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True
    ActiveSheet.EnableSelection = xlUnlockedCells
Range("H3").Select

Sheets("DuMatin").Select
ActiveSheet.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True
    ActiveSheet.EnableSelection = xlUnlockedCells
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Lionel,
 

Lone-wolf

XLDnaute Barbatruc
Re : Peut-on faire en 1 macro ce que j'ai en 3 ?

Re

Voici, ce qui pour moi est plus correcte

Code:
Public plageMatin As Range, plageSoir As Range, plageRdv As Range, cel As range

With Sheets("Repondeurs")
Set plageMatin = .Range("w7:w12")
For each cel in plageMatin
If cel.value = "OUI" Then
Sheets("DuMatin").Range("E6").Copy .Cells(Rows.Count, 1).End(xlUp)(2)
Else
Exit For
End If
Next cel

Set plageSoir = .Range("x7:x12")
For each cel in plageSoir
If cel.value = "OUI" Then
Sheets("DuSoir").Range("E6").Copy .Cells(Rows.Count, 1).End(xlUp)(2)
Else
Exit For
End If
Next cel

Set plageRdv = .Range("y7:y12")
For each cel in plageRdv
If cel.value = "OUI" Then
Sheets("Rdv").Range("E6").Copy .Cells(Rows.Count, 1).End(xlUp)(2)
Else
Exit For
End If
Next cel
End With
 
Dernière édition:

Statistiques des forums

Discussions
312 206
Messages
2 086 203
Membres
103 157
dernier inscrit
youma