OVH Cloud OVH Cloud

WorksheetFunction.Weekday

12 réponses
Avatar
Arnaud LECLEMENT
Bonjour,
j'essaie de mettre en ouvre cela afin d'empêcher la saisie de date le samedi
et le dimanche dans un textbox,
cela ne fonctionne pas
Une aide s'il vous plait ?
Merci et bonne journée
Arnaud


Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If TextBox1.Value <> "" Then
Mavar = CDate(TextBox1.Value)

If Application.WorksheetFunction.Weekday(Mavar) = 6 Or _
Application.WorksheetFunction.Weekday(Mavar) = 7 Then

If Application.WorksheetFunction.Weekday(Mavar) = 6 Then
MsgBox "Vous avez saisi une date tombant le samedi", _
vbExclamation, " Erreur date !"
TextBox1 = ""
TextBox1.SetFocus
Exit Sub
End If

If Application.WorksheetFunction.Weekday(Mavar) = 7 Then
MsgBox "Vous avez saisi une date tombant le dimanche", _
vbExclamation, " Erreur date !"
TextBox1 = ""
TextBox1.SetFocus
Exit Sub
End If
End If
End If
End Sub

10 réponses

1 2
Avatar
abcd
Pour mettre une limitation il est possible d'utiliser la fonction de
validation de données (menu Données> Validation) mais d'introduire un e
formule à la place des valeurs. Cela évite de passer par du VBA.
Avatar
Arnaud LECLEMENT
Salut abcd
Justement, j'ai besoin de passer par VBA et un textbox
Merci

"abcd" a écrit dans le message de news:

Pour mettre une limitation il est possible d'utiliser la fonction de
validation de données (menu Données> Validation) mais d'introduire une
formule à la place des valeurs. Cela évite de passer par du VBA.
Avatar
abcd
excuse, j'ai cru que tu mettais un textbox juste pour ça et pas que
c'était ta source normale de données au milieu d'autre chose.

peux-tu expliquer ce qui ne fonctionne pas exactement ?
(qu'est-ce qui se passe que tu ne désirais pas ? ou qui ne se passe
pas que tu désirais ?)
Avatar
abcd
je pense deviner:

tu quittes la macro Sub alors que ce n'est pas forcément une bonne
idée... Utilise plutôt Cancel = true (qui annule l'opération de s ortie)

et aussi utilise mieux le code, car là c'est assez illisible, exemple d e
ré-écriture:

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

If TextBox1.Value <> "" Then
Mavar = CDate(TextBox1.Value)

Select Case Application.WorksheetFunction.Weekday(Mavar)
Case 6
t$ = "samedi"
Case 7
t$ = "dimanche"
Case Else
t$ = ""
End Select

If t$ <> "" Then
MsgBox "La date saisie tombe un week-end (" & t$ &")", _
vbExclamation, " Mauvaise date !"

'TextBox1 = ""
'pourquoi effacer ? Peut-être une faute de frappe,
'plus pratique de laisser pour modifier
Cancel = True
End If
End If

End Sub
Avatar
abcd
petit cours:

le Cancel est transmis ByVal dans la déclaration de la procédure
cela signifie que tu peux le changer et que la valeur sera transmise
au code appelant: ce Cancel est fait pour te donner la possibilité
d'annuler l'action en cours, on le retrouve sur quelques autres
événements en VBA
Avatar
Arnaud LECLEMENT
Je te remercie abcd
le pb est que les dates sont bizarrement décalées d'un jour
si je saisi 16/07/05, cela me donne le dimanche ?
Arnaud


"abcd" a écrit dans le message de news:

petit cours:

le Cancel est transmis ByVal dans la déclaration de la procédure
cela signifie que tu peux le changer et que la valeur sera transmise
au code appelant: ce Cancel est fait pour te donner la possibilité
d'annuler l'action en cours, on le retrouve sur quelques autres
événements en VBA
Avatar
anonymousA
bonjour,

je n'ai peut-être pas saisi exactement le sens de ta démonstration mais
il me semble que c'est exactement le contraire de ce que tu affirmes qui
se produit.

En effet, dans l'exemple suivant

Sub gg()
Dim tata As Integer

tata = 1
MsgBox tata

hhh tata
MsgBox tata

End Sub
Sub hhh(ByRef toto As Integer)
toto = toto + 2

End Sub

dans le cas ou l'appel à la proc hhh a lieu avec le paramètre ByRef,
alors la variable tata vaudra 3 à la fin de la proc gg . Dans le cas ou
l'appel à la proc hhh a lieu avec le parmaètre ByVal , alors tata vaudra
toujours 1 à la fin de la proc gg ce qui me parait donc invalider ton
raisonnement puisque la valeur en question ne sera pas transmise à la
procédure appelante.
Ceci est normal puisque dans le cas de ByRef, c'est le pointeur à
l'adresse de la variable qui est passé à la procédure alors que dans le
cas de ByVal, c'est seulement la valeur de la variable qui est passée.Le
cas de la non déclaration fait que VBA par défaut décrète qu'il s'agit
d'un passage ByRef.

Mais je n'ai peut-être pas compris ce que tu voulais dire .


Cordialement,

A+


petit cours:

le Cancel est transmis ByVal dans la déclaration de la procédure
cela signifie que tu peux le changer et que la valeur sera transmise au
code appelant: ce Cancel est fait pour te donner la possibilité
d'annuler l'action en cours, on le retrouve sur quelques autres
événements en VBA


Avatar
anonymousA
bonjour,

c'est parce que Wekkday accepte 2 paramètres dont le 2eme donne la
possibilité de choisir si le 1er jour de la semaine est un Dimanche ou
un Lundi

ici Now() renvoie le jour d'aujourd'hui à savoir 16/07/05

Application.WorksheetFunction.Weekday(Now(),1) renverra la valeur 7
Application.WorksheetFunction.Weekday(Now(),2) renverra la valeur 6

C'est à toi de choisir si tu veux obtenir 7 pour un Samedi ou 6 pour un
Samedi.
Par défaut, il s'agit de la notation Américaine et en conséquence VBA
interprète que le paramètre est 1.


A+

Je te remercie abcd
le pb est que les dates sont bizarrement décalées d'un jour
si je saisi 16/07/05, cela me donne le dimanche ?
Arnaud


"abcd" a écrit dans le message de news:

petit cours:

le Cancel est transmis ByVal dans la déclaration de la procédure
cela signifie que tu peux le changer et que la valeur sera transmise
au code appelant: ce Cancel est fait pour te donner la possibilité
d'annuler l'action en cours, on le retrouve sur quelques autres
événements en VBA




Avatar
abcd
on n'est pas dans un module, l'appel se fait dans l'autre sens, mais tu
as raison, habituellement, ByVal signifie qu'on ne transmet vers la
procédure que la valeur, pas la référence.

ici il y a aussi un MSForms.ReturnBoolean et ce paramètre n'est pas
envoyé vers notre procédure mais (je crois, et là c'est peut-être moi
qui modélise mal) est envoyé vers le UserForm...
Avatar
abcd
es-tu certain que ton système sois configuré sur les dates français es ?
chez moi il n'y avait aucun problème en tout cas.

Pour déterminer la faute, essaye d'afficher
msgbox Format( MaVar , "DD-MM-YYYY") pour vérifier que la date a bien
été lue dans le bon format (le résultat affiché doit correspondre à ce
qui est entré)
1 2