XL 2016 Décaler courbes sur l'abscisse puis créer une moyenne

Oliroul

XLDnaute Nouveau
Bonjour,
A peine inscrit, je poste déjà mon problème car je ne m’en sort pas, c'est aussi pour cela que je me suis inscrit ;)

Dans mon cas, j’importe des fichiers txt, je les mets en formes pour tracer les courbes correspondantes pour les comparer et tracer une courbe moyenne

Mais chaque fichier a une abscisse de temps différentes, donc je ne peux pas faire la moyenne directement.

Et donc je souhaite sur une même feuille importer les valeurs recalées de sorte à ce que mes courbes soient comparables. Le recalage se fait par le maxi sur une échelle de temps centrée sur zéro [-0,5000 ; 0,5000].

J’arrive a trouver la valeur Max, mais il y a peut-être plus simple. Ce que je n’arrive pas à faire c’est copier vers le haut pour que mon max trouvé corresponde au zéro de la nouvelle feuille « Courbes_recalées »

Concernant la moyenne, je souhaite laisser le choix à l’utilisateur des colonnes à moyenner, pour l’exemple, je l’ai fait « à la mano » dans Excel

J’ai créé un fichier d'exemple que j'ai été obligé d'alléger (les courbes sont des captures pour gain de place) pour expliciter ce que je souhaite, vu le temps que j'ai mi pour 3 courbes j'espère que c'est assez clair.

Pour info, à termes, je souhaite importer 24 courbes et faire 4 moyennes

Merci pour votre aide, en espérant que ma demande ne soit pas irréalisable
 

Pièces jointes

  • Recalage.xlsm
    722.6 KB · Affichages: 16
Solution
Bonjour Oliroul, le forum,

Avec ce fichier (2) on crée en plus les graphiques des courbes sélectionnées :
VB:
Dim graph As Boolean 'mémorise la variable

Sub Graphiques()
'se lance par les touches Ctrl+G
graph = True: Moyenne: graph = False
End Sub

Sub Moyenne()
'se lance par les touches Ctrl+M
Dim P As Range, rc&, cc%, col%
Set P = Union(Columns(1), Selection.EntireColumn)
Application.ScreenUpdating = False
'---copier-coller---
With Workbooks.Add(xlWBATWorksheet).Sheets(1) 'nouveau document
    P.Copy .[A1]
    .[A1].Copy .[A1] 'allège la mémoire
    Set P = .UsedRange
    rc = P.Rows.Count: cc = P.Columns.Count
    If rc = 1 Or cc = 1 Then .Parent.Close False: Exit Sub 'sécurité
    .Name = "Moyenne"
End With
'---colonnes Real time et...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Oliroul,
Un essai en PJ.
Je fixe un seuil de détection. Puis sur chaque courbe je cherche à quel temps la courbe passe au dessus de ce seuil.
Puis j'utilise ce temps comme temps initial, et cet index pour extraire les données.
 

Pièces jointes

  • Recalage.xlsm
    790.8 KB · Affichages: 3

job75

XLDnaute Barbatruc
Bonjour Oliroul, sylvanu,

Effectivement s'agissant d'un simple décalage des temps le VBA n'est pas nécessaire.

Dans le fichier joint voyez les colonnes que j'ai appelées Real time, formule en B2 :
Code:
=A2-INDEX(A:A;EQUIV(MAX(C:C);C:C;0))
Il vaut mieux faire 3 graphiques, c'est plus lisible.

A+
 

Pièces jointes

  • Recalage(1).xlsm
    731 KB · Affichages: 4

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re, Bonjour Job.
En PJ en VBA.
Accepte de 1 à 15 courbes. La moyenne est sur la dernière colonne.
Par contre j'i changé Explication pour simplifier le code. Une colonne sur deux est le temps, une colonne sur deux les valeurs. Mais facile à modifier dans le code mais fastidieux.
 

Pièces jointes

  • Recalage3.xlsm
    785.8 KB · Affichages: 7

Oliroul

XLDnaute Nouveau
Bonjour, et merci à tous pour votre implication, c'est vraiment super.

J'ai donc utilisé la formule Index (et recherche de max) dans un nouvel onglet et ça fonctionne mais j'ai encore un soucis:

Mon problème est que je dois importer 28 fichiers de trois courbes (au final environ 80 colonnes) et pour couvrir les décalages, j'ai un onglet avec 10000 lignes. Au final, je me retrouve avec un fichier de plus de 15Mo. Et là quand on sait qu'une photo de 4Mo prend trop de place sur le réseau, avec mon énorme fichier, je vais me faire renvoyer dans mes cordes.

