Importer des séries de données depuis un csv

Bonjour à tous !

J'ai un fichier de calcul dans lequel je souhaite automatiser l'importation de données. Ces données proviennent d'un fichier .CSV (délimité par ",").

Le fichier .CSV contient plusieurs séries de données à la suite mais seulement les deux premières m'intéressent : une première série théorique et une seconde série mesurée située en dessous. Je dois extraire 325 valeurs de chaque série, entre 5 et 95%.

En colonne A il y a le temps, et en B les valeurs.

Pour plus de compréhensions de mon problème voici mes différentes variables :

DescriptionVariableCellule dans le fichier .csv exemple
Titre de la première série (sera toujours le même titre)Titre1B2 (sera toujours B2)
Première valeur de la série théorique (la plus proche de 5)V1theoB35 (pas toujours B35..)
Dernière valeur de la série théorique (324 cellules plus bas)V2theoB329
Titre de la deuxième série (se sera toujours le même titre)Titre2B391 (pas toujours B391..)
Première valeur de la série mesuréeV1mesB424 (pas toujours
Dernière valeur de la série mesurée (324 cellules plus bas)V2mesB748

Voici les grandes étapes du code que je cherche à construire , jusqu'à présent je faisais cela à la main :

  1. Importer (ouvrir) le fichier .CSV et le convertir en colonnes
  2. Dans la colonne B, remplacer les "." par ","
  3. Chercher la valeur la plus proche de 5 dans la série de donnée théorique (V1theo). Cette première plage de valeurs est située sous "Gradient composition requested Line 1" (Titre1 en B2). Dans le fichier d'exemple, il s'agit donc de la cellule B35
  4. Sélectionner les 325 valeurs de la série théorique, à partir de la cellule B35 jusqu'à 324 cellules plus bas : donc de B35 à B329
  5. Copier ces valeurs et les coller en C21 de la feuille "Linear - Table" du fichier de calcul principal
  6. Sélectionner les 325 valeurs correspondantes de la série Mesurée. Cette deuxième plage est située sous "Gradient composition measured Line 1" (Titre2 en cellule B391, le texte sera toujours le même, mais ce ne sera pas toujours à la même ligne).
  7. Ici deux solution : regarder à quel moment à été enregistré V1theo dans la colonne A, ou bien regarder combien il y a de lignes d'écart entre V1theo et Titre1 car cet écart sera le même entre V1mes et Titre2. L'écart est à calculer à chaque fois car il n'est pas fixe.

Solution 1 : Dans le fichier exemple, le temps correspondant à B35 est donc indiqué en A35, soit : #2022-10-07 11:00:46#. Ainsi dans la deuxième série, ma valeur de départ correspondra aussi au même temps : la cellule B424. (ou bien en cherchant la valeur adjacente en B de la deuxième occurrence de "#2022-10-07 11:00:46#"

Solution 2 : En calculant l'écart du nombre de lignes : V1theo - Titre1= B35 - B2 = 35 - 2 = 33. V1mes sera donc 33 lignes en dessous de Titre2

Soit en recherchant avec ctrl+F "Gradient composition measuredLine 1", on remarque que Titre2 est en B391 Donc 391 + 33 = 424 : V1mes est donc en B424.

8. Sélectionner les 325 valeurs de la série mesurée, à partir de la cellule B424 jusqu'à 324 cellules plus bas : donc de B424 à B748

8. Copier ces valeurs et les coller en B21 de la feuille "Linear - Table" du fichier de calcul principal

J'ai réussi à trouver du bout de code pour les premiers points (dans le module 1), mais ce n'est pas trop fonctionnel et le reste je vous avoue que je sèche totalement.. Je n'ai pas trouvé sur le web des macro similaires..

Sub ImportText()
    Dim fileToOpen As Variant
    Dim fileFilterPattern As String
    Dim wsMaster As Worksheet
    Dim wbTextImport As Workbook
    Application.ScreenUpdating = False
    fileFilterPattern = "Text Files (*.txt; *.csv),*.txt;*.csv"
    fileToOpen = Application.GetOpenFilename(fileFilterPattern)
    If fileToOpen = False Then
        MsgBox "No file selected."
    Else
        Workbooks.OpenText _
            Filename:=fileToOpen, _
            StartRow:=2, _
            DataType:=xlDelimited, _
            Other:=True, _
        semicolon:=True
                Set wbTextImport = ActiveWorkbook
        Set wsMaster = ThisWorkbook.Worksheets("Débitmètre")
        wbTextImport.Worksheets(1).Range("B52").CurrentRegion.Copy wsMaster.Range("B52")
        wbTextImport.Close False
 End If
    Application.ScreenUpdating = True
End Sub

Merci d'avance pour votre aide et au plaisir d'échanger avec vous, et en espérant avoir été limpide.

Guillaume

Bonjour

Une proposition

Bonjour à tous !

Une approche via Power Query ?

Pour tester : Mettre à jour le chemin du fichier CSV (Feuille "Paramètre") puis "Actualiser tout".

Bonjour à vous deux!

Merci pour vos propositions. Cela fonctionne en effet pour le fichier CSV exemple, mais je suis surpris que la colonne D qui calcule la déviation soit impactée. En effet avant le RUN il y a le calcul =ABS(Ci-Bi) et après le run plus de calcul mais la valeur brute. Cela doit correspondre à la ligne de code :

tbMesures(i, 4) = Abs(tbMesures(i, 3) - tbMesures(i, 2))

qui n'est pas nécessaire ?

Enfin, je remarque je tu recherche la ligne la plus proche de 95%, mais ce n'est pas tout à faire la procédure. J'ai uniquement besoin de chercher la valeurs la plus proche de 5%, et de copier les 324 lignes suivantes. C'est important d'avoir en tout 325 valeurs précisément, à partir de 5%.

Ci joint un second fichier CSV, dont la forme est identique, juste les valeurs changent.

@JFL : Je ne comprends pas trop ce qu'est Power Query ? Est-ce déjà intégré à Excel ?

Bonjour à tous !

@JFL : Je ne comprends pas trop ce qu'est Power Query ? Est-ce déjà intégré à Excel ?

Power Query est un outil intégré nativement dans Excel depuis.....2016 !

Rapidement, cette fonctionnalité vous permet de lire un fichier (de très nombreux connecteurs sont présents), de transformer les données, de les enrichir afin de vous les restituer sous la forme d'une table, d'un TCD ou par intégration dans le modèle de données (Power Pivot).

Je ne peux que vous inviter à vous documenter sur "la chose".....

Bonjour

Je ne vois pas de fichier joint. La version modifiée avec la formule de calcul et la limitation à 325 lignes.

Bonjour, merci de ta réponse!

Ah oui, il ne s'était pas chargé. Merci! Le voici.

Je me suis permis de modifier la ligne 48 :

"=ABS([@[Real Theorical composition (%)]]-[@[Real Measured composition (%)]])"

Dans la formule initiale, le résultat n'était pas en valeur absolue, c'est le cas maintenant.

Donc quand j'essaie avec un autre fichier, (celui en PJ) la valeur tb1 est en B38 maintenant, mais j'ai une erreur d'exécution '13' - Incompatibilité de type et le débogage me renvoie à la ligne 38 :

   If Abs(5 - tb1(i, 2)) < dif Then 

Le plantage vient de ce que la forme des deux fichiers n'est pas identique. Dans l'un la ligne 1 est vide et pas dans l'autre. Il faudrait savoir si la structure est constante ou non.

Je me suis renseigné, la ligne 1 est toujours vide. Voici un troisième fichier CSV pour exemple.

Sans modification du code, j'ai quand même essayé l'importation d'un autre fichier CSV, en ayant pris soin de supprimer la première ligne vierge, mais cette fois ci j'ai l'erreur d'execution 9, sur la ligne 32 :

If tb1(i, 2) > 0 Then

Une version qui fonctionne avec fichier-exemple-csv-3.csv

Mais si la structure change tout le temps on ne va pas s'en sortir…

Un grand merci !

J'ai pu tester avec plusieurs fichiers csv c'est fonctionnel.

A présent je souhaite intégrer ce code dans mon classeur d'origine qui comporte d'autres feuilles de calcul. (Je les avais supprimées pour plus de clarté)

Je n'arrive pas à simplement copier/déplacer les feuilles provenant de ton fichier à cause du tableau..

J'ai compris que dans la feuille de résultats tu avais supprimé la ligne A20, pour créer le tableau tb_mesures en A19:D344. C'est ce que j'ai donc fait dans mon classeur d'origine, mais lorsque j'exécute le programme les données s'importent bien, mais il y a au soucis lors de l'écriture de la colonne D : erreur 1004

Range("tb_mesures[Deviation (%)]").FormulaR1C1 = _
        "=ABS([@[Real Theorical composition (%)]]-[@[Real Measured composition (%)]])"

Voici le fichier en question :

J'aurais peut-être dû fournir le fichier de base tout de suite...

Bonjour

Ca vient des noms de colonnes. J'ai supprimé les retours lignes dans les les noms.

Ok ça marche ! Ce n'était pas grand chose en effet. Merci! Prochaine étape : faire pareil mais pour une série de donnée en escalier au lieu de linéaire. Cette fois-ci qu'une seule série à importer car la théorie est constante. Je vais pouvoir me débrouiller seul grâce à toi !

7step-exemple.csv (46.48 Ko)

Bonjour, je me repenche sur le sujet.

Je cherche donc importer à présent à importer qu'une seule série de données mais en me basant sur la macro que tu m'a fourni j'ai du mal à comprendre comment cibler mes valeurs

J'ai tenté de faire quelque chose mais sans succès, je ne comprends pas comment fonctionne les variables pl, dl et les différentes boucles

Voici ce que doit faire la macro :

- sélectionner un fichier .csv délimité par des virgules

- a partir de la ligne "Hist.SCADA1.GRADRMEA1.F_CV,"Gradient composition measured Line 1",100,0" (ligne 222 sur le fichier csv d'exemple) : rechercher le dernier 0 avant la première valeur positive (ligne 225)

- copier à partir de ce 0 inclus, les 210 valeurs suivantes (211 valeurs en tout) dans dans mon fichier exemple de la ligne 225 à 435

- les coller dans le tableau "tb_mesures_step" (situé ici : ='Step - Data'!$B$2:$B$212)

Merci d'avance pour votre aide!

Rechercher des sujets similaires à "importer series donnees csv"