begin process at 2012 02 13 22:26:56
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive Visual Basic & VB.NET

 > 

Archives Visual Basic

 > 

VBA

 > 

Déterminer une plage de données


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Membre Club
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

Membre Club

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

à+

rvb
logn

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

Membre Club
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

Membre Club
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

Membre Club
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

Membre Club

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

Membre Club
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
Je veux ton bien... et je l'aurais... mais jamais avant la page 4


1 2

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


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,967 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales