OVH Cloud OVH Cloud

Comment cocher une plage de date contenu dans une autre plage de date svp ?

10 réponses
Avatar
News Free
Bonjour,
J'aimerai faire un calendrier de congés dans lequel je metterai une date de
départ et une date de fin (par exemple en A1 le 02/01 et en B1 le 05/01)
ainsi qu'une plage de date allant du 01/01 au 31/01 (par exemple B3=01/01,
C3=02/01, D3=03/01, etc...jusque AF3=31/01) puis en A4=Nom 1 et A5=Nom 2.

| A | B | C | D | E | F |
G | F | G | etc...
1 | 02/01 05/01
2 |
3 | | 01/01 02/01 03/01 04/01 05/01 06/01 07/01
08/01 etc...
4 | nom 1 | OK OK OK OK
5 | nom 2 |

J'aimerai savoir comment faire pour ecrire OK en dessous de chaque date du
calendrier comprise entre A1 (le 02/01) et B1 ( le 05/01) en VBE svp. J'ai
cherché sur beaucoup de site mais je n'ai pas trouvé mon bonheur.
Actuellement je suis obligé de mettre une formule dans chaque céllule
B4,C4,D4,E4,F4,etc... du style =SI(ET(B4>=A1;B4<=B1);"OK";"") mais je
préfererai passer par VBE avec une solution simple.

Merci par avance

10 réponses

Avatar
Daniel
Bonjour.
Essaie la macro suivante :
Sub Test()
Dim PlageNoms As Range, PlageDate As Range
Dim c As Range, d As Range
Set PlageDate = Range("B3:AF3")
Set PlageNoms = Range("A4:A10000")
For Each c In PlageNoms
If c.Value = "" Then Exit Sub
For Each d In PlageDate
Var = d.Column
Var1 = d.Value
If d.Value >= Range("A1").Value And d.Value <= Range("B1").Value
Then
c.Offset(0, d.Column - 1).Value = "OK"
End If
Next d
Next c
End Sub
Cordialement.
Daniel
"News Free" a écrit dans le message de news:

Bonjour,
J'aimerai faire un calendrier de congés dans lequel je metterai une date
de départ et une date de fin (par exemple en A1 le 02/01 et en B1 le
05/01) ainsi qu'une plage de date allant du 01/01 au 31/01 (par exemple
B3/01, C3/01, D3/01, etc...jusque AF31/01) puis en A4=Nom 1 et
A5=Nom 2.

| A | B | C | D | E | F |
G | F | G | etc...
1 | 02/01 05/01
2 |
3 | | 01/01 02/01 03/01 04/01 05/01 06/01
07/01 08/01 etc...
4 | nom 1 | OK OK OK OK
5 | nom 2 |

J'aimerai savoir comment faire pour ecrire OK en dessous de chaque date du
calendrier comprise entre A1 (le 02/01) et B1 ( le 05/01) en VBE svp. J'ai
cherché sur beaucoup de site mais je n'ai pas trouvé mon bonheur.
Actuellement je suis obligé de mettre une formule dans chaque céllule
B4,C4,D4,E4,F4,etc... du style =SI(ET(B4>¡;B4<±);"OK";"") mais je
préfererai passer par VBE avec une solution simple.

Merci par avance



Avatar
News Free
Merci Daniel, ta macro fonctionne à merveille ( et quel gain de temps). Je
l'ai ajouté à un bouton de commande et tout tourne nickel. Vu ton niveau
dans excel, je me permet de te poser encore 3 petites questions.

1°) Lorsque je change les date en A1 et B1, il me laisse les "Ok" des dates
précédentes. Que faut il modifier pour reprendre le teste au début à chaque
fois ?

2°) Est-il possible d'éxecuter une macro lorsqu'une valeur d'une céllule
change dans la feuille active ?

3°) Je donne mes date de départ et de fin dans 2 textbox à l'interieur d'un
userform.Ces 2 dates viennent s'inscrire en A1 et B1 et ta macro se lance
juste après.
Est-il possible que ta macro écrive OK en fonction du nom choisis dans une
liste comprise dans un userform ou d'une céllule (par exemple E1) ?

