Enregistrer Données Formulaire Suivant Plusieurs Critières
- Messages
- 129
- Excel
- Mac 2023 Fr
- Inscrit
- 15/08/2013
- Emploi
- Assistant de direction Logistique
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
- Messages
- 129
- Excel
- Mac 2023 Fr
- Inscrit
- 15/08/2013
- Emploi
- Assistant de direction Logistique
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 SubIl 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 SubLes 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).
Cordialement.
- Messages
- 129
- Excel
- Mac 2023 Fr
- Inscrit
- 15/08/2013
- Emploi
- Assistant de direction Logistique
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.