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.
Weekdayest 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.