| A | B | C | D | E | F |
G | F | G | etc...
1 | 02/01 05/01 nom2
2 |
3 | | 01/01 02/01 03/01 04/01 05/01 06/01 07/01
08/01 etc...
4 | nom 1 |
5 | nom 2 | OK OK OK OK

En fait le nom se trouvera dans un autre feuillet parce que chaque
utilisateur aura sa propre fiche. C'est pour cette raison que j'aimerai que
ta macro sache de qui il s'agit. Sinon encore merci pour ton aide précieuse.
Je vais tenter d'étudier ta macro afin de me perfectionner et pouvoir la
reproduire a l'avenir. Encore Merci
Avatar
Daniel
Bonsoir.
1°) Ajoute ces lignes derrière le second SET :
ActiveCell = Range("A4")
Do While ActiveCell.Value <> ""
Range(ActiveCell.Offset(0, 1), ActiveCell.Offset(0, 31)).Value = ""
ActiveCell.Offset(1, 0).Select
Loop
2°) Là, il va falloir que tu fasses appel aux gourous. Le code ne s'exécute
pas tel quel dans une routine de feuille.
3°) Fais appel à la macro après avoir placé les deux dates sur la feuille.
Cordialement.
Daniel

"News Free" a écrit dans le message de news:

Merci Daniel, ta macro fonctionne à merveille ( et quel gain de temps). Je
l'ai ajouté à un bouton de commande et tout tourne nickel. Vu ton niveau
dans excel, je me permet de te poser encore 3 petites questions.

1°) Lorsque je change les date en A1 et B1, il me laisse les "Ok" des
dates précédentes. Que faut il modifier pour reprendre le teste au début à
chaque fois ?

2°) Est-il possible d'éxecuter une macro lorsqu'une valeur d'une céllule
change dans la feuille active ?

3°) Je donne mes date de départ et de fin dans 2 textbox à l'interieur
d'un userform.Ces 2 dates viennent s'inscrire en A1 et B1 et ta macro se
lance juste après.
Est-il possible que ta macro écrive OK en fonction du nom choisis dans une
liste comprise dans un userform ou d'une céllule (par exemple E1) ?

| A | B | C | D | E | F |
G | F | G | etc...
1 | 02/01 05/01 nom2
2 |
3 | | 01/01 02/01 03/01 04/01 05/01 06/01
07/01 08/01 etc...
4 | nom 1 |
5 | nom 2 | OK OK OK OK

En fait le nom se trouvera dans un autre feuillet parce que chaque
utilisateur aura sa propre fiche. C'est pour cette raison que j'aimerai
que ta macro sache de qui il s'agit. Sinon encore merci pour ton aide
précieuse. Je vais tenter d'étudier ta macro afin de me perfectionner et
pouvoir la reproduire a l'avenir. Encore Merci



Avatar
News Free
Félicitation pour ta rapidité à répondre ainsi que pour tes connaissances au
sujet d'excel.J'ai ajouté les ligne en dessous du 2 ème SET et je rempli les
dates en A1 et B1 avant de lancer la macro mais lorsque je lance la
procédure, il me fait un copier-coller de la céllule A4 ("Nom1") dans la
derniere céllule où j'ai cliqué avant de lancer la macro. Il me place
correctement les "OK" mais toujours dans les 2 lignes "nom1" et "nom2".
Voici la macro que j'ai désormais :

Private Sub CommandButton1_Click()
Dim PlageNoms As Range, PlageDate As Range
Dim c As Range, d As Range
Set PlageDate = Range("B3:AF3")
Set PlageNoms = Range("A4:A10000")
ActiveCell = Range("A4")
Do While ActiveCell.Value <> ""
Range(ActiveCell.Offset(0, 1), ActiveCell.Offset(0, 31)).Value = ""
ActiveCell.Offset(1, 0).Select
Loop
For Each c In PlageNoms
If c.Value = "" Then Exit Sub
For Each d In PlageDate
Var = d.Column
Var1 = d.Value
If d.Value >= Range("A1").Value And d.Value <= Range("B1").Value
Then
c.Offset(0, d.Column - 1).Value = "OK"
End If
Next d
Next c
End Sub

J'ai essayé de comprendre ta macro mais je ne sais pas à quoi sert Var et
Var1 ainsi que le d et le c qui se trouve apres Next. Le c et d sont
nécessaire ou c'est juste un repère visuel pour faciliter la lecture de la
macro ?
Je te remercie beaucoup pour l'aide que tu m'a apporter. Je vais me baser
sur ta macro pour essayer de trouver une solution.

