Déterminer une plage de données

cs_apz Messages postés 281 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 11 avril 2013 - 4 avril 2006 à 00:10
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 - 21 avril 2006 à 14:47
Bonjour,.


A l'aide d'une valeur recuperer, j'aimerais pouvoir determiner la plage dans laquelle se trouve la date du jour.


j'ai fait ce code pour ça, mais ca ne fonctionne pas (il me faut une petite modification svp).


Bon, voila les données :


N° Sem Date
13 30-03-06
13 31-03-06
14 01-04-06
14 02-04-06
14 03-04-06
14 04-04-06
14 05-04-06
14 06-04-06
14 07-04-06
15 08-04-06
15 09-04-06


'---------------------------------------
Public Nsem As Integer


Private Sub TrouveDate()
Dim ctr

ctr = Application.Match(Date * 1, Range("B:B"), 0)
If IsNumeric(ctr) Then Range("D1")(ctr, 2).Value "N° de ligne est " & ctr
Else
ctr = Application.Match(Date * 1, Range("B:B"), 2)
Range("B2")(ctr, 1).Insert xlShiftDown
Range("B2")(ctr, 1).Value = Date Range("D1")(ctr, 2).Value "N° de ligne est " & ctr
End If
Nsem = Range("A1")(ctr, 1).Value Range("D1")(ctr + 1, 2).Value "N° Semaine est " & Nsem
TrouvePlage (Nsem)
End Sub


'--------------------------------


Private Sub TrouvePlage(Val As Integer)
Dim Debut, Fin, vFin, ComptPlg, Lig
Lig = Application.Match(Val * 1, Range("A:A"), 0)
If IsNumeric(ctr) Then
'Valeur de la 2eme Col qui corresponde
Debut = Range("B2")(Lig, 1).Value
'et puis on doit continuer pour trouver la derniere occurence
ComptPlg = 1
While IsNumeric(vFin)
vFin = Application.Match(Val * 1, Range("A:A"), ComptPlg)
ComptPlg = ComptPlg + 1
Wend
Fin = Range("B2")(vFin, 1).Value
End If
MsgBox "La valeur " & Val & " se trouve dans la plage du " & Debut & " au " & Fin
End Sub
'-------------------------------------


Resultat qui doit etre obtenue :


La valeur 14 se trouve dans la plage du 01-04-06 au 07-04-06.


Merci.


------------------------------------------------------------------
Debutant Excel/VBA, PHP/SQL, Delphi
Club de correspondance :
http://membres.lycos.fr/elatlasclub

14 réponses

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
4 avril 2006 à 14:20
Salut,

Si j'ai bien compris, ton problème revient à cherche dans la colonne A, la première occurence correspondant au numéro de semaine, puis lire la date dans la colonne B. Ensuite chercher la dernière occurrence, et relire la date dans la colonne B...

Rapidement j'ai fais ceci, en macro :

Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 04/04/2006 par us
'

SEMAINE = InputBox("N° semaine :", "Je vais chercher...")

Range("A1").End(xlDown).Select

DEBUT = Range("B" & Columns("A:A").Find(What:=SEMAINE, After:=Range("A1"), LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False).Row).Value

Selection.End(xlDown).Select

FIN = Range("B" & Columns("A:A").Find(What:=SEMAINE, After:=Range("A1"), LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:= _
False).Row).Value

MsgBox "La valeur " & SEMAINE & " se trouve dans la plage du " & DEBUT & " au " & FIN

End Sub



=


PS : Maintenant, sans rentrer dans le détail, dans des macros tu utilises une variable "Val" , or "Val" est aussi une instruction en VB... donc à éviter, si tu ne veux pas rencontrer des erreurs incompréhensibles...

Amicalement,
Us.
0
cs_apz Messages postés 281 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 11 avril 2013
4 avril 2006 à 21:41
Merci us,

j'ai fait des tests sur ces données :


<COLGROUP>
<COL style=\"WIDTH: 60pt\" span=2 width=80>

----

13,
28/03/2006,
----

13,
29/03/2006,
----

13,
30/03/2006,
----

13,
31/03/2006,
----

14,
01/04/2006,
----

14,
02/04/2006,
----

14,
03/04/2006,
----

14,
04/04/2006,
----

14,
05/04/2006,
----

14,
06/04/2006,
----

14,
07/04/2006,
----

15,
08/04/2006,
----

15,
09/04/2006,
----

15,
10/04/2006,
----

15,
11/04/2006,
----

15,
12/04/2006,
----

15,
13/04/2006

ça fonctionne trés bien pour la valeur : 13, 14 et 15 ..

mais pour la valeur 1 ça me donne :

La valeur 1 se trouve dans la plage du 29/04/2006 au 13/04/2006

au lieu de :

La valeur 1 se trouve dans la plage du 28/04/2006 au 13/04/2006

il y'a une cellule de manque (celle du 28/04/2006).

