Macro bouton pour faire des planning

Bonjour,

Je suis en charge de faire les planning de mes collègues mais je perd du temps à faire des copier coller et le temps j'en ai de moins en moins. Du coup, je cherchais un moyen de faire des boutons avec des matrices type de chaque horaires que nous pouvons faire.

Dans le fichier ci-joint, chaque matrice d'horaires sont sur les lignes 7 et 8.

D7:E8 est une matrice d'ouverture par exemple.

Du coup, je voulais créer un bouton où quand je cliques dessus, ça me copie la matrice voulue et ensuite je le colle là ou je veux. Tant que je n'ai pas cliqué sur un autre bouton, il garde en mémoire la même matrice. (il faut prévoir un bouton "finir" pour casser la boucle)

Je sais faire la base :

Sub S44_Bouton1_Cliquer()

Range("D7:E8").Copy

 ActiveSheet.Paste

End Sub

Mais je dois à chaque fois sélectionner la cellule voulue avant puis d'appuyer sur le bouton. (je veux faire l'inverse. Appuyer sur le bouton puis choisir la cellule de destination autant de fois que je le veux)

et ce autant de bouton qu'il y a de matrice d'horaire dans mon fichier. Je pense qu'il doit y avoir un bouton d'arrêt à prévoir sinon à chaque clique il va me copier la matrice et ça va être le bordel XD.

merci d'avance

vianney

Bonsoir,

Une proposition sensiblement différente !

Procédure utilisant le clic droit, tant pour définir l'horaire que pour le reproduire.

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    Static Hor
    Dim n%, k%, dn%, dk%
    If Not Sh.Name Like "S#*" Then Exit Sub
    n = Target.Row: k = Target.Column
    If Not Intersect(Target, Sh.Range("D7:Q8")) Is Nothing Then
        dn = n Mod 3 - 1: dk = k Mod 2
        n = n - dn: k = k - dk
        Hor = Sh.Cells(n, k).Resize(2, 2).Value
        Cancel = True
    ElseIf Not Intersect(Target, Sh.Range("D48:Q73")) Is Nothing Then
        dn = n Mod 3: dk = k Mod 2
        If dn = 2 Then Exit Sub
        If IsEmpty(Hor) Then
            MsgBox "Aucun horaire initialisé !" & Chr(10) & "Initialisez un " _
             & "horaire avant de le dupliquer.", vbInformation, "Initialisation horaire"
            Exit Sub
        End If
        n = n - dn: k = k - dk
        Sh.Cells(n, k).Resize(2, 2).Value = Hor
        Cancel = True
    End If
End Sub

La procédure est à copier et coller dans le module ThisWorkbook. Elle s'exécutera automatiquement à chaque clic droit sur une feuille...

Ce qu'elle fait :

Si la feuille n'est pas une feuille Sxx : rien (le menu contextuel apparaîtra comme d'habitude au clic droit).

Si feuille Sxx :

Hors zone D7:Q8 ou D48:Q73 : rien (effet normal du clic droit)

Sur une des lignes intermédiaires vides de la zone D48:Q73 : rien (effet normal du clic droit)

Clic droit dans la zone D7:Q8 :

Elle identifie le bloc de 4 cellules définissant un horaire, auquel la cellule cliquée appartient, et met en mémoire l'horaire concerné.

(NB- On peut cliquer sur n'importe quelle des 4 cellules d'un horaire, la procédure calculera la position du bloc.)

Clic droit dans la zone D48:Q73 (hors lignes vides intermédiaires) :

De même que précédemment, elle identifie le bloc de 4 cellules où doit être apposé l'horaire, quelle que soit celle des 4 cellules qui est cliquée. Et elle y insère l'horaire qu'elle a en mémoire.

Si on a omis au démarrage de mémoriser un horaire, elle le signale à l'utilisateur pour qu'il y procède.

Tout nouvel horaire mémorisé remplacera le précédent.

Cordialement.

Donc si je comprend bien, cette macro est activé quelque soit l'onglet. Et je dois dupliquer la procédure autant de fois qu'il y a d'horaires ? Ou juste une partie ?

If Not Intersect(Target, Sh.Range("D7:Q8")) Is Nothing Then
        dn = n Mod 3 - 1: dk = k Mod 2
        n = n - dn: k = k - dk
        Hor = Sh.Cells(n, k).Resize(2, 2).Value
        Cancel = True
    ElseIf Not Intersect(Target, Sh.Range("D48:Q73")) Is Nothing Then
        dn = n Mod 3: dk = k Mod 2
        If dn = 2 Then Exit Sub
        If IsEmpty(Hor) Then
            MsgBox "Aucun horaire initialisé !" & Chr(10) & "Initialisez un " _
             & "horaire avant de le dupliquer.", vbInformation, "Initialisation horaire"
            Exit Sub
        End If 

Je pensais a dupliquer a la suite ce code en changeant D7:Q8 par les autres matrices

Bonjour,

Il n'y a qu'une seule macro pour intervenir sur l'évènement double-clic sur toutes les feuilles, c'est pourquoi elle est placée dans le module classeur (ThisWorkbook).

Elle peut intervenir sur toutes les feuilles semaines car celles-ci ont toutes la même structure :

  • la zone de matrice des horaires en D7:Q8
  • la zone où se placent les horaires en D48:Q73
si cette structure devait se modifier un tant soit peu, il faudrait réadapter la macro.

Chaque horaire est dimensionné sur 4 cellules. La macro récupère la position de la cellule cliquée en ligne et colonne, et elle définit si cette position correspond à une 1re ou 2e ligne d'un bloc horaire, et à une 1re ou 2e colonne du bloc. A partir de quoi elle peut calculer la position de la cellule supérieure gauche du bloc dans lequel se trouve la cellule cliquée.

Cordialement.

Autant pour moi j'ai mal lu la plage de cellule... Désolé. Un gros merci pour l'explication. C'est ce qui me.manquait pour comprendre.

Encore un gros gros merci

Bonne continuation !

Rechercher des sujets similaires à "macro bouton planning"