Etude séquentielle d'une liste de données.

dabdg

XLDnaute Nouveau
Bonjour,

Apres avoir parcouru le forum, et n'ayant pas trouvé de solution, voila mon probleme.

J'ai une liste de nombre (qui correspondent a des temps en seconde) sur une colonne, et classées chronologiquement.
Je cherche a déterminer combien de fois dans cette liste des valeurs successives ont un écart de 90 secondes max (entre la premiere valeur et la xeme valeur on doit avoir au max 90 d'écart), voila un exemple:

42
171
349
358
1991
2036
2068
2071
2076

3864
3887
3977
4072
4089

Je veux pouvoir déterminer combien de fois j'ai eu cet écart de 90 secondes avec au minimum 5 chiffres.
(Si j'ai 2 valeurs qui se tiennent dans les 90 secondes je ne veux pas les prendre en compte, il en faut 5 minimum entre la premiere valeur et la 5eme)

Dans ce cas précis j'ai 1 fois ce que je souhaite, de 1991 a 2076 j'ai 85 secondes d'écart. La formule devrait me renvoyer 1.

Il faut savoir que je vais avoir enormement de valeurs dans chaque liste, ce serait trop fastidieux a faire a la main.

Les variables sont donc:
- Le nombre de valeurs successives MINIMUM (ici j'ai 5)
- La valeur d'écart entre le premier et le dernier chiffre (ici 90)

Si on trouve 5 chiffres qui se suivent il est possible qu'il y en ai 6,7 ou plus qui respectent les 90 secondes d'écart, il faut donc les prendre en compte également.

Ensuite des qu'une valeur ne respecte plus les 90 secondes, on recommence sur la valeur suivante, le test.

Je ne sais pas si je suis parfaitement clair !
Si vous avez une idée, je suis preneur !

Merci
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Etude séquentielle d'une liste de données.

Bonsoir dabdg et bienvenu sur XLD :) ,

Un essai au moyen d'un sous-programme VBA avec trois paramètres:
Code:
Sub Reperer(Plage As Range, DureeMax As Long, NBmini As Long)
avec :
  • Plage -> la plage constituée d'une seule colonne des valeurs à traiter. Les résultats seront dans la colonne à gauche de la colonne plage.
  • DureeMax -> le nombre max de seconde comme limite supérieure.
  • NBmini -> nombre minimum de valeurs dont la somme doit être <= à DureeMax.
.
exemple d'appel: Reperer Sheets("Feuil1").Range("A2:A500"), 90, 5
plage des valeurs -> Sheets("Feuil1").Range("A2:A500") ; durée max -> 90 secondes ; il faut un minimum de 5 valeurs dans la série.

Cliquer sur le bouton "Repérer" pour lancer la macro.

Le code:
VB:
Option Explicit

Sub Test()
  Reperer Sheets("Feuil1").Range("A2:A500"), 90, 5
End Sub

Sub Reperer(Plage As Range, DureeMax As Long, NBmini As Long)
Dim tablo, First As Range, i1 As Long, i As Long, diff As Long, k As Long, coul As Boolean

With Plage.Parent
  Plage.Offset(, 1).ClearContents
  Plage.Resize(, 2).Interior.Color = xlNone
  i1 = 1: i = i1 + 1
  Do                      ''While i <= Plage.Count
    DoEvents
    If (Plage(i, 1) - Plage(i1, 1)) <= 90 And (Plage(i + 1, 1) - Plage(i1, 1)) > 90 And (i - i1 + 1) >= NBmini Then
      For k = i1 To i
        Plage(k, 2) = Plage(k, 1)
      Next k
      coul = Not coul
      .Range(Plage(i1, 1), Plage(i, 2)).Interior.Color = IIf(coul, RGB(196, 255, 0), RGB(134, 203, 255))
      i1 = i + 1: i = i1 + 1
    ElseIf (Plage(i, 1) - Plage(i1, 1)) <= 90 And (Plage(i + 1, 1) - Plage(i1, 1)) > 90 And (i - i1 + 1) < NBmini Then
      i1 = i1 + 1: i = i1 + 1
    ElseIf (Plage(i, 1) - Plage(i1, 1)) > 90 Then
      i1 = i1 + 1: i = i1 + 1
    Else
      i = i + 1
    End If
  Loop Until i > Plage.Count
  
  i = i - 1
  If (Plage(i, 1) - Plage(i1, 1)) <= 90 And (i - i1 + 1) >= NBmini Then
    For k = i1 To i
      Plage(k, 2) = Plage(k, 1)
    Next k
    coul = Not coul
    .Range(Plage(i1, 1), Plage(i, 2)).Interior.Color = IIf(coul, RGB(196, 255, 0), RGB(134, 203, 255))
  End If
End With
End Sub
 

Pièces jointes

  • Etud Seq liste data v1.xlsm
    30.5 KB · Affichages: 32

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Etude séquentielle d'une liste de données.

(re)Bonsoir dabdg,

J'avais mal lu la demande. Il ne vous faut que le nombre de séries dont l'amplitude est inférieure à une borne sup. et dont le nombre de valeurs est supérieur ou égal à une borne min.

Dans la version v2, j'ai rajouté une fonction nbfois qui devrait le faire. Un exemple d'utilisation se trouve en cellule F7. Les paramètres de la fonction nbfois sont identiques à ceux décrits dans mon précédent message.

Le code:
VB:
Function nbfois(Plage As Range, DureeMax As Long, NBmini As Long) As Long
Dim tablo, First As Range, i1 As Long, i As Long, diff As Long, k As Long

With Plage.Parent
  i1 = 1: i = i1 + 1
  Do
    If (Plage(i, 1) - Plage(i1, 1)) <= 90 And (Plage(i + 1, 1) - Plage(i1, 1)) > 90 And (i - i1 + 1) >= NBmini Then
      nbfois = nbfois + 1
      i1 = i + 1: i = i1 + 1
    ElseIf (Plage(i, 1) - Plage(i1, 1)) <= 90 And (Plage(i + 1, 1) - Plage(i1, 1)) > 90 And (i - i1 + 1) < NBmini Then
      i1 = i1 + 1: i = i1 + 1
    ElseIf (Plage(i, 1) - Plage(i1, 1)) > 90 Then
      i1 = i1 + 1: i = i1 + 1
    Else
      i = i + 1
    End If
  Loop Until i > Plage.Count
  
  i = i - 1
  If (Plage(i, 1) - Plage(i1, 1)) <= 90 And (i - i1 + 1) >= NBmini Then nbfois = nbfois + 1
End With
End Function

nb: j'ai apporté quelques modifications mineures dans la macro Reperer de la version v1.

Attention! Les macros ont été écrites sous Excel 2010 version PC.
 

Pièces jointes

  • Etud Seq liste data v2.xlsm
    33.7 KB · Affichages: 30
  • Etud Seq liste data v2.xls
    87 KB · Affichages: 32
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Etude séquentielle d'une liste de données.

Bonjour dabdg,

Je me suis aperçu :eek: que j'avais inscrit la durée "90" en dur dans le code au lieu d'utiliser le paramètre "DureeMax". Les codes des fichiers joints ont été rectifiés (pour le test, inscrire la durée max et le nombre minimum de valeurs d'une série en H1 et H2)
 

Pièces jointes

  • Etud Seq liste data v3.xls
    86 KB · Affichages: 32
  • Etud Seq liste data v3.xlsm
    33.5 KB · Affichages: 35

dabdg

XLDnaute Nouveau
Re : Etude séquentielle d'une liste de données.

Bonjour,

Tout d'abord merci beaucoup !
J'ai saisi le fonctionnement (bien que le code en lui même m'echappe encore un peu).
Quand je le test avec un Office 2010 (que j'ai egalement), j'ai ce message d'erreur:
Capture d’écran 2013-05-20 à 16.18.34.png
Qui fait référence a un fichier mapomme.xlam
A quel endroit puis-je modifier ce comportement ?

Et 2eme point, a quel endroit puis-je aller pour accéder a la macro ? (si je veux la voir/modifier etc..) ?

Merci encore !

EDIT: J'ai modifié la macro via un clique droit sur le bouton "repéré" et j'ai selectionné "test" et cela fonctionne !!
Ma question est plus de l'ordre pratique maintenant, dans le sens ou l'appel a la fonction nbfois() ne peut se faire que dans cette page si j'ai bien compris, comment je pourrais faire pour la rendre accessible plus facilement ? peut-on partage cette fonction entre différentes feuilles excel ?
Et sinon ou aller pour la "voir" ?
 
Dernière édition:

dabdg

XLDnaute Nouveau
Re : Etude séquentielle d'une liste de données.

Alors j'ai finalement trouvé comment réutiliser la fonction que tu as (tres gentiment !!) développé.
Je l'enregistre dans un premier temps en fichier .xla, puis apres je peux l'importer dans une autre feuille.

Par contre je n'arrive pas encore a faire en sorte de pouvoir remettre un bouton "Reperer" dans une nouvelle feuille.
Si tu as un petit indice...

Merci encore en tout cas !

PS: ca marche tres bien avec la version excel sous mac.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Etude séquentielle d'une liste de données.

Bonsoir dabdg,
Qui fait référence a un fichier mapomme.xlam
J'ai plusieurs modules dans mon excel avec plusieurs fois des macros nommées "test". J'ai dû me tromper de macro :eek:. mais tu as trouvé la solution.

Et 2eme point, a quel endroit puis-je aller pour accéder a la macro ? (si je veux la voir/modifier etc..) ?
Pour cela, cliquer droit sur le l'onglet comportant le nom "Feuil1" au bas de la feuille "Feuil1" et dans le menu qui apparait cliquer sur "Visualiser le code". L'environnement VBA apparait. Repérer le projet (nom du classeur). Le code est dans le module1.

peut-on partage cette fonction entre différentes feuilles excel ?
La fonction nbfois est normalement utilisable sur toutes les feuilles, contrairement au sous-programme Test (que j'ai d'ailleurs renommé en TestRepererFeuil1).

Si vous voulez utiliser le repérage sur une autre feuille, dupliquez les 3 lignes de la macro TestRepererFeuil1 au sein de module1, renommez la macro dupliquée puis changez en les paramètres.

Dans le classeur, copiez le bouton de la Feuil1 vers la feuille concernée et attribuez au bouton la macro dupliquée (voir un exemple dans les classeurs joints)

nb: si les feuilles de votre classeur ont toutes la même structure, on pourrait ne faire qu'une seule macro valable pour toutes les feuilles.
 

Pièces jointes

  • Etud Seq liste data v4.xls
    72.5 KB · Affichages: 31
  • Etud Seq liste data v4.xlsm
    29.2 KB · Affichages: 33

dabdg

XLDnaute Nouveau
Re : Etude séquentielle d'une liste de données.

Bonjour,

Merci beaucoup pour toutes ces précisions.
J'arrive maintenant a partager la fonction. Je n'ai pas encore essayé de remettre un bouton repérer, pour le moment je tente de modifier le script pour qu'il gère les cases vides.
A priori si dans la plage sélectionnée il y a des cases vides, le script le compte pour 1
Ceci dit quand j'ai expliqué mon problème je n'avais pas parlé des éventuelles cases vides!

Voila les modifications que j'ai effectué, mais ca ne semble pas bien fonctionner (et j'ai quelques difficultés avec le déboggeur).
Code:
Function nbfois(Plage As Range, DureeMax As Long, NBmini As Long) As Long
Dim tablo, First As Range, i1 As Long, i As Long, diff As Long, k As Long, FinAction As Boolean
FinAction = False


With Plage.Parent
  i1 = 1: i = i1 + 1
  Do
    If (Plage(i, 1) - Plage(i1, 1)) <= DureeMax And (Plage(i + 1, 1) - Plage(i1, 1)) > DureeMax And (i - i1 + 1) >= NBmini And Plage(i, 1) <> "" Then
      nbfois = nbfois + 1
      i1 = i + 1: i = i1 + 1
    ElseIf (Plage(i, 1) - Plage(i1, 1)) <= DureeMax And (Plage(i + 1, 1) - Plage(i1, 1)) > DureeMax And (i - i1 + 1) < NBmini And Plage(i, 1) <> "" Then
      i1 = i1 + 1: i = i1 + 1
    ElseIf (Plage(i, 1) - Plage(i1, 1)) > DureeMax And Plage(i, 1) <> "" Then
      i1 = i1 + 1: i = i1 + 1
    Else
      i = i + 1
    End If
  Loop Until i > Plage.Count
  
  
  
  i = i - 1
  If (Plage(i, 1) - Plage(i1, 1)) <= DureeMax And (i - i1 + 1) >= NBmini Then nbfois = nbfois + 1
End With
End Function
 

Discussions similaires