Et après il me reste la moyenne car je souhaite que les colonnes à moyenner soient choisies par l'utilisateur.
J'ai créé ce code (que j'ai lâchement trouvé sur le net) pour la sélection mais je bloque pour la moyenne.

VB:
Sub Moyenne()
'
' Moyenne Macro
'

Range("A1").Select

Dim PCV As Range 'déclare la variable PCV (Première Cellule Vide)
Set PCV = Cells(1, Application.Columns.Count).End(xlToLeft).Offset(0, 1) 'définit la cellule PCV
    PCV.Value = InputBox("Saisissez le nom de la moyenne", "Saisie du nom") 'nomme la cellule
PCV.Select
ActiveCell.Offset(1, 0).Activate

   Dim Plage As Range
  
   Set Plage = Application.InputBox("Sélectionner les cellules sur la feuille", Type:=8)
   If Plage.Cells.Count <> 6 Then
     MsgBox "Merci de sélectionner 6 cellules"
'      Exit Sub
   End If
  
   'Appel MyFunction
   ActiveCell.Value = MyFunction(Plage)
End Sub


Function MyFunction(Plage As Range) As Double
   MyFunction = .Average(Plage(1), Plage(2), Plage(3), Plage(4), Plage(5), Plage(6))
End Function

Et après je copie/colle la formule vers le bas.

Je dois passer sur autre chose pour aujourd'hui.

Merci pour votre attention
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Oliroul,
Il y a plusieurs solutions pour faire maigrir un fichier :
1- En VBA le résultat sera plus léger que par formules, car il risque d'y avoir beaucoup de formules.
2- Une fois les courbes extraites, peut on "détruire" les données sources ?
3- Sinon peux t-on effacer les données sources non utiles, par ex on ne garde que max-300ms à max+300ms ,
4- Dans la feuille source, peux t-on supprimer les colonnes temps, puisque l'incrément temps est toujours de 1ms et que seul le max est important quelque soit le temps auquel il s'est produit ?
5- Passer le fichier en xlsb, la taille est beaucoup plus petite. ( le seul inconvénient à mes yeux est qu'il n'est pas exploitable sur tablette )

Pour infos, avec 80 colonnes soit 40 courbes avec la feuille de synthèse des 41 courbes recentrées on obtient 2145ko en xlsm et 1554ko en xlsb. ( d'ailleurs la taille ne me semble pas énorme )
 

Oliroul

XLDnaute Nouveau
Bonjour Sylvanu,

1- Je voyais aussi un avantage du VBA, c'est de ne pas avoir une feuille de calcul pleine de formule qui ne servirai pas si je n'importe qu'une partie des courbes.
2- Oui c'est possible de supprimer la feuille de données sources avec avertissement à l'utilisateur
3- On peut aussi alléger le temps puisque ce qui m'interresse c'est ce qui se passe autour du maxi
4- en fait dans ma feuille source je n'ai plus qu'une colonne de temps car quand j'importe les données elles sont toutes à [-0,2;0,3]

NB, je l'ai enregistré en xlsb (je ne connaissais pas), je passe de 17,8Mo à 14,8Mo

Dommage que mon fichier source soit trop volumineux. J'en ai fait un light avec uniquement 4 imports de 3 courbes

A noter j'ai un soucis avec ma formule dans l'onglet décalé (cf pour exemple BCD 3119).

Merci pour votre aide et bon week-end.

Oliroul
 

Pièces jointes

  • Recalage_Light_binaire_sans_graphique.xlsb
    985.2 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Un essai en PJ.
J'ai rajouté deux boutons :

-Liste des courbes importées
Fait la liste des courbes présentes dans le fichier.
Ensuite on sélectionne les courbes désirées en cliquant sur le nom. Un deuxième clic le désélectionne.
( J'ai pris le parti de n'avoir que 8 courbes sélectionnées )

-Recalage courbes
Extrait les courbes choisies, les recale, et en fait la moyenne.

NB1 : Certaines de vos courbes sont "strange", donc ( postulat perso ) si le max est < 2000 je ne tiens pas compte de la courbes.
Mais tout ça c'est bricolable. Tout est dans le module "RecalageCourbes"
NB2: Je n'ai absolument pas touché aux 6 boutons de droite.
 

Pièces jointes

  • Recalage_Light_binaire_sans_graphique.xlsb
    400.3 KB · Affichages: 3

Discussions similaires

Statistiques des forums

Discussions
312 027
Messages
2 084 767
Membres
102 658
dernier inscrit
karima