Mise à jour de données, grace à fichier csv

Bonjour,

J'ai une question à propos de la mise à jour d'un fichier. Le programme sur lequel je travaille permet à un utilisateur d'ouvrir un ou plusieurs fichiers csv dans un même fichier Excel, sur des feuilles différentes. Certains des fichiers csv sont amenés à évoluer (s'agrandir) et à l'heure actuelle, si l'utilisateur veut mettre à jour le fichier, il doit repartir du fichier de base ou supprimer les données récupérées et rouvrir les dossiers correspondants.

Je voulais savoir s'il était possible de faire une macro de " mise à jour" ou s'il faut se contenter d'une procédure qui va refermer l'onglet déjà ouvert puis en créer un nouveau ?

Je dis ça parceque je suis en train de travailler sur la seconde partie synthèse, qui récupère les 4 dernières colonnes de chaque onglet, que je récupérais juste après l'ouverture du fichier et le copier/coller des informations du fichier sur le nouvel onglet (avant de refermer le fichier csv qui a fournit les données). Je suis en train de chercher un moyen de vérifier si l'onglet est ouvert (donc que la feuille Synthèse est remplie) qu'il puisse retrouver un groupe d'information pour qu'il sache quel groupe de colonnes il doit renseigner sur la dite feuille Synthèse.

Le programme étant loin d'être fini, j'ai des macros séparées comme par exemple la RAZ de la feuille synthèse que j'ai rapidement enregistré à côté.

Si vous voyez des abberations (ou des points à améliorer) dans le fonctionnement du code n'hésitez pas à le signaler.

Je vous remercie pour prendre la peine d'y jeter un oeil (métaphoriquement parlant hein ^^)

18sytelv9forum.xlsm (58.54 Ko)

Bonjour,

présentation pas très claire, reformuler clairement le besoin …

Quelle est la pertinence des fichiers csv joints ? (ils ont l'air identiques ‼) …

Bonjour Marc L,

Ils ont l'air identiques parceque ce sont généralement différentes séries d'éléments (modèles ou fournisseurs) qui sont testés (soit différents modèles/fournisseurs avec les mêmes conditions : pression, température,..., soit le même modèle mais à des conditions différentes), donc les résultats ne sont généralement pas différents de manière flagrante sauf si un des éléments (ou plusieurs) atteint ses limites et claque, auquel cas tu va avoir une grosse différence sur ta courbe à la fin.

L'intéret d'ouvrir plusieurs fichiers est d'avoir dans la feuille Synthèse les valeurs importantes pour l'étude et le résultat "brut" du test sur une feuille à côté (avec tous les éléments dans le détail et pas simplement le Min, Max, Moyenne).

Le programme fonctionne à l'aide des 2 boutons sur la feuille carton (C'est le premier qui est intéressant sur ce problème).

-Insérer : permet à l'utilisateur de choisir parmis ses fichiers, un ou plusieurs dossiers d'un même test (tous sauvegardés dans le même dossier) et de récupérer les informations qu'ils contient (nent) pour les placer sur les feuilles du classeur contenant le carton et la synthèse.

Les données sont mises en forme et la macro récupère les 3 dernières colonnes (Min,Max,Moy) de chaque série (donc de chaque feuilles crées (par fichier ouvert)

-Mise en forme : le nom est pas très révélateur, c'est plutôt une fonction de recherche/tri qui permettent à l'utilisateur de trouver les lignes qui l'intéressent (oui le filtre éxiste, mais on m'a demandé de faire comme ça, certains ont la tête dur et ont leurs vieilles habitudes ^^)

