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

Résolu/Fermé
SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016 - Modifié par SliDeeNz le 28/09/2015 à 12:50
SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016 - 1 oct. 2015 à 16:54
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 !
A voir également:

4 réponses

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
Modifié par f894009 le 29/09/2015 à 11:59
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
SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016 17
29 sept. 2015 à 12:33
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016
29 sept. 2015 à 12:58
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
SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016 17 > f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024
29 sept. 2015 à 13:50
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016
29 sept. 2015 à 14:01
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
SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016 17
Modifié par SliDeeNz le 29/09/2015 à 15:07
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
30 sept. 2015 à 14:14
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
SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016 17
30 sept. 2015 à 15:18
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016
30 sept. 2015 à 15:25
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
SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016 17
30 sept. 2015 à 15:47
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016
Modifié par f894009 le 30/09/2015 à 15:53
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
SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016 17 > f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024
30 sept. 2015 à 16:20
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
1 oct. 2015 à 14:12
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
SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016 17
1 oct. 2015 à 15:54
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016
1 oct. 2015 à 15:55
Re,

a quelle ligne vous mettez vos entetes ??????????????????
0
SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016 17
1 oct. 2015 à 16:12
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016
1 oct. 2015 à 16:23
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
1 oct. 2015 à 16:37
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
SliDeeNz Messages postés 223 Date d'inscription lundi 28 septembre 2015 Statut Membre Dernière intervention 4 avril 2016 17
1 oct. 2015 à 16:54
Re,

Non tout fonctionne bien,
Merci !
0