Enregistrer Données Formulaire Suivant Plusieurs Critières

Bonjour,

Comme je suis novice sous VBA j'aimerais trouver de l'aide pour créer ce code:

J'ai un formulaire avec 3 critères

La famille

Le jour de la semaine

La période

Suivant les informations renseignées la donnée "Plat" doit s'enregistrer dans l'onglet "report" suivant le jour situé dans la colonne A.

J'ai mis un fichier test pour mieux comprendre.

Merci pour vos retour et surtout pour m'aider a comprendre et a créer le code !

RQ

18testv1.xlsm (57.55 Ko)

Alors j'ai déjà réussi a commencer mon code:

le voici:

Private Sub CommandButton1_Click()
With Sheets("report")
'    famille = ComboBox1
'    jour = CheckBox1 And CheckBox2 And CheckBox3 And CheckBox4 And CheckBox5 And CheckBox6 And CheckBox7
    Date_debut = TextBox1
    Date_fin = TextBox2

    For Date_traitee = Date_debut To Date_fin
    On Error Resume Next
    j = Application.WorksheetFunction.Match(CSng(Date_traitee), .Range("A:A"), 0)
        If j = 0 Then
            MsgBox ("Impossible d'enregistrer votre requête !")
        Else
               .Range("C" & j) = ComboBox2
        End If

    j = 0
    Next Date_traitee
End With
MsgBox "Programmation réalisée avec succès !"
End Sub

Il faut que je puisse intégrer maintenent la critère famille.

A+

Bonjour,

J'ai cru comprendre que tu voulais :

  • définir un plat,
  • lui affecter une famille,
  • indiquer les dates de début et fin de la période où tu allais le fournir,
  • définir les jours de semaine (compris dans la période) concerné par ce plat.

Je ne sais si c'est la meilleure organisation, mais si c'est bien la façon dont tu entends procéder, voici une proposition pour affecter le plat choisi, aux jours de semaine sélectionnés compris dans la période définie.

Private Sub CommandButton1_Click()
    Dim dd, df, js(6) As Boolean, fam%, i%, dj%, plat$
    fam = ComboBox1.ListIndex + 1
    If fam < 1 Then
        MsgBox "Sélectionner une famille !", vbInformation, "Saisie incomplète"
        Exit Sub
    End If
    plat = ComboBox2.Value
    If plat = "" Then
        MsgBox "Sélectionner un plat !", vbInformation, "Saisie incomplète"
        Exit Sub
    End If
    On Error Resume Next
    dd = CDate(TextBox1.Value)
    If Err.Number <> 0 Then
        MsgBox "Date de début invalide !", vbInformation, "Date invalide"
        Err.Clear: Exit Sub
    End If
    df = CDate(TextBox2.Value)
    If Err.Number <> 0 Then
        MsgBox "Date de fin invalide !", vbInformation, "Date invalide"
        Err.Clear: Exit Sub
    End If
    On Error GoTo 0
    If df < dd Then
        MsgBox "Date de fin antérieure à date de début !", vbInformation, "Date erronée"
        Exit Sub
    End If
    For i = 0 To 6
        js(i) = Controls("chb" & i).Value
    Next i
    For i = 0 To 6
        If js(i) Then Exit For
    Next i
    If i > 6 Then
        MsgBox "Cocher les jours de semaine concernés.", vbInformation, "Saisie incomplète"
        Exit Sub
    End If
    dd = dd - [jReport]: df = df - [jReport]
    dj = (Weekday([jReport]) + 5) Mod 7
    With [jReport]
        For i = dd To df
            If js((Weekday(i) + dj) Mod 7) Then .Offset(i, fam) = plat
        Next i
    End With
    For i = 0 To 6
        Controls("chb" & i).Value = False
    Next i
    For i = 1 To 2
        Controls("ComboBox" & i).ListIndex = -1
        'Controls("TextBox" & i).Value = ""
    Next i
End Sub

Les lignes surlignées constituent la procédure de traitement proprement dite. Le reste sont des vérifications, et à la fin la réinitialisation pour poursuivre avec un autre plat... La ligne de réinitialisation des dates est invalidée (j'ai pensé que sur la même période tu pouvais souhaiter opérer pour plusieurs plats et des jours différents... sinon il suffit de réactiver cette ligne en enlevant l'apostrophe).

Quelques aménagements opérés (j'ai limité au minimum indispensable) :

  • Les CheckBox renommés chb0 à chb6, de façon à les traiter en boucle, avec un numéro d'ordre correspondant à une série jours de la semaine ramenée de 0 à 6 (pour lundi à dimanche).
  • Une plage nommée : jReport, correspondant à la cellule A2, soit la date de démarrage de la liste. Une seule cellule suffit amplement pour l'adressage ! En outre cela permet de transformer les dates de période en décalages de lignes par rapport à cette cellule, tout en pouvant calculer le jour de semaine par rapport à ce décalage en lui appliquant en correctif le jour de semaine de ce jour).
Si tu as besoin de plus d'explications sur les calculs, je suis à ta disposition...

Cordialement.


28rquantintestv1.xlsm (59.05 Ko)

Bonjour,

J'ai essayé et tout fonctionne très bien.

J'ai juste une question concernant l'enregistrement des "Familles", comment je peux faire pour les enregistrer ailleurs ?

Dans le fichier exemple que j'ai transmis, je les ai mis en B et C mais ce ne pas le cas de mon fichier réel !

Merci pour ton retour !

Cdt

RQ

Bonsoir,

La position est un problème d'adressage.

L'adressage est fait relativement à la plage nommée jReport (constituée par une seule cellule).

Il s'agit donc pour toi de définir la position en adressage relatif par rapport à cette cellule.

Relis ce que j'ai dit à ce sujet.

Cordialement.

Rechercher des sujets similaires à "enregistrer donnees formulaire suivant critieres"