Amicalement,
Didier
Avatar
Daniel
Bonjour.
Essaie ceci :

Private Sub CommandButton1_Click()
Dim PlageNoms As Range, PlageDate As Range
Dim c As Range, d As Range
Set PlageDate = Range("B3:AF3")
Set PlageNoms = Range("A4:A10000")
'ActiveCell = Range("A4").Select
'Do While ActiveCell.Value <> ""
' Range(ActiveCell.Offset(0, 1), ActiveCell.Offset(0, 31)).Value = ""
' ActiveCell.Offset(1, 0).Select
'Loop
For Each c In PlageNoms
If c.Value = "" Then Exit For
Range(c.Offset(0, 1), c.Offset(0, 31)).ClearContents
Next c
For Each c In PlageNoms
If c.Value = "" Then Exit Sub
For Each d In PlageDate
If d.Value >= Range("A1").Value And d.Value <= Range("B1").Value
Then
c.Offset(0, d.Column - 1).Value = "OK"
End If
Next d
Next c
End Sub
Mais c'est à tester à fond.

Bon dimanche.
Daniel
"News Free" a écrit dans le message de news:

Félicitation pour ta rapidité à répondre ainsi que pour tes connaissances
au sujet d'excel.J'ai ajouté les ligne en dessous du 2 ème SET et je
rempli les dates en A1 et B1 avant de lancer la macro mais lorsque je
lance la procédure, il me fait un copier-coller de la céllule A4 ("Nom1")
dans la derniere céllule où j'ai cliqué avant de lancer la macro. Il me
place correctement les "OK" mais toujours dans les 2 lignes "nom1" et
"nom2". Voici la macro que j'ai désormais :

Private Sub CommandButton1_Click()
Dim PlageNoms As Range, PlageDate As Range
Dim c As Range, d As Range
Set PlageDate = Range("B3:AF3")
Set PlageNoms = Range("A4:A10000")
ActiveCell = Range("A4")
Do While ActiveCell.Value <> ""
Range(ActiveCell.Offset(0, 1), ActiveCell.Offset(0, 31)).Value = ""
ActiveCell.Offset(1, 0).Select
Loop
For Each c In PlageNoms
If c.Value = "" Then Exit Sub
For Each d In PlageDate
Var = d.Column
Var1 = d.Value
If d.Value >= Range("A1").Value And d.Value <=
Range("B1").Value Then
c.Offset(0, d.Column - 1).Value = "OK"
End If
Next d
Next c
End Sub

J'ai essayé de comprendre ta macro mais je ne sais pas à quoi sert Var et
Var1 ainsi que le d et le c qui se trouve apres Next. Le c et d sont
nécessaire ou c'est juste un repère visuel pour faciliter la lecture de la
macro ?
Je te remercie beaucoup pour l'aide que tu m'a apporter. Je vais me baser
sur ta macro pour essayer de trouver une solution.

Amicalement,
Didier



Avatar
News Free
Cette fois ci, ta macro supprime bien les "OK" des 1ere dates données et je
pense que c'est grace a cette ligne:
Range(c.Offset(0, 1), c.Offset(0, 31)).ClearContents

Le soucis c'est que si je laisse mes valeurs sur "feuil1" et que j'execute
la macro sur une autre feuille appellé "feuil2". En modifiant les lignes SET
comme ceci :
Set PlageDate = Sheets("Feuil1").Range("B3:AF3")
Set PlageNoms = Sheets("Feuil1").Range("A4:A10000")
Ceci a pour effet de remplir correctement le "OK" mais la ligne qui sert à
effacer ne fonctionne pas (erreur 1004) puisque la feuil1 n'est pas active.
On dirait que cette fonction fonctionne correctement pour 1 seule céllule
mais pas pour 1 plage. par exemple :
c.Offset(0,1).Value = "" ceci va fonctionner
Range(c.Offset(0, 1), c.Offset(0, 31)).ClearContents ceci renvoi une
erreur 1004

