Fonction Application.GetOpenFilename [Résolu]

Signaler
Messages postés
34
Date d'inscription
mardi 4 février 2014
Statut
Membre
Dernière intervention
23 juin 2020
-
Messages postés
34
Date d'inscription
mardi 4 février 2014
Statut
Membre
Dernière intervention
23 juin 2020
-
Hello le groupe,

j'ai bâti le code ci-dessous en regardant des vidéos sur YouTube (oui suis pas doué..)
du coup le code fonctionne et tout va bien à une exception prêt.
J'ouvre un fichier csv et ce dernier s'ouvre sous Excel ce qui pose problème car les données sont mise ensemble et séparées par un séparateur "|" mais ont également des ";" et :" du coup, il faudrait que mon code ne l'ouvre pas avc Excel mais avec un éditeur de texte de type WordPad ou Bloc-notes.

Comment modifier mon code afin que quand il indique : Set MonClasseur = Application.Workbooks.Open(ListFile) il le fasse avec l'un des 2 types de fichier indiqués ci-dessus ?

Par avance merci pour votre aide

Option Explicit

Sub AutoImportDataTXT()
'déclaration des variables

    Dim ListFile As Variant
    Dim MonClasseur As Variant
    
'désactivation des alertes
    Application.ScreenUpdating = False
    Application.CutCopyMode = False
    
'filtrer pour ne voir que le type de fichier à séletionner
    
    ListFile = Application.GetOpenFilename(Title:="Sélectionner les données et importez les données", fileFilter:="Fichiers CSV(*.csv*),*xls*", ButtonText:="Cliquez")
    
'prévoir le cas du click bouton annuler en cas 'erreur

    If ListFile <> False Then
'on indique le fichier sélectionner
    Set MonClasseur = Application.Workbooks.Open(ListFile)
    
'copier les données
    MonClasseur.Sheets(1).Range("A1").CurrentRegion.Copy
    
'coller les données
    ThisWorkbook.Sheets("echantillon").Range("A1").PasteSpecial xlPasteValues
    
'fermer classeur source
     MonClasseur.Close
     
    

    End If


End Sub

3 réponses

Messages postés
11504
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juillet 2020
659
bonjour, si tu ne l'ouvres pas dans Excel, tu ne pourras pas en utiliser les données à partir de ton programme.
Messages postés
34
Date d'inscription
mardi 4 février 2014
Statut
Membre
Dernière intervention
23 juin 2020

Hello yg_be

merci pour ta réponse mais je ne comprends pas pourquoi je ne pourrais pas utiliser les données vu que je le fais manuellement et que cela fonctionne très bien.
Donc à mon avis on doit pouvoir l'automatiser.

Processus :

