Excel / Visual Basic / Création et transfert d'informations

Résolu
SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention   -  
SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour tout le monde,
Avant tout quelques explications :

Je dois ouvrir un Excel qui a des données sous format CSV,
une fois ce fichier ouvert, je dois récupérer certaines données de ce fichier et remplir un deuxième fichier avec ces données(fichier sous format Excel compatibilité 97-2003).

Comme je ne m'y connais pas encore trop dans le Excel/Visual Basic, j'ai quelques questions à vous poser !

Bon déjà je sais comment générer un fichier Excel près rempli en Visual Basic, il y a quelques tutos pour ça, ce que j'aimerais savoir c'est comment faire pour choisir le fichier que l'on veux ouvrir (celui sous format CSV) et sélectionner les quelques informations utiles à retranscrire dans le fichier généré sous format Excel (compatibilité 97-2003).

Merci d'avance aux personnes qui répondront à ce post et n'hésitez pas à me demander plus de détails si besoin !

Ah oui, et aussi savoir s'il y a forcément besoin de passer par le visual Basic pour faire ce genre de manipulation ?

Merci !

4 réponses

Résumé de la discussion

L'objectif décrit consiste à ouvrir un fichier CSV dans Excel, en extraire certaines données et les transférer vers un second classeur Excel compatible 97-2003, tout en explorant l'usage éventuel de Visual Basic. Plusieurs réponses proposent d'utiliser une boîte de dialogue pour sélectionner le CSV et un sous-programme d'importation (Import_Fichier_rapport) avec QueryTables.Add, puis de mapper les colonnes vers les cibles. Des échanges notent que l'en-tête peut disparaître lors de l'import et proposent des solutions pour le préserver ou le recréer, ainsi que des alternatives sans Visual Basic et des ajustements de script.

