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 :

Problème contrôle de saisie avec Find/If/Max


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 12
    Par défaut Problème contrôle de saisie avec Find/If/Max
    Bonjour à tous,

    Je m'en remets à vous face à mon problème que je n'arrive pas à solutionner depuis deux jours.

    Je refais une tentative en maitrisant un peu mieux les règles du forum.

    Je souhaite dans un formulaire bloquer la saisie si l'heure d'arrivée d'un jour N pour un personne donnée est inférieur à l'heure de départ maximale + 11h d'un jour N-1 pour cette même personne. (Représentant un temps de repos minimal de 11h entre deux jour de travail consécutif)

    Heure d'arrivée étant saisie dans le formulaire
    heure de départ étant enregistrée dans l'onglet saisie

    Pour cela je dispose d'un formulaire qui me sert à renseigner les heures de départ et d'arrivée ainsi que la date. Ce formulaire se déverse dans l'onglet linkcell qui sert d’intermédiaire car des formules sont ajoutées à ce moment la. Enfin La ligne crée dans cet onglet grâce au formulaire vient se coller dans l'onglet saisie à la dernière ligne vide.

    La partie du code jusqu'au Else me pose problème. C'est surtout pour la logique que je pensais mettre en place, que je le laisse là (sinon je sais que c'est bien faux)

    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
    Private Sub Ajouter_Button_Click()
     
        Dim L As Integer
        Dim Maximum As Long
        Dim Ca As Range
        Dim Da As Range
        Dim Ea As Range
     
     
        With Worksheets("Saisie")
        Set Ca = .Find("NomTextBox.Value", LookIn:=xlValues)
        Set Da = .Find("PrenomTextBox.Value", LookIn:=xlValues)
        Set Ea = .Find("DateTextBox.Value" - 1, LookIn:=xlValues)
     
     
        Maximum = Evaluate("=MAX(IF(B:B=Ca,IF(C:C=Da,IF(G:G=Ea,J:J))))")
     
        End With
     
     
      If MsgBox(" Confirmez-vous l’insertion de ce nouveau contact ? ", vbYesNo, " Demande de confirmation d’ajout ") = vbYes Then
     
        If HeureDebutTextbox < Maximum + 11 Then
     
        MsgBox "Il n'y a pas eu 11h de repos entre deux jours consécutifs"
     
        Exit Sub
     
       Else
     
            Sheets("Linkcell").Range("B2").Value = NomTextBox
            Sheets("Linkcell").Range("C2").Value = PrenomTextBox
            Sheets("Linkcell").Range("D2").Value = PosteTextBox
            Sheets("Linkcell").Range("E2").Value = UnitedestructComboBox
            Sheets("Linkcell").Range("G2").Value = DateTextBox
            Sheets("Linkcell").Range("I2").Value = HeureDebutTextbox
            Sheets("Linkcell").Range("J2").Value = HeureFinTextBox
            Sheets("Linkcell").Range("N2").Value = PresentOptionButton
            Sheets("Linkcell").Range("O2").Value = MotifAbsenceTextBox
            L = Sheets("Saisie").Range(" a65536 ").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
     
        Sheets("LinkCell").Rows(2).Copy
        Sheets("Saisie").Rows(L).PasteSpecial Paste:=xlPasteValues
     
            Unload Me
     
            End If
        End If
     
    End Sub
    en espérant que vous pourrez m'aider.

  2. #2
    Expert éminent 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
    Par défaut
    Citation Envoyé par velvetbert Voir le message
    Heure d'arrivée étant saisie dans le formulaire
    Dans quel champs ?

    heure de départ étant enregistrée dans l'onglet saisie
    Dans quelle cellule ?

    N'ayant pas ces deux info, on va supposé que la condition dans le If de ton code est juste.

    A mon avis, pour l'ordre de tes If, tu résonnes à l'envers.
    Il vaudrait mieux vérifier si l'insertion est possible avant de demander à l'opérateur de la confirmer.

    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
    Private Sub Ajouter_Button_Click()
        Dim Ca As Range
        Dim Da As Range
        Dim Ea As Range
     
        With Worksheets("Saisie")
            Set Ca = .Find("NomTextBox.Value", LookIn:=xlValues)
            Set Da = .Find("PrenomTextBox.Value", LookIn:=xlValues)
            Set Ea = .Find("DateTextBox.Value" - 1, LookIn:=xlValues)
        End With
     
        If HeureDebutTextbox < 11 + Evaluate("=MAX(IF(B:B=" & Ca & ",IF(C:C=" & Da & ",IF(G:G=" & "Ea,J:J))))") Then
            MsgBox "Il n'y a pas eu 11h de repos entre deux jours consécutifs"
            Exit Sub
        End If
     
        If MsgBox(" Confirmez-vous l’insertion de ce nouveau contact ? ", vbYesNo, " Demande de confirmation d’ajout ") = vbNo Then Exit Sub
     
        Sheets("Linkcell").Range("B2").Value = NomTextBox
        Sheets("Linkcell").Range("C2").Value = PrenomTextBox
        Sheets("Linkcell").Range("D2").Value = PosteTextBox
        Sheets("Linkcell").Range("E2").Value = UnitedestructComboBox
        Sheets("Linkcell").Range("G2").Value = DateTextBox
        Sheets("Linkcell").Range("I2").Value = HeureDebutTextbox
        Sheets("Linkcell").Range("J2").Value = HeureFinTextBox
        Sheets("Linkcell").Range("N2").Value = PresentOptionButton
        Sheets("Linkcell").Range("O2").Value = MotifAbsenceTextBox
     
        Sheets("LinkCell").Rows(2).Copy
        L = Sheets("Saisie").Range("A" & Rows.Count).End(xlUp).Offset(1,0).PasteSpecial Paste:=xlPasteValues
     
        Unload Me
     
    End Sub
    A mon avis, ta fonction dans l'Evaluate n'est vraiment pas optimisée et il y a certainement mieux à faire qu'un Evaluate, mais je l'ai laissé comme ça.

    Et essaye de faire des itérations propres dans les structures de tes codes, ça t'évitera de te perdre.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 12
    Par défaut
    Merci pour ta réponse.

    Pour répondre à tes questions si j'ai bien compris ,
    Le champs heure d'arrivée est saisi dans le formulaire dans la textbox HeureDebutTextbox
    La cellule qui enregistre l'heure de départ est la cellule J de la dernière ligne vide de l'onglet saisie.

    Concernant le code je suis d'accord avec toi. c'est mieux avec la confirmation après.
    En remplaçant le code, il restait des erreurs dedans. le "L=" que j'ai supprimé
    et des erreurs de propriété ou méthodes non géré par l'objet sur les "set Ca" etc que je crois avoir réussi à régler.
    Il reste une incompatibilité de type sur le set Ea ( je ne sais pas si ca vient du -1 ou du fait que ca soit une date et non du texte. du coup je ne sais pas comment la gérer).

    Pour le évaluate, c'est la première solution que j'avais trouvé. mais je suis pas contre en mettre une autre s'il en existe des mieux.

    Je remets le code mis à jour (et merci pour le conseil d'itération).

    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
    Private Sub Ajouter_Button_Click()
     
        Dim Ca As Range
        Dim Da As Range
        Dim Ea As Range
     
        With Worksheets("Saisie")
            Set Ca = Range("B:B").Find("NomTextBox.Value", LookIn:=xlValues)
            Set Da = Range("C:C").Find("PrenomTextBox.Value", LookIn:=xlValues)
            Set Ea = Range("G:G").Find("DateTextBox.Value" - 1, LookIn:=xlValues)
        End With
     
        If HeureDebutTextbox < 11 + Evaluate("=MAX(IF(B:B=" & Ca & ",IF(C:C=" & Da & ",IF(G:G=" & "Ea,J:J))))") Then
            MsgBox "Il n'y a pas eu 11h de repos entre deux jours consécutifs"
            Exit Sub
        End If
     
        If MsgBox(" Confirmez-vous l’insertion de ce nouveau contact ? ", vbYesNo, " Demande de confirmation d’ajout ") = vbNo Then Exit Sub
     
        Sheets("Linkcell").Range("B2").Value = NomTextBox
        Sheets("Linkcell").Range("C2").Value = PrenomTextBox
        Sheets("Linkcell").Range("D2").Value = PosteTextBox
        Sheets("Linkcell").Range("E2").Value = UnitedestructComboBox
        Sheets("Linkcell").Range("G2").Value = DateTextBox
        Sheets("Linkcell").Range("I2").Value = HeureDebutTextbox
        Sheets("Linkcell").Range("J2").Value = HeureFinTextBox
        Sheets("Linkcell").Range("N2").Value = PresentOptionButton
        Sheets("Linkcell").Range("O2").Value = MotifAbsenceTextBox
     
        Sheets("LinkCell").Rows(2).Copy
        Sheets("Saisie").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
     
        Unload Me
     
    End Sub

  4. #4
    Expert éminent 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
    Par défaut
    Citation Envoyé par velvetbert Voir le message
    Il reste une incompatibilité de type sur le set Ea ( je ne sais pas si ca vient du -1 ou du fait que ca soit une date et non du texte. du coup je ne sais pas comment la gérer).
    Il me semble très étrange que tu ais mis les Value entre guillemets dans tes Find.
    Mais, ne sachant pas exactement ce que tu cherches, difficile de savoir si c'est une erreur.

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 12
    Par défaut
    Alors même en enlevant les guillemets je garde l'incompatibilité de type.

    Avec cette approche la, je cherche à déterminer une valeur max précise dans la colonne des heures de fin. Et donc, sans pouvoir la citer directement dans un .find puisque sa position évolue en fonction des entrées. Je me suis dit qu'en trouvant des valeurs connues comme le nom, le prénom, la date (ici N-1 par rapport a celle saisie dans le formulaire) je pourrai retrouver cette valeur et la comparer pour activer le contrôle.

  6. #6
    Expert éminent 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
    Par défaut
    Citation Envoyé par velvetbert Voir le message
    Je me suis dit qu'en trouvant des valeurs connues comme le nom, le prénom, la date (ici N-1 par rapport a celle saisie dans le formulaire) je pourrai retrouver cette valeur et la comparer pour activer le contrôle.
    Sauf que tes trois Find sont des recherches indépendantes.
    Donc, le premier cherche le nom sans se préoccuper ni du prénom, ni de la date. Et réciproquement pour les deux autres.

    Autrement dit, tu recherches une cellule portant une valeur précise et ensuite tu utilises la valeur de cette cellule, qui est la valeur que tu as recherché.
    Bref, à mon sens et tels qu'ils sont écrits dans ton code, il me semble que ces Find ne servent à rien.

    Il faut que tu revoies complètement la logique de ton code.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. débutant ruby : problème de saisie avec aptana
    Par zvarog dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 02/07/2007, 15h28
  2. problème de recuperation de fichier avec find
    Par david_12 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 28/03/2007, 14h37
  3. [VBA Excel] problème de range avec find
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/11/2005, 13h56
  4. problème avec un select max
    Par bobic dans le forum Oracle
    Réponses: 7
    Dernier message: 14/11/2005, 11h22
  5. Problème de saisie avec le "."
    Par Pouf dans le forum ASP
    Réponses: 10
    Dernier message: 18/03/2005, 15h27

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