cs_apz
Messages postés281Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention11 avril 2013
-
4 avril 2006 à 00:10
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 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).
'---------------------------------------
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
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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
'
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...
ç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
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"
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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...
cs_apz
Messages postés281Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention11 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
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>
cs_apz
Messages postés281Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention11 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
cs_apz
Messages postés281Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention11 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
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>