Bobot (l'IA à votre service)
  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    'code a affecter a un bouton sur une feuille
    Sub Choix_Fichier_CSV()
        Dim CheminFichier As Variant
        Const Fichier As String = "Fichier CSV (*.csv), *.csv"
        Const Ext As String = "csv"
        
        'Choisir le fichier source
        CheminFichier = Application.GetOpenFilename(Fichier)
        'test pas de fichier selectionne
        If Right(SCheminFichier, 3) <> Ext Then
            MsgBox "Vous n'avez pas choisi de fichier csv !! Bye ..."
            Exit Sub
        Else
            'importer le fichier choisi
            Import_Fichier_rapport (CheminFichier)
        End If
    End Sub
    
    'code modife en partant d'un import donnees externes avec l'enregistreur de macro
    'vous deverez adapter cette ligne
    '.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
    'en fonction du nombre de colonnes du fichier csv. 
    'Le mieux serait de faire avec l'enregistreur de macro l'import de votre fichier
    Sub Import_Fichier_rapport(Fichier)
        'nom de feuille a adapter
        Worksheets("Data_TXT").Activate
        Worksheets("Data_TXT").Cells.ClearContents
        With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & Fichier, Destination:=Range("$A$1"))
            '.CommandType = 0
            '.Name = "498 499 23°C yaw pitch"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 1252
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
    End Sub


    Ensuite nous verrons pour la collecte des donnees

    A+
    1
    1. SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention   17
       
      Tout d'abord merci pour ta réponse !

      Pour l'instant j'ai fait la création du bouton et j'ai compris la première partie du code :

      Sub Choix_Fichier_CSV()
      Dim CheminFichier As Variant
      Const Fichier As String = "Fichier CSV (*.csv), *.csv"
      Const Ext As String = "csv"

      'Choisir le fichier source
      CheminFichier = Application.GetOpenFilename(Fichier)
      'test pas de fichier selectionne
      If Right(SCheminFichier, 3) <> Ext Then
      MsgBox "Vous n'avez pas choisi de fichier csv !! Bye ..."
      Exit Sub
      Else
      'importer le fichier choisi
      Import_Fichier_rapport (CheminFichier)
      End If
      End Sub


      Mais j'ai un petit problème qui apparait, il passe toujours dans le IF même si je sélectionne un fichier CSV.

      Tu as une petite idée du problème ? Merci beaucoup !
      0
    2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention  
       
      Re,
      remplacez cette ligne
      Const Ext As String = "csv"

      par
      Const Ext As String = "CSV"

      et
      remplacez cette ligne:
      If Right(SCheminFichier, 3) <> Ext Then

      par
      If UCASE(Right(SCheminFichier, 3)) <> Ext Then


      A+
      0
    3. SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention   17 > f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention  
       
      J'ai apporter la modification mais j'avais toujours le problème !
      Je vient de l'identifier : CheminFichier
      CheminFichier = Application.GetOpenFilename(Fichier)

      If Right(SCheminFichier, 3) <> Ext Then

      Dans le IF CheminFichier avait un "S" devant.

      Maintenant tout fonctionne !

      Je passe donc a la deuxième partie du codage.

      Pour l'instant je n'ai fait que un copié coller est j'essaie de comprendre,
      j'ai une erreur a cette endroit la :

      Worksheets("Data_TXT").Activate
      Worksheets("Data_TXT").Cells.ClearContents

      Tu indiques que "le nom est a adapter", je doit donner un nous au fichier qui va être créé ici (à l'endroit ou il y à Data_TXT) c'est bien sa ?

      En tout cas je l'est nommé "test_integration" et la lors de l'exécution j'ai une erreur qui me dit que l'indice n'appartient pas a la sélection. (erreur d'exécution "9").

      D'où vient l'erreur et est ce que j'ai bien compris le fonctionnement ?
      Merci d'avance pour ta réponse et bonne journée.
      0
    4. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention  
       
      Re,

      Pour le "S" en trop, ma faute suite a modif.

      L'import fichier doit ce faire dans un onglet du nom que vous aurez choisi et vous devez mettre ce nom a la place de Data_TXT dans les deux lignes de programme.

      Pour avoir le bon nombre de colonne importee, selectionnez l'onglet d'import, ensuite vous devez aller dans menu developpeur, enregistrer une macro, ok, menu donnees, donnees externes, fichier txt, choix du fichier (ici un csv) et suivre les indications de choix

      A+
      0
    5. SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention   17
       
      Re,

      D'accord, j'ai compris et sa fonctionne.
      Maintenant je doit trier les différentes informations pour pouvoir placer l'email dans la colonne email, pareil pour nom, prénom, etc...
      0
  2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    fichier excel xls et fichier csv pour demo, les cellules copiees sont dans les colonnes texte en rouge, adaptez a votre besoin

    https://www.cjoint.com/c/EIEmm6dyrqf
    1
    1. SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention   17
       
      Re,

      Jusque la tout va bien c'est niquel,

      Une dernière petite question,
      Si j'ai plusieurs lignes dans le fichier CSV, quelle partie du code je doit modifier pour que le tableau créé plus de ligne ?

      Merci !
      0
    2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention  
       
      Re,

      Vous avez ecrit ceci:

      Ce fichier doit contenir les 4 informations utiles du fichier CSV

      Vous ne precisez pas qu'il y a plusieurs lignes a balayer !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

      Expliquez plus precisement, pourtant simple, non ?
      0
    3. SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention   17
       
      Re,

      Veuillez m'excuser,

      Oui effectivement il peut y avoir plusieurs lignes à balayer en fonction du nombre d'utilisateurs qui soient modifie leur profil ou créé un profil.

      Plus il y a de personnes qui modifie ou créés un profil, plus il y a de lignes à balayer sur le fichier CSV et donc plus il y aura de lignes sur le fichier Excel.
      0
    4. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention  
       
      Re,

      code precedent Sub Traitement() a remplacer:

      Sub Traitement()
          With Worksheets("feuil1")
              'raz cellules
              derlig = .Range("A" & Rows.Count).End(xlUp).Row
              .Range("E2,H2,I2,L2,O2,P2").ClearContents
              .Range("E2:E" & derlig).ClearContents
              .Range("H2:H" & derlig).ClearContents
              .Range("I2:I" & derlig).ClearContents
              .Range("L2:L" & derlig).ClearContents
              .Range("O2:O" & derlig).ClearContents
              .Range("P2:P" & derlig).ClearContents
              'ecriture Infos
              derlig = Worksheets("Import_CSV").Range("A" & Rows.Count).End(xlUp).Row
              Worksheets("Import_CSV").Range("E2:E" & derlig).Copy .Range("E2:E" & derlig)
              Worksheets("Import_CSV").Range("H2:H" & derlig).Copy .Range("H2:H" & derlig)
              Worksheets("Import_CSV").Range("I2:I" & derlig).Copy .Range("I2:I" & derlig)
              Worksheets("Import_CSV").Range("L2:L" & derlig).Copy .Range("L2:L" & derlig)
              Worksheets("Import_CSV").Range("O2:O" & derlig).Copy .Range("O2:O" & derlig)
              Worksheets("Import_CSV").Range("P2:P" & derlig).Copy .Range("P2:P" & derlig)
          End With
      End Sub
      0
    5. SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention   17 > f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention  
       
      Re,

      Merci sa fonctionne,
      Donc si j'ai bien compris actuellement on utilise quelques informations du fichier CSV et on les utilises au endroit défini dans le Excel.

      Et ce que en balayant le fichier CSV on ne pourrait pas connaitre le nombre de ligne a ajouter dans le fichier Excel et donc générer automatiquement les lignes qui contiendrons toujours les mêmes valeurs (les valeurs par défaut qui ne changent pas lors du traitement du fichier CSV) ?
      0
  3. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    sub Traitement a remplacer. Je me repete, deux fois copie de colonne D normal ou pas et infos fixe J : 1,98001E+11-----> Z'etes sur

    Sub Traitement()
        With Worksheets("feuil1")
            'raz cellules
            derlig = .Range("A" & Rows.Count).End(xlUp).Row
            .Range("A2:P" & derlig).ClearContents
            'ecriture Infos automatiques
            derlig = Worksheets("Import_CSV").Range("A" & Rows.Count).End(xlUp).Row
            Worksheets("Import_CSV").Range("A2:A" & derlig).Copy .Range("E2:E" & derlig)
            Worksheets("Import_CSV").Range("B2:B" & derlig).Copy .Range("H2:H" & derlig)
            Worksheets("Import_CSV").Range("C2:C" & derlig).Copy .Range("I2:I" & derlig)
            Worksheets("Import_CSV").Range("D2:D" & derlig).Copy .Range("L2:L" & derlig)
            Worksheets("Import_CSV").Range("D2:D" & derlig).Copy .Range("P2:P" & derlig)
            'ecriture Infos fixes
            'A:  R1W5R1W5
            .Range("A2:A" & derlig) = "R1W5R1W5"
            'B:  TV
            .Range("B2:B" & derlig) = "TV"
            'C:  R1W5R1W5
            .Range("C2:C" & derlig) = "R1W5R1W5"
            'D:  N
            .Range("D2:D" & derlig) = "N"
            'F:  UJF2015
            .Range("F2:F" & derlig) = "UJF2015"
            'G:  UJF2015
            .Range("G2:G" & derlig) = "UJF2015"
            'J : 1,98001E+11
            .Range("J2:J" & derlig) = "1,98001E+11"
            'K : 10101010101
            .Range("K2:K" & derlig) = "10101010101"
            'M:  FR
            .Range("M2:M" & derlig) = "FR"
            'N:  EUR
            .Range("N2:N" & derlig) = "EUR"
            'O:  structure UJF
            .Range("O2:O" & derlig) = "structure UJF"
        End With
    End Sub
    1
    1. SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention   17
       
      Re,

      Oui c'est bien ça ! sa fonctionne niquel !
      Juste que mon entête du Excel disparait toujours après l'importation.

      Je vais essayer de la coder en dur grâce a l'exemple présent dans le codage, je te tiens au courant !
      0
      1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention  
         
        Re,

        a quelle ligne vous mettez vos entetes ??????????????????
        0
    2. SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention   17
       
      Re,

      C'est bon les entêtes fonctionne, c'était du a un problème avec mon fichier CSV !

      Dernière chose,
      dans le fichier CSV j'ai une case qui indique si la personne a modifier son profil, en a créé un ou n'a pas effectué de modification.
      Seul les personnes ayant créé un profil m'intéresse et doivent figurer dans le fichier Excel, est-ce qu'il est possible de créé un genre de filtre pour faire cela ?

      La colonne contenant ces information dans le fichier CSV est la "F" et les différentes informations sont : "no_change","create","update".
      Je ne doit garder que les create sans afficher cette information dans le fichier Excel.
      0
      1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention  
         
        Re,

        Je ne doit garder que les create Ah bon!!
        Vous avez de la chance que ca ne casse pas trop le travail fait depuis le debut. C'est tout, pas d'autre(s) plaisanterie(s) ??
        0
  4. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    code modifie:

    Sub Traitement()
        With Worksheets("feuil1")
            'raz cellules
            derlig = .Range("A" & Rows.Count).End(xlUp).Row
            .Range("A2:P" & derlig).ClearContents
            'ecriture Infos automatiques
            derlig = Worksheets("Import_CSV").Range("A" & Rows.Count).End(xlUp).Row
            Worksheets("Import_CSV").Range("A2:A" & derlig).Copy .Range("E2:E" & derlig)
            Worksheets("Import_CSV").Range("B2:B" & derlig).Copy .Range("H2:H" & derlig)
            Worksheets("Import_CSV").Range("C2:C" & derlig).Copy .Range("I2:I" & derlig)
            Worksheets("Import_CSV").Range("D2:D" & derlig).Copy .Range("L2:L" & derlig)
            Worksheets("Import_CSV").Range("D2:D" & derlig).Copy .Range("P2:P" & derlig)
            Worksheets("Import_CSV").Range("F2:F" & derlig).Copy .Range("A2:A" & derlig)
            'suppression lignes <> "create"
            For x = derlig To 2 Step -1
                If .Range("A" & x) <> "create" Then
                    .Rows(x).Delete
                End If
            Next x
            'ecriture Infos fixes
            derlig = .Range("A" & Rows.Count).End(xlUp).Row
            'A:  R1W5R1W5
            .Range("A2:A" & derlig) = "R1W5R1W5"
            'B:  TV
            .Range("B2:B" & derlig) = "TV"
            'C:  R1W5R1W5
            .Range("C2:C" & derlig) = "R1W5R1W5"
            'D:  N
            .Range("D2:D" & derlig) = "N"
            'F:  UJF2015
            .Range("F2:F" & derlig) = "UJF2015"
            'G:  UJF2015
            .Range("G2:G" & derlig) = "UJF2015"
            'J : 1,98001E+11
            .Range("J2:J" & derlig) = "1,98001E+11"
            'K : 10101010101
            .Range("K2:K" & derlig) = "10101010101"
            'M:  FR
            .Range("M2:M" & derlig) = "FR"
            'N:  EUR
            .Range("N2:N" & derlig) = "EUR"
            'O:  structure UJF
            .Range("O2:O" & derlig) = "structure UJF"
        End With
    End Sub
    
    1
    1. SliDeeNz Messages postés 225 Date d'inscription   Statut Membre Dernière intervention   17
       
      Re,

      Non tout fonctionne bien,
      Merci !
      0