excel vba copier coller selon 2 variables (Feuille/colonne)

chandler282

XLDnaute Nouveau
Bonjour,

Je viens vers vous car j'aurai besoin d'un petit (gros ?) coups de main.

J'explique mon besoin :

Dans un onglet " CTI " j'ai une extraction avec des données pour 3 critères que j'appelerai " BLEU ", " JAUNE " et "ROUGE " et pour lesquels l'ordre (a, b, c, d,... etc...) est bon.

Le but est de pouvoir selectionner le mois (case O31) - MARS dans mon exemple - et le jour ouvré (case P31) - 3 dans mon exemple - de l'onglet CTI et qu'il COPIE/COLLE les données " BLEU ", " JAUNE " et "ROUGE " dans la feuille du mois et le jour ouvré correspondant.
Bien entendu les 2 cases O31 et P31 sont 2 menus déroulants, une avec les 12 mois (Janvier à Décembre) correspondant aux 12 feuilles et l'autre avec un chiffre possible de 1 à 23 (jours ouvrés)

En gros, dans mon exemple :

- Pour le critère " BLEU " il copie la feuille " CTI " de O8 à O27, vers la feuille " MARS " de J113 à J132.
- Pour le critère " JAUNE " il copie la feuille " CTI " de P8 à P27, vers la feuille " MARS " de J138 à J157.
- Pour le critère " ROUGE " il copie la feuille " CTI " de Q8 à Q27, vers la feuille " MARS " de J163 à J182.

Voilà,
En espèrant avoir été à peu près clair dans l'explication et que quelqu'un saura m'aider,
Merci d'avance,
Bonne soirée
 

Pièces jointes

  • TEST.xlsm
    110.3 KB · Affichages: 35

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Chandler, bonjour le forum,

En pièce jointe ton fichier modifié avec le code ci-dessous :

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim OM As Worksheet 'déclare la variable OM (onglet du Mois)
Dim COL As Byte 'déclare la variable COL (COLonne)

'si le changement a lieu ailleurs que dans la plage O31:P31, sort de la procédure
If Application.Intersect(Target, Range("O31:P31")) Is Nothing Then Exit Sub '
'si le nombre de valeur dans la plage O31:P31 est inférieur à 2, sort de la procédure
If Application.WorksheetFunction.CountA(Range("O31:P31")) <> 2 Then Exit Sub
Set OM = Worksheets(Range("O31").Value) 'définit l'onglet OM
COL = Range("P31").Value + 7 'définit la colonne COL
OM.Cells(113, COL).Resize(20, 1).Value = Range("O8:O27").Value 'renvoie les données du critère bleu
OM.Cells(138, COL).Resize(20, 1).Value = Range("P8:P27").Value 'renvoie les données du critère jaune
OM.Cells(163, COL).Resize(20, 1).Value = Range("Q8:Q27").Value 'renvoie les données du critère rouge
OM.Select 'sélectionne l'onglet OM (à supprimer si pas nécesaire)
End Sub
 

Pièces jointes

  • Chandler_v01.xlsm
    118.5 KB · Affichages: 28

chandler282

XLDnaute Nouveau
Bonjour Robert,

Avant tout merci pour la rapidité de la réponse, et également pour la réponse en elle-même.
J'ai commencé à tester chez moi et pour le moment tout à l'air de bien fonctionner. Tu as bien cerné le besoin.

Il faudrait juste que je rajoute un bouton à cliquer afin d'éviter les erreurs de manipulation (Nous serons 5 ou 6 à l'utiliser et tous ne sont pas parfaitement à l'aise avec Excel) erreurs du style : on change le jour alors que les données à incrémenter ne sont pas encore actualisé, ou bien, juste après avoir bien actualisé les nouvelles données à incrémenter la personne, en pensant bien faire, re-sélectionne le mois sans avoir changé le jour et écrase par là-même les données de la veille par les nouvelles données...
Cette sécurité avec éventuellement un popup de mise en garde, lorsque l'on clic, du style "attention, merci de bien vérifier la sélection avant de potentiellement écraser des données importantes" et où il faut confirmer que tout est ok ou annuler.

Si, par hasard, tu avais du temps à me consacrer pour ces deux améliorations ce serait volontiers que j'accepterai de nouveau ton aide,

Dans tous les cas, à nouveau, merci beaucoup pour ton temps,
A bientôt
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Chandler, bonjour le forum,

la version 2 avec un bouton est le code ci-dessous :

VB:
Sub Macro1()
Dim CTI As Worksheet 'déclare la variable CTI (onglet CTI)
Dim AD As String 'déclare la variable AD (ADresse)
Dim OM As Worksheet 'déclare la variable OM (onglet du Mois)
Dim COL As Byte 'déclare la variable COL (COLonne)

Set CTI = Worksheets("CTI") 'définit l'onglet CTI
Select Case Application.WorksheetFunction.CountA(CTI.Range("O31:P31")) 'agit en fonction du nombre de valeur dans la plage O31:P31
    Case 0 'aucune
        MsgBox "Données manquantes !" 'message
        CTI.Range("O31").Select 'séctionne la cellule O31 de l'onglet CTI
        Exit Sub 'sort de la procédure
    Case 1 'une seule
        AD = IIf(CTI.Range("O31").Value = "", "O31", "P31") 'définit l'adresse AD
        MsgBox "Donnée manquante !" 'message
        CTI.Range(AD).Select 'séctionne la cellule de l'adresse AD de l'onglet CTI
        Exit Sub 'sort de la procédure
End Select 'fin de l'action en fonction de...

'condition : si "Oui" au message
If MsgBox("Merci de bien vérifier la sélection avant de potentiellement écraser des données importante. Voulez-vous continuer ?", vbYesNo, "ATTENTION !") = vbYes Then
    Set OM = Worksheets(Range("O31").Value) 'définit l'onglet OM
    COL = Range("P31").Value + 7 'définit la colonne COL
    OM.Cells(113, COL).Resize(20, 1).Value = Range("O8:O27").Value 'renvoie les données du critère bleu
    OM.Cells(138, COL).Resize(20, 1).Value = Range("P8:P27").Value 'renvoie les données du critère jaune
    OM.Cells(163, COL).Resize(20, 1).Value = Range("Q8:Q27").Value 'renvoie les données du critère rouge
    OM.Select 'sélectionne l'onglet OM (à supprimer si pas nécesaire)
End If 'fin de la condition
End Sub
 

Pièces jointes

  • Chandler_v02.xlsm
    125.8 KB · Affichages: 31

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Corrige quand même :

VB:
    OM.Cells(113, COL).Resize(20, 1).Value = CTI.Range("O8:O27").Value 'renvoie les données du critère bleu
    OM.Cells(138, COL).Resize(20, 1).Value = CTI.Range("P8:P27").Value 'renvoie les données du critère jaune
    OM.Cells(163, COL).Resize(20, 1).Value = CTI.Range("Q8:Q27").Value 'renvoie les données du critère rouge
 

Discussions similaires

Statistiques des forums

Discussions
311 733
Messages
2 082 019
Membres
101 872
dernier inscrit
Colin T