J'essaie d'écrire une fonction qui remplit le jour ouvrable suivant (à l'exclusion des week-ends) dans un champ [DateCreated] d'un enregistrement. J'essayais de configurer quelque chose comme ceci:
Public Sub EndofDay_Click() Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim nConfirmation As Integer nConfirmation = MsgBox("Are you sure you want to complete this Task?", vbInformation + vbYesNo, "Complete Task?") If nConfirmation = vbYes Then 'Copy Records with Status of 10 In Progress Set rs1 = CurrentDb.OpenRecordset("tblTasks") Set rs2 = CurrentDb.OpenRecordset("tblTasks") rs1.MoveFirst If Not (rs1.EOF And rs1.BOF) Or Status = 10 Then Do Until rs1.EOF = True If (rs1![Status] = 10) Then With rs2 .AddNew ![DateCreated] = WD '<---- Here .Update End With End If rs1.MoveNext Loop Else 'do nothing End If rs1.Close 'Close the recordset Set rs1 = Nothing 'Clean up rs2.Close 'Close the recordset Set rs2 = Nothing 'Clean up Forms![frmTasks].Form.Requery Forms![frmTasks].Form.Refresh End sub
Mais j'obtiens un argument non une erreur facultative en essayant de l'appeler.
J'utilise ce qui suit pour coder pour le récupérer:
Function WD() 'Monday If [DateCreated] = DateAdd("d", (8 - Weekday(Date, 2))) Then '<---Debug hates this line [DateCreated] = [DateCreated] = DateAdd("d", (8 - Weekday(Date, 3)) Mod 7, Date) 'Tuesday ElseIf [DateCreated] = DateAdd("d", (8 - Weekday(Date, 3))) Then [DateCreated] = [DateCreated] = DateAdd("d", (8 - Weekday(Date, 4)) Mod 7, Date) 'Wednesday ElseIf [DateCreated] = DateAdd("d", (8 - Weekday(Date, 4))) Then [DateCreated] = [DateCreated] = DateAdd("d", (8 - Weekday(Date, 5)) Mod 7, Date) 'Thursday ElseIf [DateCreated] = DateAdd("d", (8 - Weekday(Date, 5))) Then [DateCreated] = [DateCreated] = DateAdd("d", (8 - Weekday(Date, 6)) Mod 7, Date) 'Friday ElseIf [DateCreated] = DateAdd("d", (8 - Weekday(Date, 6))) Then [DateCreated] = [DateCreated] = DateAdd("d", (8 - Weekday(Date, 2)) Mod 7, Date) End If End Function
Je ne suis même pas sûr que ce soit la meilleure façon d'essayer ce. Toute aide serait grandement appréciée!
3 Réponses :
DateAdd
prend trois arguments et vous n'en passez que deux. Le troisième argument est la date avec laquelle vous commencez.
Une fonction est conçue pour renvoyer une valeur. Généralement, vous passez un ou plusieurs arguments, puis vous attribuez le nom de la fonction au résultat et c'est ce que la fonction renvoie. Comme l'a dit @Josh Eller, Weekday
est déjà un nom de fonction. Vous pouvez toujours l'utiliser, mais c'est probablement mieux si vous ne le faites pas.
Voici une façon d'écrire une fonction qui retournera le jour ouvrable suivant. Il prend une date comme argument, puis ajoute le nombre approprié de jours en fonction du jour de la semaine où la date passée est.
![DateCreated] = NextBusDay(![DateCreated])
Vous pouvez l'appeler comme p>
![DateCreated] = NextBusDay(Date)
si vous souhaitez obtenir le prochain rendez-vous professionnel après aujourd'hui. ou
Function NextBusDay(ByVal dtStart As Date) Dim lAdder As Long lAdder = 1 If Weekday(dtStart) = 6 Then lAdder = lAdder + 2 If Weekday(dtStart) = 7 Then lAdder = lAdder + 1 NextBusDay = dtStart + lAdder End Function
si vous souhaitez remplacer le champ DateCréée par la prochaine date commerciale après la date qui s'y trouve déjà.
Merci pour cela fonctionne parfaitement! Je pensais qu'il devrait y avoir un moyen plus simple de le faire.
Vous étiez proche de votre logique, mais vous avez omis l'argument de date pour la fonction DateAdd
, et vous avez également tenté de redéfinir la fonction Weekday
intégrée existante.
Au lieu de cela, vous pouvez condenser la logique comme suit:
Function NextWorkingDay(datDate As Date) As Date Dim i As Integer: i = Weekday(datDate) If i < 6 Then i = 8 NextWorkingDay = datDate + 9 - i End Function
Ici, si le jour de la semaine de la date fournie (à partir du dimanche) est supérieur à 5 (c'est-à-dire si le jour est vendredi ou samedi) la fonction ajoutera 3 jours pour vendredi et 2 jours pour samedi, sinon 1 jour sera ajouté à la date.
Cela pourrait aussi s'écrire:
Function NextWorkingDay(datDate As Date) As Date If Weekday(datDate) > 5 Then NextWorkingDay = datDate + 9 - Weekday(datDate) Else NextWorkingDay = datDate + 1 End If End Function
Merci! Je vais essayer ça. Je sais qu'il existe de meilleures façons de faire ce que j'essayais de faire, mais comme je suis autodidacte, j'apprends toujours toutes les façons de faire ces fonctions.
Envisagez une solution SQL pure qui peut être appelée avec DoCmd.OpenQuery . Ce faisant, vous pouvez éviter les appels de jeux d'enregistrements multiples imbriqués. Ci-dessous met à jour le champ d'origine DateCreated en ajoutant les jours nécessaires si la date arrive le vendredi-dimanche (tous en supposant que lundi début de jour de la semaine ), sinon ajoute un seul jour.
SQL
Public Sub EndofDay_Click() Dim nConfirmation As Integer nConfirmation = MsgBox("Are you sure you want to complete this Task?", _ vbInformation + vbYesNo, "Complete Task?") If nConfirmation = vbYes Then DoCmd.SetWarnings False DoCmd.OpenQuery "myUpdateQuery" DoCmd.SetWarnings True End If End Sub
UPDATE tblTasks SET DateCreated = IIF(WeekDay(DateCreated, 1) = 5, DateAdd('d', 3, DateCreated), IIF(WeekDay(DateCreated, 1) = 6, DateAdd('d', 2, DateCreated), IIF(WeekDay(DateCreated, 1) = 7, DateAdd('d', 1, DateCreated), DateAdd('d', 1, DateCreated) ) ) )
Merci! J'apprends toujours à utiliser SQL et à l'intégrer dans VBA.
Vous ne savez pas ce que vous voulez dire car vous n'avez pas besoin d'utiliser SQL dans le code de tentative. Remarque: les requêtes stockées s'exécutent souvent plus efficacement que la chaîne VBA SQL car le moteur d'accès enregistre le meilleur plan d'exécution et aucun jeu d'enregistrements n'est ouvert ici.
Weekday
est déjà une fonction intégrée. Essayez de changer le nom de votre fonction.Merci! essayé mais obtenir la même erreur.
Pourriez-vous mettre à jour votre code pour montrer ce que vous avez essayé? Vous rencontrez peut-être plus d'un problème, mais le nom de la fonction est définitivement un problème en soi.