J'essaie de voir si c'est possible, car je patauge depuis un moment pour essayer de vérifier si un onglet porte déjà le nom du fichier ouvert (je donne le nom du fichier sur lequel on prélève des données au nouvel onglet, si celui-ci éxiste le fichier plante quand il faut donner le nom à l'onglet), ça m'est arrivé de perdre des heures à chercher pourquoi un code qui fonctionnait normalement 5 minutes auparavant, plantais à l'importation d'un fichier.

J'en ai déduit que si je pouvais savoir quand un onglet porte déjà ce nom, et surtout comment le mettre à jour, j'éviterais des pétages de plomb et surtout je serais proche de la fin du programme, car je serais débarassé d'un bug récurrent

Voir par exemple ce sujet pour vérifier l'existence d'une feuille de calculs …

Bonjour Marc L,

J'ai une ou deux question,

je suis en train de regarder pour comprendre le code. On fait une évaluation par rapport à une cellule de la feuille comparée ?

J'ai l'habitude de déclarer les variables avec des parenthèses vides ex :

Sub Chaussettes()

, je n'ai plus aucun souvenir sur l'intéret de déclaré ta variable au même moment que la fonction et ce que cela change dans le code.

Function ExistWorkSheet(FEUILLE$) As Boolean
         ExistWorkSheet = Evaluate("ISREF('" & FEUILLE & "'!A1)")
End Function

Merci de m'aider sur ce problème.

Sub n'est pas une variable !

La fonction de feuille de calculs ESTREF permet aussi de vérifier l'existence d'une feuille de calculs.

Pour vérifier directement comme pourtant expliqué dans le lien si l'onglet "Feuil4" existe par exemple :

Evaluate("ISREF('Feuil4'!A1)")

Une fonction * pardon, je pensais déjà à la phrase suivante.

La difficulté est que je ne connais pas le nom à l'avance du fichier et des feuilles qu'il y aura sur le programme. J'ai essayé en récupérant ce nom dans une variable et en comparant aux onglets déjà ouvert (système de boucle mais pas moyen de le faire fonctionner

J'avais essayé de reprendre un code que j'avais fait pour achdeii, cela fontionne mais on connaissait le nom des onglets crées, c'était tout de suite beaucoup plus simple (il fallait créer un onglet pour chaque ligne du tableau de la première feuille) :

For i = 2 To lastRow
c = 0
        For j = 1 To Worksheets.Count
        Existant = "Onglet" & i
        If Worksheets(j).Name = Existant Then
        c = 1
        Else
        End If
        Next j

Il suffisait de dire que si c passait à 1 (donc que l'onglet éxistait déjà, on passait à la ligne suivante) sinon on placait un nouvel onglet nommé Onglet et N° de la ligne

Avec ma fonction ExistWorksheet, pas de souci pour vérifier si le nom d'un classeur correspond au nom d'une feuille !

Sinon dans le lien, il y a une autre manière entre autres de le vérifier dans le message précédent …


Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)

Théoriquement si je part du code :

Function ExistWorkSheet(FEUILLE$) As Boolean

ExistWorkSheet = Evaluate("ISREF('" & FEUILLE & "'!A1)")

End Function

il faut que je reformule dans ce style :

Evaluate("ISREF(Variable & "!A1)") ou le "!A1" n'est plus de mise, vu que ce n'est plus une chaine de caractères, mais une variable. Il faut donc que je place ExistWorkSheet(Variable) As Boolean ? (Les fichiers que j'utilise portent ce genre de nom : 14_849_test_S02)

Je sens déjà Excel qui trépigne d'impatience pour m'insulter en Suédois ^^

Il n'y a rien à adapter : cela fait des années que je l'utilise tel quel comme déjà indiqué dans le sujet en lien !

Ma fonction a juste besoin du nom à tester en paramètre …

Sinon voir dans le lien une des autres manières dans le message précédant ma fonction.

J'essaie de l'incorporer dans mon code, si je me contente d'appeller la fonction (avec fonction déclarée dans un module) :

ExistWorkSheet

j'ai un message

Erreur de compilation

Argument non Facultatif

Si je ne prélève que la partie "code" :

ExistWorkSheet = Evaluate("ISREF('" & FEUILLE & "'!A1)")

Erreur de compilation

Un appel de fonction dans la partie gauche de l'affectation doit revoyer Variant ou Object

Ce qui est normal

Je reprendrais après manger.

Une dernière fois : N E R I E N M O D I F I E R ‼

Juste (comme dans le film sur le diner !) copier la fonction telle quelle

puis dans le code l'appeler en lui passant en paramètre entre parenthèses le nom à vérifier …

Consulter l'aide VBA de l'instruction Function et son exemple ne serait pas du luxe !

Lorsque la variable renvoie "False" (onglet non existant), cela fonctionne, lorsqu'elle renvoie "True" (onglet existant), le code passe en erreur ... Mmmmm ça être Boolean, ça renvoyer 2 valeurs seulement (True or False) "So why is it not working, I don't get it !"

Cela ne marchait pas même lorsque je lui disait juste de mettre un message signalant que l'onglet éxistait déjà.

Public c As Integer, NbrElements As Integer
Public Sub CopierCollerConvertir()
Dim WbCible$, Arr As Variant

c = 0
Arr = Application.GetOpenFilename("Text Files (*.csv), *.csv", , , , True)
WbC = ThisWorkbook.Name
Sheets("Synthese").Cells.Clear

   On Error GoTo GESTERR
   If VarType(Arr) > 100 Then
   'On récupère le chemin pour enregistrer le classeur dans le même fichier à la fin (s'il y a lieu)
   'MyPath = ActiveWorkbook.Path & Application.PathSeparator
   Application.ScreenUpdating = False
   Application.DisplayAlerts = False

   'ubound determine le nombre de fichiers sélectionnés
   For i = 1 To UBound(Arr)
      'Ouvre les fichiers au fur et à mesure
      Workbooks.Open Arr(i)
      RechNum
      'On met le nom du fichier dans une variable
      myFile = ActiveWorkbook.Name

          'ExistWorkSheet (myFile)
      Workbooks(WbC).Activate
      If ExistWorkSheet(myFile) = False Then
      'ouverture du classeur Test
      Workbooks(WbC).Sheets.Add.Name = myFile
      MaFeuille = ActiveSheet.Name
      'Copier/coller le contenu
      Workbooks(myFile).Worksheets(1).Range("A1:J500").Copy Workbooks(WbC).Worksheets(myFile).Range("A1")
      'ActiveSheet.Name = myFile
      'Fermeture du classeur .csv
      Workbooks(myFile).Close
      'Convertis le contenu
      '(Excel regroupe tout dans la colonne A,il faut donc lui redonner sa forme d'origine)
      Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
      TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
      Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
      :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
      Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1)), TrailingMinusNumbers:=True

      MiseEnForme

    ElseIf ExistWorkSheet(myFile) = True Then
    Workbooks(WbC).Sheets(myFile).Select
      MaFeuille = ActiveSheet.Name
      'Copier/coller le contenu
      Workbooks(myFile).Worksheets(1).Range("A1:J500").Copy Workbooks(WbC).Worksheets(myFile).Range("A1")
      'ActiveSheet.Name = myFile
      'Fermeture du classeur .csv
      Workbooks(myFile).Close
      'Convertis le contenu
      '(Excel regroupe tout dans la colonne A,il faut donc lui redonner sa forme d'origine)
      Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
      TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
      Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
      :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
      Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1)), TrailingMinusNumbers:=True

      MiseEnForme
    End If
   Next i
   End If

MEFsynthese
Exit Sub
GESTERR:
   MsgBox "Non valide"
End Sub

Ma fonction cherche dans le classeur actif mais apparemment comme tu ouvres entre temps un autre classeur,

ce n'est plus dans le classeur actif qu'il faut chercher, juste une question de logique de conception …

Voici une fonction cherchant une feuille dans un classeur (fonctionnant elle-aussi depuis des années, etc …) :

Function ExistWorkbookSheet(CLASSEUR, FEUILLE) As Boolean
                          V = Evaluate("ISREF('[" & CLASSEUR & "]" & FEUILLE & "'!A1)")
         ExistWorkbookSheet = IIf(IsError(V), False, V)
End Function

Bon du coup j'ai réussi à en venir à bout, ça se jouait à une ligne qui faisait chier (comme toujours ^^).

Résultat si l'onglet éxiste il le vide et copie le nouveau contenu par dessus.

Merci d'être resté calme jusqu'au bout ^^ et bonne aprem

Rechercher des sujets similaires à "mise jour donnees fichier csv"