Si tu as 1 parade pour pouvoir éffacer une plage de céllule sur une autre
feuille sans l'activer, je suis preneur.
Encore une fois Merci de ton aide et je pense faire un peu de progrès
grace au code que tu m'indique et que j'éssaie de comprendre.
Amicalement,
Didier
Avatar
Daniel
Bonsoir.
Sans que je puisse l'expliquer, le code fonctionne dans un module mais pas
quand il est attaché à un bouton.
Essaie de cette manière :
Dans un module :
Sub Test()
Dim PlageNoms As Range, PlageDate As Range
Dim c As Range, d As Range, NomFeuil As String
Set PlageDate = Sheets("Feuil1").Range("B3:AF3")
Set PlageNoms = Sheets("Feuil1").Range("A4:A10000")
For Each c In PlageNoms
Var = c.Value
If c.Value = "" Then Exit For
Range(c.Offset(0, 1), c.Offset(0, 31)).ClearContents
Next c
For Each c In PlageNoms
If c.Value = "" Then Exit Sub
For Each d In PlageDate
If d.Value >= Sheets("Feuil1").Range("A1").Value And d.Value <=
Sheets("Feuil1").Range("B1").Value Then
c.Offset(0, d.Column - 1).Value = "OK"
End If
Next d
Next c
End Sub

Dans le code du bouton :
Private Sub CommandButton1_Click()
Call Test
End Sub

Cordialement.
Daniel


"News Free" a écrit dans le message de news:
%
Cette fois ci, ta macro supprime bien les "OK" des 1ere dates données et
je pense que c'est grace a cette ligne:
Range(c.Offset(0, 1), c.Offset(0, 31)).ClearContents

Le soucis c'est que si je laisse mes valeurs sur "feuil1" et que j'execute
la macro sur une autre feuille appellé "feuil2". En modifiant les lignes
SET comme ceci :
Set PlageDate = Sheets("Feuil1").Range("B3:AF3")
Set PlageNoms = Sheets("Feuil1").Range("A4:A10000")
Ceci a pour effet de remplir correctement le "OK" mais la ligne qui sert à
effacer ne fonctionne pas (erreur 1004) puisque la feuil1 n'est pas
active. On dirait que cette fonction fonctionne correctement pour 1 seule
céllule mais pas pour 1 plage. par exemple :
c.Offset(0,1).Value = "" ceci va fonctionner
Range(c.Offset(0, 1), c.Offset(0, 31)).ClearContents ceci renvoi une
erreur 1004

Si tu as 1 parade pour pouvoir éffacer une plage de céllule sur une autre
feuille sans l'activer, je suis preneur.
Encore une fois Merci de ton aide et je pense faire un peu de progrès
grace au code que tu m'indique et que j'éssaie de comprendre.
Amicalement,
Didier



Avatar
News Free
Effectivement désormais la macro efface correctement les "OK" sur la feuil1.
Pour pouvoir effectuer un effacement d'une plage sur une autre feuil a
partir d'un bouton de commande, j'ai trouvé cette parade :
Private Sub CommandButton1_Click()
Dim PlageNoms As Range, PlageDate As Range
Dim c As Range, d As Range
Set PlageDate = Sheets("Feuil1").Range("B2:AF2")
Set PlageNoms = Sheets("Feuil1").Range("A3:A5")
For Each c In PlageNoms
For Each d In PlageDate
If c = Range("O22").Value Then
c.Offset(0, d.Column - 1).Value = ""
End If
Next
Next
End Sub
En fait je suis obligé de déclarer la plage t pour pouvoir faire référence à
la feuil1 sinon il me fait l'effacement dans la feuille active.

J'ai une nouvelle question à te poser si ca ne te dérange pas. J'éffectuer
une comparaison entre d'une date donnée dans un textbox et une liste de date
de jours fériés. J'aimerai que si il trouve une correspondance avec la
liste, qu'il me fasse Cdate(texbox1.value) - 1 et qu'il reprenne le teste
depuis le début de la liste. Comme tu as écris dans ta macro EXIT FOR,
j'imagine qu'il doit y avoir une commande du style Restart For pour
reprendre le teste depuis le début de la liste avec la nouvelle valeur de la
textbox mais je n'ai rien trouvé jusqu'ici. Comment je pourrait interpreter
cette demande ?