et puis pour eviter que ma macro m'envoie a la ligne A65536, j'a éliminer cette ligne :

Selection.End(xlDown).Select

et puis pourquoi :

SearchDirection:=xlNext, pour DEBUT

et

earchDirection:=xlPrevious, pour Fin

Merci.


------------------------------------------------------------------
Debutant Excel/VBA, PHP/SQL, Delphi
Club de correspondance :
http://membres.lycos.fr/elatlasclub
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
7 avril 2006 à 22:55
Salut 6934 apz, salut =488557 us_30,

une autre approche, avec une modélisation différente de la structure des données, en s'appuyant plus sur la richesse des types du langage :

Sub test()
Dim m_Week As New Collection
Dim m_Days As Collection
Dim strR As String

'semaine 13
Set m_Days = New Collection
'évidemment, ici, le remplissage pourrait être automatisé (c'est pour l'exemple)
m_Days. Add "30-03-06", CStr(m_Days.Count)
m_Days.Add "31-03-06", CStr(m_Days.Count)
'ajoute les valeurs dans la semaine
m_Week.Add m_Days, "13"

'semaine 14
Set m_Days = New Collection
m_Days.Add "01-04-06", CStr(m_Days.Count)
m_Days.Add "02-04-06", CStr(m_Days.Count)
m_Days.Add "03-04-06", CStr(m_Days.Count)
m_Days.Add "04-04-06", CStr(m_Days.Count)
m_Days.Add "05-04-06", CStr(m_Days.Count)
m_Days.Add "06-04-06", CStr(m_Days.Count)
m_Days.Add "07-04-06", CStr(m_Days.Count)
'ajoute les valeurs dans la semaine
m_Week.Add m_Days, "14"


'semaine 15
Set m_Days = New Collection
m_Days. Add "08-04-06", CStr(m_Days.Count)
m_Days.Add "09-04-06", CStr(m_Days.Count)
'ajoute les valeurs dans la semaine
m_Week.Add m_Days, "15"

'affichages
'1er élément semaine 13
MsgBox m_Week("13")(CStr(0))
'Dernier élément semaine 13
MsgBox m_Week("13")(CStr( m_Week("13").Count - 1))
'Plage semaine 14
strR =m_Week("14")(CStr(0)) & " " & m_Week("14")(CStr(m_Week("14").Count - 1))
MsgBox strR

End Sub

à+

rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
7 avril 2006 à 23:42
Bonsoir à tous,

Désolé, de ne pas avoir répondu plus tôt... JE répondrais aux questions de apz.

Dans le code, que je t'avais proposé, je supposais une liste ne débutant pas à A1... donc Range("A1").End(xlDown).Select , positionne le curseur courant en début de liste. ET à la réflexion, un problème se pose sur la liste début en A1, puisque dans ce cas tu te retrouve en bas de tableau à A65537... En fait, il faut corriger cela simplement en faisant Range("a1").select.

Pour trouver la première occurence correspond au numéro de semaine, on programme la recherche grâce à FIND... Bien sur comme on est en haut de liste, il faut descendre... d'où la direction de recherche vers le bas avec SearchDirection:=xlNext. Une fois, sur la première cellule de la colonne A, on met la valeur de la colonne B dans DEBUT.

Ensuite, le principe est identique, mais avant, on se positionne tout en bas de la liste, avec : Selection.End(xlDown).Select et on fait,cette fois une recherche vers le haut (SearchDirection:=xlPrevious) pour tomber sur la première occurence, qui correspond alors à la dernière valeur N° semaine.

Voilà,
En espérant être assez clair...

Amicalement,
Us.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
7 avril 2006 à 23:44
Complément,

Pour cette petite fonctionne correctement sans pb, il faut que la ligne 1, corresponde aux titres des rubriques (N° semaine , Date)
Puis que la suite soit remplie, les uns en dessous des autres, sans ligne vide...

Us.
0
cs_apz Messages postés 281 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 11 avril 2013
17 avril 2006 à 03:48
Merci us_30.

Pour rvblog :

Je vais voir avec cette procedure.

Mais d'une façon générale : est-ce qu'on peut l'adopter pour avoir des données de la semaine 01 à la semaine 52 de l'année ?

Merci d'avance


------------------------------------------------------------------
Débutant Excel/VBA, PHP/SQL, Delphi
Club de correspondance :
http://membres.lycos.fr/elatlasclub
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
17 avril 2006 à 12:20
Salut,

Pour moi, le mieux serait de programmer une formule pour trouver le N° de la semaine en fonction du jour donnée.

Amicalement,
Us.
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
17 avril 2006 à 14:31
Salut 6934 apz, salut =488557 us_30,

bien sûr, et ce, de façon assez ergonomique.
Toujours en prenant le problème dans l'autre sens, stockes tous les jours de l'année dans leur semaine (donc, pour 2006, de n° 52 à n° 52)
Notes bien, j'ai changé le nom de la collection des semaines, il devient m_Weeks (plus logique):

