Copier/Coller plage de cellule sans destination fixe

Bonjour,

Etant en train de "m'auto-former" à VBA en réalisant des fichiers pour le boulot, je souhaite réaliser un planning pour mon équipe de techniciens.

Cependant je n'arrive pas à trouver la solution à mon problème par moi-même ou en adaptant un code trouver sur le net.

Pour faire court, voici le fonctionnement théorique du fichier joint :

  • Dans l'onglet "Planning", je sélectionne un horaire pour une semaine et un technicien spécifique via le menu déroulant des lignes 11,14,17... etc
  • Une macro me cherche l'horaire dans l'onglet "Horaires" et me copie (avec la mise en forme) les 7 cellules (du dimanche au lundi) correspondantes.
  • Elle les colle au dessus de la cellule où j'ai choisi l'horaire dans l'onglet "Planning"

J'espère avoir été clair et reste à votre disposition pour plus d'infos si besoin.

10test-planning.xlsx (442.95 Ko)

Bonjour,

Une proposition d'évènementielle...

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim CelH As Range, h%, k%, n%, ChoixH$
    On Error Resume Next
    If Target.MergeArea.Count <> 7 Then Exit Sub
    On Error GoTo 0
    If Not Intersect(Target, Me.Range("C11:OE47")) Is Nothing Then
        ChoixH = Target.Value
        With [HORAIRES]
            For h = 1 To 16
                If .Cells(h, 1) = ChoixH Then Exit For
            Next h
        End With
        If h <= 16 Then
            k = ((h - 1) \ 4) * 8 + 3
            n = ((h - 1) Mod 4) * 5 + 4
            Set CelH = Worksheets("Horaires").Cells(n, k).Resize(, 7)
            CelH.Copy Target.Offset(-1, -1)
        End If
    End If
End Sub

Cordialement.

Une version modifiée (pour pouvoir effacer sans erreur... !)

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim CelH As Range, h%, k%, n%, ChoixH$
    If (Target.Row - 11) Mod 3 <> 0 Then Exit Sub
    If Not Intersect(Target, Me.Range("C11:OE47")) Is Nothing Then
        ChoixH = Target.Cells(1, 1).Value
        With [HORAIRES]
            For h = 1 To 16
                If .Cells(h, 1) = ChoixH Then Exit For
            Next h
        End With
        If h <= 16 Then
            k = ((h - 1) \ 4) * 8 + 3
            n = ((h - 1) Mod 4) * 5 + 4
            Set CelH = Worksheets("Horaires").Cells(n, k).Resize(, 7)
            CelH.Copy Target.Offset(-1, -1)
        Else
            With Target.Offset(-1, -1).Resize(, 7)
                .ClearContents
                .Interior.ColorIndex = xlColorIndexNone
            End With
        End If
    End If
End Sub

Je dois tout de même te signaler que si j'avais à utiliser un dispositif de ce type, je disposerais mes données à récupérer autrement, de façon à en faciliter l'accès...

En outre, il ne devrait pas t'échapper que les fusions de cellules provoquent quelques difficultés... Toutefois, étant moins rigoureux sur ce point que d'autres intervenants, j'ai pris le temps de chercher un contournement qui a donné lieu à la version ci-dessus. L'alternative aurait été de reprendre la conception à zéro !

Merci beaucoup MFerrand,

Cela correspond exactement à ce que je voulais!!

En prenant le temps j'ai réussi à comprendre le code mais je n'aurais jamais pu le pondre moi-même au vu de mon bas niveau d'autodidacte en VBA.

Juste une question : Comment tu à trouver les formules pour les k & n?? Aux vues de leur complexité, soit tu es un génie soit tu as un outil!!

Encore merci pour le code ainsi que ta rapidité de réponse.

Bonjour,

Juste une question : Comment tu à trouver les formules pour les k & n?? Aux vues de leur complexité, soit tu es un génie soit tu as un outil!!

Ce type de question se formule : comment à partir d'une série type 1, 2, 3, 4... tu génères de nouvelles séries en appliquant un calcul semblable... Il y a des petits génies du calcul mental qui te font ça en répondant du tac au tac, sinon lorsqu'on est pas dans ce cas, on tâtonne plus ou moins longtemps, mais une assez longue pratique permet de trouver une solution dans un délai raisonnable.

On connait le type d'opération à privilégier : souvent on doit ramener la série initiale à partir de 0, ensuite généralement on applique une multiplication par un coeff., et une addition (nombre fixe ou dépendant également du membre de la série initiale) ou bien (passant d'une série croissante à une décroissante) on soustrait le résultat trouvé d'une constante fixe...

Il y a aussi l'utilisation de quotient entier (opérateur \) et du modulo (Mod) qui dans des cas comme celui-ci permettent un décalage répétitif, le quotient entier permettant une progression par bond (passage d'une colonne à une autre) et le modulo de répéter les mêmes valeurs pour chaque valeur de quotient (succession de lignes dans chaque colonne)...

Cordialement.

Rechercher des sujets similaires à "copier coller plage destination fixe"