Mon fichier d'aide de VBE refuse de m'afficher les résultats de la recherche
alors je ne peux pas consulter l'aide incluse c'est pour cette raison que je
demande sur le newsgroup.
J'espere ne pas abuser de ta gentillesse et je te remercie de nouveau pour
l'aide que tu m'a apporté jusqu'ici.
Amicalement,
Didier
Avatar
Daniel
Bonjour.
Tu peux adapter ce code à tes besoins, si j'ai bien compris ce que tu veux
faire.

Dim PlageDate As Range, Dat As Date, c As Range, Trouve As Boolean
Dat = CDate(TextBox1.Value)
Set PlageDate = Range("C8:C100")
Trouve = False
For Each c In PlageDate
If c.Value = Dat Then
Trouve = True
Exit For
End If
Next c
If Trouve = True Then
Dat = Dat - 1
For Each c In PlageDate
If c.Value = Dat Then Exit For
Next c
MsgBox Dat
End If

Cordialement.
Daniel
"News Free" a écrit dans le message de news:

Effectivement désormais la macro efface correctement les "OK" sur la
feuil1.
Pour pouvoir effectuer un effacement d'une plage sur une autre feuil a
partir d'un bouton de commande, j'ai trouvé cette parade :
Private Sub CommandButton1_Click()
Dim PlageNoms As Range, PlageDate As Range
Dim c As Range, d As Range
Set PlageDate = Sheets("Feuil1").Range("B2:AF2")
Set PlageNoms = Sheets("Feuil1").Range("A3:A5")
For Each c In PlageNoms
For Each d In PlageDate
If c = Range("O22").Value Then
c.Offset(0, d.Column - 1).Value = ""
End If
Next
Next
End Sub
En fait je suis obligé de déclarer la plage t pour pouvoir faire référence
à la feuil1 sinon il me fait l'effacement dans la feuille active.

J'ai une nouvelle question à te poser si ca ne te dérange pas. J'éffectuer
une comparaison entre d'une date donnée dans un textbox et une liste de
date de jours fériés. J'aimerai que si il trouve une correspondance avec
la liste, qu'il me fasse Cdate(texbox1.value) - 1 et qu'il reprenne le
teste depuis le début de la liste. Comme tu as écris dans ta macro EXIT
FOR, j'imagine qu'il doit y avoir une commande du style Restart For pour
reprendre le teste depuis le début de la liste avec la nouvelle valeur de
la textbox mais je n'ai rien trouvé jusqu'ici. Comment je pourrait
interpreter cette demande ?

Mon fichier d'aide de VBE refuse de m'afficher les résultats de la
recherche alors je ne peux pas consulter l'aide incluse c'est pour cette
raison que je demande sur le newsgroup.
J'espere ne pas abuser de ta gentillesse et je te remercie de nouveau pour
l'aide que tu m'a apporté jusqu'ici.
Amicalement,
Didier



Avatar
News Free
Ok j'ai testé la macro que tu m'as communiqué précedement mais ca n'est pas
tout a fait ce que je voudrais faire. Admettons que je lui donne une liste
avec ces valeurs :
C1 = 01/01/2005
C2 = 01/05/2005
C3 = 07/05/2005
C4 = 08/05/2005
etc....
Et que je lui donne comme date dans ma textbox le 08/05/2005. Ta macro va
bien détecter qu'il se trouve dans liste et effectuer -1 sur la date que je
lui ai communiqué, c'est a dire que la date de la textbox devient le
07/05/2005. J'aimerai qu'il reprenne le teste depuis le début de la liste en
verifiant maintenant que le 07/05/2005 ne se trouve pas dans la liste. Si il
trouve le 07/05/2005 dans la liste, il refait la meme opération (c 'est a
dire 07/05/2005 - 1) et recommence encore le teste depuis le début en
vérifiant cette fois avec la nouvelle date de la textbox qui est désormais
06/05/2005. Si le 06/05/2005 ne se trouve pas dans la liste alors je quitte
le FOR. J'ai bien noter que pour quitter le FOR c'est la commande EXIT FOR
mais pour recommencer le teste au début de la liste avec la nouvelle valeur
de la textbox, je ne sais pas quoi lui indiquer.

Encore merci pour l'interet que tu portes a mes problemes et chapeau pour
tes connaissances en la matière.
Amicalement,
Didier