Sub test2()
Dim m_Weeks As New Collection
Dim m_Days As Collection
Dim datCurDate As Date
Dim intWeekNumber As Integer
Dim intMemoWeekNumber As Integer



'initialisations
datCurDate = DateSerial(2006, 1, 1) ' 1ère date de l'année
intWeekNumber = DatePart("ww", datCurDate, _
vbMonday, vbFirstFourDays) ' n° de semaine
intMemoWeekNumber = intWeekNumber ' mémo pour la rupture
Set m_Days = New Collection ' nouvelle collection de jours
(semaine)

'tant que pas fin d'année (arrêt qd date courante > dernière date année)
While datCurDate <= DateSerial(2006, 12, 31)
'tant que même semaine et pas fin d'année (arrêt qd semaine différente
'ou date courante > dernière date année)
While (datCurDate <= DateSerial(2006, 12, 31)) _
And (intMemoWeekNumber = intWeekNumber)
'calendrier preuve
Debug.Print datCurDate & " " & DatePart("ww", datCurDate, _
vbMonday, vbFirstFourDays)
'ajoute la date courante à la collection de jours
m_Days.Add Format(datCurDate, "dd-mm-yy", _
vbMonday, vbFirstFourDays), CStr(m_Days.Count +1)
'prochaine date étudiée
datCurDate = DateAdd("d", 1, datCurDate)
'prochain n° de semaine
intWeekNumber = DatePart("ww", datCurDate, vbMonday, vbFirstFourDays)
Wend
'si rupture de semaine
If intMemoWeekNumber <> intWeekNumber Then
'ajoute les valeurs de la collection de jours dans la collection de semaines
m_Weeks.Add m_Days, CStr(m_Weeks.Count + 1)
'rupture semaine
intMemoWeekNumber = intWeekNumber
'nouvelle collection de jours
Set m_Days = New Collection
End if
'suivant
Wend
End Sub

et tu lis :
'1er jour de la 1ère semaine stockée
MsgBox m_Weeks(1)(1)

'Dernier jour de la 53ème semaine stockée
MsgBox m_Weeks(m_Weeks.count)(m_Weeks(m_Weeks.count).count)

'enumération
Dim w As Collection
Dim i As Integer
i = 1 ' attention, i n'est le n° de semaine, mais son indice
For Each w In m_Weeks
For Each d In w
Debug.Print "S " & i & " " & d
Next d
i = i + 1
Next w

à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
17 avril 2006 à 14:37
Scuse us_30, je n'ai pas raffraichi avant de poster,

c'est une bonne idée que tu as là, mais cette fonction existe en VB, c'est DatePart :

MsgBox DatePart("ww", #01/01/2006#, vbMonday, vbFirstFourDays) 'renvoie 52
MsgBox DatePart("ww", #17/04/2006#, vbMonday, vbFirstFourDays) 'renvoie 16
MsgBox DatePart("ww", #31/12/2006#, vbMonday, vbFirstFourDays) 'renvoie 52

à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
17 avril 2006 à 18:58
Salut rvblog^n,

JE ferais bien de réviser mes petites connaissances... -:);

Effectivement, DatePart réponds parfaitement à la question, il me semble...

Merci,

Amicalement,
Us.
0
cs_apz Messages postés 281 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 11 avril 2013
20 avril 2006 à 21:45
Merci US_30 et rvblog<SUP>n.

</SUP>Mes semaines commencent par des samedis.

Devrais-je changer le code ?


------------------------------------------------------------------
Debutant Excel/VBA, PHP/SQL, Delphi
Club de correspondance :
http://membres.lycos.fr/elatlasclub
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
20 avril 2006 à 22:09
Salut ,

oui, il faudra :

DatePart("ww", #01/01/2006#, vbSaturday, vbFirstFourDays)

et vérifier si ta semaine n°1 est, comme en France, la 1ère semaine de l'année d'au moins 4 jours.

à+


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
0
cs_apz Messages postés 281 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 11 avril 2013
21 avril 2006 à 14:00
Merci rvblog
<SUP>n

</SUP>
Je peux te demander ce tu veux dire par :

vérifier si ta semaine n°1 est, comme en France, la 1ère semaine de l'année d'au moins 4 jours.


------------------------------------------------------------------
Debutant Excel/VBA, PHP/SQL, Delphi
Club de correspondance :
http://membres.lycos.fr/elatlasclub
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
21 avril 2006 à 14:47
Salut apz,

t'inquiètes, c'est juste que comme tu me dis que ta semaine commence un samedi, je te dis de vérifier que le réglage des n° de semaines te convient, à savoir :

La semaine N°1 est la 1ère qui a au moins 4 jours


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais... mais jamais avant la page 4
</SUP>
0
Rejoignez-nous