Selection fichier type csv
click droit
ouvrir avec
Seletionner notepad ou autre éditeur de texte
faire ctrl A + ctrl C
aller dans ma feuille Excel (là où j'ai mon code dans la bonne feuille en A1)
ctrl V

donc si cela fonctionne comme cela on doit pouvoir automatiser selon moi
Messages postés
11504
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juillet 2020
659 >
Messages postés
34
Date d'inscription
mardi 4 février 2014
Statut
Membre
Dernière intervention
23 juin 2020

as-tu déjà essayé de faire ce processus en VBA?
je te conseille de plutôt n'utiliser qu'Excel, peut-être en y travaillant un peu plus pour y transformer les données.
Messages postés
34
Date d'inscription
mardi 4 février 2014
Statut
Membre
Dernière intervention
23 juin 2020
>
Messages postés
11504
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juillet 2020

Hello,

en fait comme je l'ai dis, je ne peux pas avec Excel. Cela ne fonctionne pas la raison est simple. si j'ouvre mon csv en excel j'ai des colonnes scindés alors que je ne dois pas les avoir scindé. regarde les 2 images tu comprendras le problème.
Messages postés
11504
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juillet 2020
659 >
Messages postés
34
Date d'inscription
mardi 4 février 2014
Statut
Membre
Dernière intervention
23 juin 2020

tu n'as pas pu le faire avec Excel, cela ne signifie pas que ce n'est pas possible.
ceci t'aidera peut-être: https://docs.microsoft.com/fr-ch/office/vba/api/excel.workbooks.open
sinon, tu peux assez facilement, en VBA, manipuler et transformer les données.
Messages postés
6831
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
9 juillet 2020
532
Bonjour,

pour enregistrer un fichier csv dans un fichier txt:

Option Explicit
Sub traitement()
Dim Chemin_Fichier_CSV As String
Dim Chemin_Fichier_TXT As String
Dim Buffer
Chemin_Fichier_CSV = ThisWorkbook.Path & "\Customers.csv" 'adapter nom csv
Chemin_Fichier_TXT = ThisWorkbook.Path & "\essai.txt" 'adapter nom txt
Close
Open Chemin_Fichier_CSV For Input As #1
Open Chemin_Fichier_TXT For Output As #2
Do While Not EOF(1)
Line Input #1, Buffer
Print #2, Buffer
Loop
Close
End Sub



Messages postés
11504
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 juillet 2020
659
pourquoi ne pas recopier le fichier sous un autre nom?
Messages postés
6831
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
9 juillet 2020
532
les données sont mise ensemble et séparées par un séparateur "|" mais ont également des ";"

il faut donc remplacer les ; par |

voici un code qui enregistre le csv en texte en mettant le tabulateur |. Ensuite il importe le fichier texte dans un classeur Excel:

Option Explicit
'enregistrer csv dans fichier texte avec tabulateur |
Sub traitement()
Dim Chemin_Fichier_CSV As String
Dim Chemin_Fichier_TXT As String
Dim Buffer, str As String
Chemin_Fichier_CSV = ThisWorkbook.Path & "\Customers.csv" 'adapter nom csv
Chemin_Fichier_TXT = ThisWorkbook.Path & "\essai.txt" 'adapter nom txt
Close
Open Chemin_Fichier_CSV For Input As #1
Open Chemin_Fichier_TXT For Output As #2
Do While Not EOF(1)
Line Input #1, Buffer
Print #2, Replace(Buffer, ";", "|") 'remplace ; en |
Loop
Close
importer 'importer fichier texte
End Sub
'importer fichier texte tabulateur |
Sub importer()
 With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & ThisWorkbook.Path & "\essai.txt", Destination:=Range("$A$1"))
        .Name = "essai"
        .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
        .TextFileOtherDelimiter = "|"
        .TextFileColumnDataTypes = Array(1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub


la macro importer est faite avec l'enregistreur de macro, comme le t'a suggéré notre ami pijaku que je salue au passage

ce code nécessite que les 2 fichiers csv et txt soient dans le même dossier que le classeur contenant la macro

@+ Le Pivert
Messages postés
34
Date d'inscription
mardi 4 février 2014
Statut
Membre
Dernière intervention
23 juin 2020
>
Messages postés
6831
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
9 juillet 2020

Hello
merci pour l'astuce. Le problème est que je ne peux pas remplacer les ; par autre chose car dans mon fichier ce n'est pas un séparateur mais partie intégrante d'une donnée. A savoir les heures qui sont comme suit : 07:05;32 pour séparer minutes et secondes.
Du coup, si je le fais en manuel, que j'ouvre le fichier csv avec notpad par exemple, que je fais ensuite un sélection tout et copier. Puis que j'ouvre un classeur Excel et que je colle c'est bon.

Mon problème dans le cas précis, c'est que ma macro du haut m'ouvre explorer pour me permettre de sélectionner le fichier duquel je veux tout copier et coller dans mon tool.

Du coup le besoin serait qu'elle fasse la même chose, mais en ouvrant le csv avec un éditeur de texte pour solutionner le problème
Messages postés
6831
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
9 juillet 2020
532 >
Messages postés
34
Date d'inscription
mardi 4 février 2014
Statut
Membre
Dernière intervention
23 juin 2020

je te propose de mettre ton csv dans un fichier texte et d'ouvrir ce même fichier texte:

Sub AutoImportDataTXT()
'déclaration des variables
 Dim ListFile As Variant
 Dim Chemin_Fichier_CSV As String
Dim Chemin_Fichier_TXT As String
Dim MonApplication As Object
Dim Buffer
    'filtrer pour ne voir que le type de fichier à séletionner
     ListFile = Application.GetOpenFilename(Title:="Sélectionner les données et importez les données", fileFilter:="Fichiers CSV(*.csv*),*xls*", ButtonText:="Cliquez")
    'prévoir le cas du click bouton annuler en cas 'erreur
   If ListFile <> False Then
 Chemin_Fichier_CSV = ListFile
    Chemin_Fichier_TXT = Replace(ListFile, "csv", "txt")
Close
Open Chemin_Fichier_CSV For Input As #1
Open Chemin_Fichier_TXT For Output As #2
Do While Not EOF(1)
Line Input #1, Buffer
Print #2, Buffer
Loop
Close
End If
   Set MonApplication = CreateObject("Shell.Application")
   MonApplication.Open (Chemin_Fichier_TXT)
   Set MonApplication = Nothing
End Sub


Tu n'as plus qu'a faire ton copier-coller

Voilà,
@+ Le Pivert
Messages postés
34
Date d'inscription
mardi 4 février 2014
Statut
Membre
Dernière intervention
23 juin 2020
>
Messages postés
6831
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
9 juillet 2020

Un Grand merci Le Pivert,

c'est magique et j'arrive à faire ce que je dois :-)
Messages postés
12177
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
26 juin 2020
2 449
Bonjour,

Avec ton code initial, si tu traites les données une fois importées avec Données/Convertir, parviens tu au résultat attendu?
Si oui, l'enregistreur de macro te sauvera...