VBA qui rempli cellule au clic

bonjour a tous ,j 'essaye d'approfondir mes connaissances mais que c dur

alor mon soucis est le suivant j'y arrive avec formule si...nb .si mais je me suis mis dans la tete de le faire ne vba et la blocage .comment remplir une cellule sur deux de texte predefini .par avance merci a tous

22vba.xlsx (13.97 Ko)

Bonsoir,

Sub Planning()
    Dim pln1, pln2, P, i%, k%
    pln1 = Split("mat apm mat apm mat rep")
    pln2 = Split("apm mat apm mat apm mat")
    P = Array(pln1, pln2)
    Application.ScreenUpdating = False
    With Worksheets("test")
        For i = 1 To 2
            For k = 3 To 10 Step 7
                .Cells(i * 2, k).Resize(, 6).Value = P((i + k) Mod 2)
            Next k
        Next i
    End With
End Sub

Cordialement.

39pilou21-vba.xlsm (22.11 Ko)

ben un grand merci j 'ai hâte d 'apprendre c'est vraiment excellent merci encore

Si tu as besoin d'explication, reviens !

(Car très lié à ta configuration, ce qui exigera un travail sur les nombres utilisés pour l'adapter à une autre...)

Cordialement.

oui merci j 'ai tatonner pour mettre a ma sauce en multipliant 1 par 1.66 j 'y suis arriver merci encore

Multipler par 1.66 !!! Là je vois pas... ! Les indices sont toujours des entiers !

La constitution d'un tableau par semaine différente, ne présente pas de difficulté, l'insertion de ces tableaux dans un tableau non plus. A partir de là, il fallait qu'en défilant les zones d'affectations, à chaque zone on affecte alternativement l'un des tableaux : P(0) ou P(1), ce qu'on obtient par critère Mod 2 qui vaudrait alternativement 0 et 1 lorsque critère alterne successivement des valeurs paires et impaires, les valeurs de critère étant nécessairement liées au positionnement des zones d'affectation, soit de la première cellule de chacune en ligne et colonne, soit à partir de la somme des deux compteurs de boucles, i+k devant être alternativement paire et impaire. Pour les colonnes 3 et 10, on a une alternance impair / pair, pour les lignes 2 et 4, on ne l'a pas, on prend donc 1 et 2, que l'on multipliera par 2 pour obtenir le numéro de ligne et qui offre une alternance impair / pair, la somme pouvant ainsi alors alterner pair / impair...

Mais un tel dispositif doit être revu si la configuration d'affectation est modifiée : petit casse-tête arithmétique pour retomber sur ses pieds.

Cordialement.

BONJOUR JE TE METS EN PJ LE FICHIER MODIFIER pour t'expliquer les 1.66 qui corresponde a la case de démarrage .ainsi que ta fonction modifier pour te montrer mon evolution.j 'ai ajoute une petite question si tu peux m'aider en bas concernant le début des jours merci encore et vraiment du très grand

19durdur-modif.xlsm (29.11 Ko)

Il fallait garder : i = 1 To 2 et définir la ligne par i * 2 + 3

Mais le pb change de nature s'il s'agit de servir en fonction d'un calendrier : il faudra prendre une date de référence pour le démarrage des cycles (une fois choisie, elle sera valide ad-eternam !)

Il faut également introduire les jours fériés, je suppose ? Ou sont-ils sans incidence ?

Un point me paraît curieux, c'est que tes agents 3 et 4 sont de repos en même temps ! Est-ce normal ?

ben bravo a te dire la vérité je me suis couche a 4h ce matin mais c en forgeant ......

je comprend même pas pourquoi je n 'ai pas pense a ta solution sa parait tellement évident .

oui les jours féries doivent être pris en compte

.aucune incidence sur le repos des agents en même temps

.la date de référence le 1er janvier 2017 me parait correcte mais la mes compétences déjà pas bien élevée en prennent un coup au moral

merci

Je vois ça dès que possible, mais ça va être l'heure des courses...

MERCI BEAUCOUP BON COURSES ALORS

Voilà une première moitié (sans les jours fériés).

Le déclenchement s'opère par une procédure Change, au changement de mois en B2 (lorsqu'on change l'année en B1, le mois en B2 est réinitialisé à 1).

Cette procédure efface le planning antérieur et lance la composition du nouveau planning...

Pour comprendre le mécanisme :

Il y a actuellement 4 agents dans le planning. Chacun a un cycle sur 2 semaines. Chacun a donc un planning pour chacune des semaines, identifiées comme semaine 0 et semaine 1.

Les agents sont identifiés en partant de 0.

L'agent 0 a son planning semaine 0 sous le numéro 0, et son planning semaine 1 sous le numéro 1.

L'agent 1 a son planning semaine 0 sous le numéro 2, et son planning semaine 1 sous le numéro 3.

L'agent 2 a son planning semaine 0 sous le numéro 4, et son planning semaine 1 sous le numéro 5.

L'agent 3 a son planning semaine 0 sous le numéro 6, et son planning semaine 1 sous le numéro 7.

Comme on voit, le numéro d'agent * 2 donne le numéro du planning semaine 0.

Et le numéro d'agent * 2 +1 donne le numéro du planning semaine 1.

C'est ce numéro de planning qu'on envoie comme argument à une fonction Cycle, laquelle renvoie le planning sous forme de tableau.

Pour les agents, un tableau Agt des lignes sur laquelle chacun figure. Agt = Array(5, 7, 9, 11)

On voit donc comment on pourra opérer des adaptations en changeant les lignes, augmentant les agents (il faudra dans ce cas ajouter les cycles renvoyés par la fonction Cycle)

On compose un tableau NP complet pour le mois, pour l'affecter globalement. Le dimensionnement de ce tableau est fait sur les lignes occupées (soit 5 à 11 pour la première dimension) et le nombre de jours du mois (1 à 31, 1 à 28, 1 à 30...) pour la 2e dimension.

Ce dimensionnement : ReDim NP(Agt(0) To Agt(UBound(Agt)), 1 to dj [dj étant le dernier jour du mois]

est automatiquement adapté aux variables agents et jours...

En faisant une boucle sur chaque agent, on constitue un tableau C des tableaux plannings semaine 0 et semaine 1 de l'agent.

On y fera référence pour chaque jour de la semaine par C(0)(0 à 6) ou C(1)(0 à 6)...

Pour traiter les jours, on a d'une part une constante qui définit la date origine des cycles, soit comme demandé le 2 janvier 2017.

Une date quelconque, si l'on y soustrait la date origine, on obtient un nombre de jours depuis cette date. Le quotient entier par 7 de ce nombre donne un rang de semaine, le modulo 2 de ce rang renverra 0 ou 1 en correspondance avec le cycle sur 2 semaines. Le modulo 7 du nombre de jours donnera un nombre de 0 à 6 correspondant au jour de la semaine (lundi à dimanche) correspondant aux indices de chaque tableau planning.

On traitera les jours du mois en 3 lots : les jours qui précèdent le premier lundi, les jours des semaines entières du mois (du lundi au dimanche), les jours qui suivent le dernier dimanche.

On a donc une fonction PLu sans argument qui renvoie le quantième du premier lundi du mois. Une fonction DDi (argument le quantième du dernier jour du mois) qui renvoie le quantième du dernier dimanche. Et une fonction Sem (argument un quantième de jour du mois) qui pour chaque semaine ou fraction de semaine traitée renvoie 0 ou 1 (correspondant au planning à appliquer).

Une petite difficulté, due au fait qu'on a retenue la date du 2 janvier 2017 comme origine. L'écart entre le premier janvier et cette date est donc -1. Or si la fonction de feuille de calcul MOD pour MOD (-1;7) renvoie 6, correspondant bien au fait que le 01/01/2017 est un dimanche, l'opérateur Mod de VBA ( -1 Mod 7) lui renvoie -1, inexploitable. Et la fonction MOD n'est pas utilisable avec la méthode WorksheetFunction !

C'est pourquoi on trouvera dans chacune des fonctions précitées, une ligne pour traiter une différence de date avec l'origine négative de façon à en faire un résultat exploitable pour renvoyer la valeur prévue.

En principe, elle n'a d'utilité que pour janvier 2017, mais présence permettrait de traiter les années antérieures en se référant au 2 janvier 2017 comme date origine des cycles.

Pour le traitement des 3 lots de jours :

  • on récupère dans une variable s l'indice du planning de la semaine (0 ou 1) pour le 1 du mois
  • on défile les jours du 1 au premier lundi -1 : pour chaque jour j, l'indice du planning correspondant est : 7 -jl [premier lundi] +j
  • on défile ensuite les semaines entières par bloc de 7 jours du premier lundi au dernier dimanche
  • pour chacune des semaine, on récupère l'indice planning de la semaine, et on affecte les 7 jours
  • on récupère enfin l'indice planning semaine pour le dernier jour du mois
  • on défile les jours du dernier dimanche +1 au dernier jour : pour chaque jour j, l'indice du planning correspondant est : j -jd [dernier dimanche] -1

A suivre pour les fériés : pas de modification de cette procédure, mais on reprendra le tableau composé pour éliminer les mentions portées sur des jours fériés de semaine...

Après ces calculs d'apothicaire, ça peut attendre un peu !

ben je c 'est même pas quoi dire le fichier parfait mais l 'explication encore mieux .

un gigantesque merci j' ai tout compris la je progresse merci ,merci , merci ,pour le temp passe a m'éduquer

jolie cadeau de fin d 'année

Bonjour,

Voilà la fin ! (Ça me fera au moins un fichier en cours bouclé avant l'année prochaine ! )

Rien de particulier pour le code : ajout d'une fonction pour renvoyer les jours fériés du mois (les quantièmes). Dans la procédure principale, on récupère un tableau de ces jours, s'il y en a on enlève les valeurs correspondantes du tableau d'affectation avant d'affecter...

Une fonction JPAQUES (pour fonctionner en feuille de calcul) : je préfère éviter les formules à validité limitée dans le temps quand on a un classeur avec VBA et qu'on peut mettre une fonction utilisable sans limitation de date... Celle-ci est bâtie sur l'algorithme de Gauss pour calculer la date de Pâques à partir de l'année.

3 noms dans le classeur : An, Mois, et Fériés (la plage Fériés est en colonne BA, masquée).

J'ai ajusté la plage d'application de la MFC dimanche, pour n'en avoir qu'une, et ajouté une MFC Fériés.

J'avais aussi fait un ajustement sur ta SelectionChange, pour qu'elle fonctionne sur toutes les lignes du tableau, et fonctionne en sléection de la colonne, exemple : tu sélectionnes I5:I11, en colonne A les 4 valeurs de cette colonne apparaissent...

Bonne fin d'année et meilleurs voeux.

ENORME ET TU DORTS QUAND,,,,

un gigantesque merci le temp que je apprenne a bien manipuler ce que tu m 'as enseigner on devrait etre en 2022

merci encore et bonne fin d 'annee 8) 8) 8) 8) 8)

Rechercher des sujets similaires à "vba qui rempli clic"