Accueil > Forum > > > > Déterminer une plage de données
Déterminer une plage de données
mardi 4 avril 2006 à 00:10:49 |
Déterminer une plage de données

apz
|
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
|
|
mardi 4 avril 2006 à 14:20:22 |
Re : Déterminer une plage de données

us_30
|
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.
|
|
mardi 4 avril 2006 à 21:41:01 |
Re : Déterminer une plage de données

apz
|
Merci us,
j'ai fait des tests sur ces données :
| 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
|
|
vendredi 7 avril 2006 à 22:55:46 |
Re : Déterminer une plage de données

rvblog
|
Salut apz, salut 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 Je veux ton bien... et je l'aurais
|
|
vendredi 7 avril 2006 à 23:42:41 |
Re : Déterminer une plage de données

us_30
|
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.
|
|
vendredi 7 avril 2006 à 23:44:58 |
Re : Déterminer une plage de données

us_30
|
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.
|
|
lundi 17 avril 2006 à 03:48:41 |
Re : Déterminer une plage de données

apz
|
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
|
|
lundi 17 avril 2006 à 12:20:17 |
Re : Déterminer une plage de données

us_30
|
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.
|
|
lundi 17 avril 2006 à 14:31:54 |
Re : Déterminer une plage de données

rvblog
|
Salut apz, salut 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 Je veux ton bien... et je l'aurais... mais jamais avant la page 4
|
|
lundi 17 avril 2006 à 14:37:25 |
Re : Déterminer une plage de données

rvblog
|
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 16MsgBox DatePart(" ww", #31/12/2006#, vbMonday, vbFirstFourDays) 'renvoie 52
à+
rvblogn Je veux ton bien... et je l'aurais... mais jamais avant la page 4
|
|
Cette discussion est classée dans : date, value, range, plage, ctr
Répondre à ce message
Sujets en rapport avec ce message
filtre date en vba excel [ par mythiac ]
bonjour,j'aurai besoin d'un coup de main pour un filtre pour des dates. Je procède en copiant ma base de données sur une page intermédiaire dans un pr
[Catégorie modifiée .Net --> VBA] probleme de date [ par licharna ]
Bonjour, en fait j'ai un probléme que j'arrive pas a resoudre depuis 3 jours. en fai je dois faire une fonction vbscript qui permet d'automatiser la
[Catégorie modifiée VB6 --> VBA] erreur de type incompatibilité [ par Cacou78000 ]
Bonjour, j'ai un problème au niveau de mon code et ne sais pas d'ou viens l'erreur de type incompatibilité voici mon code ' Déclaration des variables
[Catégorie modifiée .Net --> VBA] depassement de capacité vba excel [ par balthordu ]
Bonjour à tous J'ai un souci de débordement de capacité. Voici le code, tres simple: il calcul le rapport entre deux colonnes dans une boucle while.
[Catégorie modifiée VB6 --> VBA] Erreur d'exécution n° 5 [ par jpb974 ]
Bonjour à tous, Grand débutant en VBA, j'apprécie votre forum où j'apprends beaucoup de choses. Mais là, je bloque totalement sur quelques lignes qui
Un idée pour alleger mon code [ par chapeleurb ]
Bonjour à tous, tout nouveau sorti de ma premiere formation VBA appliquée à excel je decouvre dejà la joie des problèmes... auriez vous une idée pou
Comparaison de valeurs de cellule et prise en compte du changement de valeur [ par gerardcjf ]
Bonjour, A l'intérieur d'un feuille en haut de celle-ci j'ai une cellule (disons B3) dont l'utilisateur peur faire varier la valeur (les valeurs de c
N° colonne en fonction de x das une boucle For Next [ par jacky1002 ]
Bonjour, j'ai un ptit problème : je fais un classeru pour éditer des demande d'intervention préventive de maintenance. Dans un classeur j'ai 2 feui
erreur 400 VB [ par doudou69820 ]
Bonjour, Quand j'éxécute ce macro, l'erreur 400 apparait et je ne trouve pas le pourquoi... Je suis débutant en VB donc merci de m'aider! Voici mon
Livres en rapport
|
Derniers Blogs
XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE)[HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE) par Gio
Je m'y prends un peu tard je sais, mais bon je suis développeur web et donc hyper fainéant ! Toujours dans le cadre des technologies émergentes, ici HTML5, parce qu'on aime HTML5 chez Wyg , nous seront présent, le vieux ( Aurélien V.) et moi, pour pr...
Cliquez pour lire la suite de l'article par Gio [WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|