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,
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
@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.
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??
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
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,
Pour le reste c'est vu et c'est très bien. Merci
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.
à 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é.
[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
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???
[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 :
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