IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Fonction random pour planning


Sujet :

Macros et VBA Excel

  1. #21
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Ce que vous demandez nécessite d'aborder le sujet avec une autre analyse entraînant encore des modifications importantes voire de tout reprendre depuis le début.
    je regarderai, mais je ne garantis rien.

    Cdlt

  2. #22
    Futur Membre du Club
    Homme Profil pro
    Technicien de Laboratoire
    Inscrit en
    Mai 2019
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien de Laboratoire
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2019
    Messages : 63
    Points : 6
    Points
    6
    Par défaut
    Je comprends! Moi je pensais que les lignes de codes pouvaient être similaires à celles utilisées pour la non répétition de 2 fois une même tache par semaine. Sur le principe, je pensais avoir compris ! Mais c’est complexe

  3. #23
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Dois-je en conclure que dans le remplissage du tableau (colonne A à E) il ne peut y avoir qu'un seul A et qu'un seul E par jour affectés à un agent différent, et on procède à un décalage à chaque semaine?
    En fait, si l'on fixe les C (lorsque les heures=20), puis les A et les E, Seuls les C et D sont affectés aléatoirement. Est-ce bien cela?

    Le sujet devenant de plus en plus complexe, pourriez-vous fournir un tableau fait manuellement reprenant toutes ces questions afin que je puisse me faire une idée du résultat attendu?

    Cdlt

  4. #24
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par VincentCA Voir le message
    Pourriez vous me dire si le code pourrait fonctionner ?
    Tu es le mieux placé pour avoir la réponse à cette question : teste-le et tu sauras s'il fonctionne.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #25
    Futur Membre du Club
    Homme Profil pro
    Technicien de Laboratoire
    Inscrit en
    Mai 2019
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien de Laboratoire
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2019
    Messages : 63
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    J'ai fais un nouveau tableau avec les résultats simulés pour 8 semaines sur 11 employés.

    Dans le remplissage du tableau (colonne A à E) il ne peut y avoir qu'un seul A et qu'un seul D par jour affectés à un agent différent et on procède à un décalage à chaque semaine
    Les C sont fixés en priorité sur les 20 mais si le nombre de C affectés >20 positionnés, alors C affectés sur les autres employés
    Pour B, C, E maxi 2 fois par employés et par semaine comme la demande initiale où à partir du mercredi, cette donnée était vérifiée.
    Si valeur = 0 dans une colonne ABCDE, alors pas de tâche attribuée le jour en question. Ex si un lundi (ligne 2), tâche D et E=0, alors pas de D et E sur les x employés présents le lundi.

    Sur ma simulation, les colonnes ABCDE comptabilisent le total des tâches par jour mais en pratique, je remplirai le nombre de valeurs souhaitées par tache et le macro dispatchera automatiquement. Cela ne change pas par rapport au dernier macro que vous m'avez fourni.
    Fichiers attachés Fichiers attachés

  6. #26
    Futur Membre du Club
    Homme Profil pro
    Technicien de Laboratoire
    Inscrit en
    Mai 2019
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien de Laboratoire
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2019
    Messages : 63
    Points : 6
    Points
    6
    Par défaut
    Bonjour ARTURO83,

    J’espère juste que le tableau aura pu vous permettre de comprendre les besoins...

  7. #27
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Je ne vous ai pas oublié, seulement comme le problème est un peu casse-tête, je n'y travaille qu'au fur et à mesure que me vient les idées sur la façon de l'aborder. Soyez patient.

    Question: le dernier fichier que vous avez déposé est-il le bon? parce que vous avez encore changé les emplacements par rapport au précédent.

    Cdlt

  8. #28
    Futur Membre du Club
    Homme Profil pro
    Technicien de Laboratoire
    Inscrit en
    Mai 2019
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien de Laboratoire
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2019
    Messages : 63
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Effectivement, je viens de m’apercevoir que les emplacements ont été changés. Il s’agit du fait que je re modélise par la suite le tableau pour la mise en forme.
    En vous envoyant ce dernier planning, j’ai pris la trame finale.
    Toutefois, le fonctionnement reste similaire.
    Sur le planning 5, la premiere colonne de chaque employé était la tâche et la quatrième colonne l’horaire alors que dans le dernier planning envoyé, la premiere colonne est l’horaire et la deuxième colonne la tâche pour un même employé.
    Si vous le voulez bien, je propose que l’on reste sur le modèle du planning5 pour ne pas avoir à rechanger tout le code VBA. Je m’adapterai par la suite.
    Pour les taches, l’ordre est identique.

    Pour l’instant, je réalise tous mes planning en mode non automatique, c’est moi qui place et qui compte simplement sur un excel.

    Merci encore pour votre aide généreuse,

  9. #29
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Si vous le voulez bien, je propose que l’on reste sur le modèle du planning5 pour ne pas avoir à rechanger tout le code VBA. Je m’adapterai par la suite.
    TROP tard, j'ai déjà adapté les modifications par rapport au dernier planning, dois-je en rester là ou bien revenir à l'arrière?

    Cdlt

  10. #30
    Futur Membre du Club
    Homme Profil pro
    Technicien de Laboratoire
    Inscrit en
    Mai 2019
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien de Laboratoire
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2019
    Messages : 63
    Points : 6
    Points
    6
    Par défaut
    Houlà !!! Surtout pas.
    Si le travail est deja entamé, pas de retour en arrière.
    J’adapterai sans aucun problème.
    Vous en faites déjà énormément pour moi, ça suffit ainsi...
    Merci

  11. #31
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Voilà le fichier
    Pièce jointe 489296

    Et le code associé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    Option Compare Text
    Option Explicit
     
    Dim Valeur As String
    Dim Nb_Tirage As Integer, Nb_Alea As Integer
    Dim i As Long, j As Long, NbVal As Long
    Dim L As Byte, C As Byte, T As Byte, s As Byte, Empl As Byte
    Dim Liste As String, Lettre As String, x
    Dim Deb As Date
    Dim Nb_de_C_place As Long, Nb_de_21 As Long
    Dim PL_Sem As String, DebX As String
     
    Sub Tirage_aleatoire()
        Application.ScreenUpdating = False
        'on efface les précédents tirages
        Range("H2:H55,L2:L55,P2:P55,T2:T55,X2:X55,AB2:AB55,AF2:AF55,AJ2:AJ55,AN2:AN55,AR2:AR55,AV2:AV55").ClearContents
     
        'Forçage à C de tous les 20h
        With Range("G2:AX55")
            Set x = .Find(20, LookIn:=xlValues)
            If Not x Is Nothing Then
                    DebX = x.Address
                Do
                    Cells(x.Row, x.Column + 1) = "C"
                    Set x = .FindNext(x)
                Loop While Not x Is Nothing And x.Address <> DebX
            End If
        End With
     
        Randomize 'Initialise le générateur de nombres aléatoires
        For L = 2 To 55 'traitement de chaque jour sur les 8 semaines
            If Cells(L, "A").Interior.ColorIndex = xlNone Then ' si c'est un jour ouvré
                For C = 1 To 4 Step 3 'Traitement pour chaque lettre de A et D
                    Lettre = Cells(1, C)
                    Nb_Tirage = Cells(L, C)
                    If Nb_Tirage <> 0 Then Tirage
                Next C
                For C = 2 To 3 'Traitement pour chaque lettre de B et C
                    Lettre = Cells(1, C)
                    If C = 3 Then 'si c'est la lettre C à tester,
                        Nb_Tirage = Cells(L, C) - Application.WorksheetFunction.CountIf(Range(Cells(L, "G"), Cells(L, "AX")), 20)
                    Else
                        Nb_Tirage = Cells(L, C)
                    End If
                    If Nb_Tirage <> 0 Then Tirage
                Next C
                C = 5 'Traitement pour chaque lettre de B
                Lettre = Cells(1, C)
                Nb_Tirage = Cells(L, C)
                If Nb_Tirage <> 0 Then Tirage
            End If
        Next L
     
    Nouveau_Tirage:
    End Sub
     
    Sub Tirage()
        For T = 1 To Nb_Tirage
    Tirage_aleatoire:
            Deb = Time
            If Time > Deb + 1 / 86400 Then 'si le tirage est impossible au bout d'une seconde, on recommence tout
                Tirage_aleatoire 'on relance le programme principal
                Exit Sub
            End If
            'Contrôle par ligne, vérification de la présence des horaires
            Nb_Alea = (Int(11 * Rnd) + 1)  'Nombre aléatoire entier entre 1 et 11 (Nombre d'employés)
            Empl = (4 * (Nb_Alea - 1)) + 7
     
            'Déterminer la plage de la semaine traitée (PL_Sem= plage couverte du lundi au dimanche dans la colonne de l'employé sélectionné)
            Select Case L
                Case Is < 9 'Semaine 1
                    PL_Sem = Range(Cells(2, Empl + 1), Cells(8, Empl + 1)).Address
                Case Is < 16 'Semaine 2
                    PL_Sem = Range(Cells(9, Empl + 1), Cells(15, Empl + 1)).Address
                Case Is < 23 'Semaine 3
                    PL_Sem = Range(Cells(16, Empl + 1), Cells(22, Empl + 1)).Address
                Case Is < 30 'Semaine 4
                    PL_Sem = Range(Cells(23, Empl + 1), Cells(29, Empl + 1)).Address
                Case Is < 37 'Semaine 5
                    PL_Sem = Range(Cells(30, Empl + 1), Cells(36, Empl + 1)).Address
                Case Is < 44 'Semaine 6
                    PL_Sem = Range(Cells(37, Empl + 1), Cells(43, Empl + 1)).Address
                Case Is < 51 'Semaine 7
                    PL_Sem = Range(Cells(44, Empl + 1), Cells(50, Empl + 1)).Address
                Case Is < 56 'Semaine 8
                    PL_Sem = Range(Cells(51, Empl + 1), Cells(55, Empl + 1)).Address
            End Select
     
            Cells(L, Empl).Select
            If Cells(L, Empl) = 21 And Cells(L, Empl + 1) = "" Then
            '1er contrôle, on vérifie que l'on ne dépasse pas le nombre autorisé dans la même semaine pour le même employé
                If Lettre = "A" And Application.WorksheetFunction.CountIf(Range(PL_Sem), "A") = 0 Or _
                    Lettre = "D" And Application.WorksheetFunction.CountIf(Range(PL_Sem), "D") = 0 Or _
                    Lettre = "B" And Application.WorksheetFunction.CountIf(Range(PL_Sem), "B") < 2 Or _
                    Lettre = "C" And Application.WorksheetFunction.CountIf(Range(PL_Sem), "C") < 2 Or _
                    Lettre = "E" And Application.WorksheetFunction.CountIf(Range(PL_Sem), "E") < 2 Then
                    GoTo DeuxiemeControle
                Else
                    GoTo Tirage_aleatoire 'sinon on refait un tirage aléatoire
                End If
    DeuxiemeControle:
            '2ème contrôle, à partir de la 2ème semaine, on vérifie que la même lettre  A ou D ne se reproduise pas le même jour de la semaine précédente pour le même employé
                If L > 8 Then
                    If Lettre = "A" And Cells(L - 7, Empl) = "A" Or Lettre = "D" And Cells(L - 7, Empl) = "D" Then
                        GoTo Tirage_aleatoire
                    Else
                        Cells(L, Empl + 1) = Lettre
                    End If
                Else
                    Cells(L, Empl + 1) = Lettre
                End If
            Else
                GoTo Tirage_aleatoire 'sinon on refait un tirage aléatoire
            End If
        Next T
    End Sub
    Cdlt

  12. #32
    Futur Membre du Club
    Homme Profil pro
    Technicien de Laboratoire
    Inscrit en
    Mai 2019
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien de Laboratoire
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2019
    Messages : 63
    Points : 6
    Points
    6
    Par défaut
    Bonjour @Arturo83, mes fonctions ayant évolué, j'aurai besoin d'un nouveau coup de pouce. Accepteriez vous de m'aider s'il vous plaît ? Merci d'avance

  13. #33
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    mes fonctions ayant évolué, j'aurai besoin d'un nouveau coup de pouce. Accepteriez vous de m'aider s'il vous plaît ? Merci d'avance
    Bien sûr, mais je ne suis pas tout seul à intervenir sur le forum et il serait souhaitable et préférable que vous fassiez votre demande dans un nouveau post, vous obtiendrez ainsi le plus de réponses possibles avec des solutions aussi diverses que variées pour arriver au résultat souhaité.

    Cdlt

  14. #34
    Futur Membre du Club
    Homme Profil pro
    Technicien de Laboratoire
    Inscrit en
    Mai 2019
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien de Laboratoire
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2019
    Messages : 63
    Points : 6
    Points
    6
    Par défaut
    Merci pour votre réponse !
    J'ai rédigé un nouveau post afin de pouvoir être aidé.

Discussions similaires

  1. Fonction random pour mélanger des definitions
    Par demandeuse59200 dans le forum C#
    Réponses: 1
    Dernier message: 09/01/2019, 16h32
  2. La fonction Random pour changer le motif d'une fiche
    Par FOCUS77 dans le forum Contribuez
    Réponses: 0
    Dernier message: 17/06/2015, 20h36
  3. fonction random pour une roulette
    Par davidka dans le forum GUI
    Réponses: 3
    Dernier message: 04/01/2014, 19h54
  4. Fonction/méthode pour obtenir l'IP de la machine
    Par sirex007 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 10/04/2003, 14h36
  5. Réponses: 3
    Dernier message: 02/09/2002, 18h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo