Récupèrer données d'un autre classeur

Bonjour

J'ai un fichier Excel qui se nomme : "TEST1" avec 4 onglets.

J'ai un autre fichier Excel qui se nomme : "Data", qui lui à des données.

Je voudrais créer un nouvel onglet : "machine" dans le fichier : TEST1, et pouvoir récupérer les données venant du fichier "Data".

Est ce possible avec vba ?

Bonjour

Soit copier coller avec liaison, soit, nettement mieux, lien par PowerQuery intégré à Excel

Merci

alors j'ai fait cela, ca fonctionne presque :

Sub Macro2()

Dim chemin_Data As String

chemin_Data = "C:\Users\maintenance\Desktop\ExportTransactions_20201201_20210101.csv"
Application.Workbooks.Open (chemin_Data)
Cells.Select
Selection.Copy

Windows("Statistiques.xlsm").Activate
Sheets.Add After:=ActiveSheet
Range("A1").Select
ActiveSheet.Paste
End Sub

le soucis est que mon fichier à copié est au format CSV, et quand il est copié dans l'autre fichier cela ne va pas du tout. ??

il faudrait qu'il soit reconvertit au format xls avant, et là je bloque.

Bonjour,

Qu'entends-tu par cela ne vas pas du tout ? Colle les uniquement en valeur (pastespecial paste:=xlpastevalues) pour respecter le format de destination ?

Bonne soirée.

RE

J'ai un fichier Excel qui se nomme : "TEST1" avec 4 onglets.

J'ai un autre fichier Excel qui se nomme : "Data", qui lui à des données.

le soucis est que mon fichier à copié est au format CSV

Excel ou CSV ? Pas clair

CSV encore plus conseillé d'utiliser PowerQuery...

Bonjour

Voici mon code :

Sub Macro2()

Dim chemin_Data As String

chemin_Data = "C:\Users\maintenance_voirie\Desktop\Oullins\ExportTransactions_Oullins_20201201_20210101.csv"
Application.Workbooks.Open (chemin_Data)
Cells.Select
Selection.Copy

Windows("Statistiques.xlsm").Activate
Sheets.Add After:=ActiveSheet
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

End Sub

Voici un exemple du fichier source à copier *.csv :

capture

Voici une fois application du code, le fichier obtenu ? :

capture

Bonjour,

Comme l'a suggéré 78chris, passez plutôt par une requête POWERQUERY pour importer vos données c'est plus propre. Vous pouvez alors en profiter pour transformer les données à foisons avant l'import (filtrage, suppression de colonne, extraction, formats, etc ...) ce qui allège l'import.

2021 03 02 13 10 59

Cdlt,

Merci

Je vais regarder powerquery

Par contre, pourquoi cela fct bien quand je fais un simple copier/coller (manuel) de Csv à mon autre fichier ?

Bonjour

Quand tu ouvres manuellement un CSV, Excel opère une transformation, souvent mauvaise car basée sur la nome US : dates souvent à l'envers, séparateur décimal erroné...

Si tu veux reproduire la même chose par code il faut lui passer des paramètres pour une interprétation correcte

Mais depuis 10 ans on a PowerQuery (en add depuis la version 2010 et intégré depuis la 2016) qui fait cela bien mieux...

Le problème c’est que les personnes qui vont utiliser la petite application par la suite ne connaissent rien à Excel ils veulent juste appuyer sur un bouton c’est pour cela que Power query ne leur sera peut-être pas adapté

Bonjour,

Si la requête existe déjà il suffit qu'il se mette sur une cellule du tableau de la requête -> Onglet requête -> Actualiser. En soit, un bouton.

Cdlt,

RE

les personnes qui vont utiliser la petite application

Si tu nous donnais le scenario complet plutôt qu'une pièce du puzzle sans l'image....

Du coup j'ai trouvé ce petit code qui permet d'importer des données depuis un fichier csv ou txt:

41testimpot.xlsm (17.65 Ko)
 .Filters.Add "CSV", "*.CSV", 1

cela m'indique une erreur : propriété ou méthode non gérer par cet objet au niveau de cette ligne de code

ok j'ai vue mon erreur

au lieu de : msoFileDialogFilePicker,

j'ai mis : msoFileDialogFolderPicker

lorsque je lance mon fichier "testimport" cela me met une erreur à ce niveau :

Range("importRange").Cells(rowNumber, itteration + 1) = lineItems(itteration)
la méthode range de l'objet global a échoué ?
16testimpot.xlsm (20.90 Ko)
mes fichiers joints : csv + testimport

Bonjour à tous,

@Chris : Et je rajouterais que ça fait 18 ans que les tableaux structurés existent !

@Quattro : C'est compliqué de deviner la source d'une erreur avec une seule ligne. Peux-tu poster le code complet (s'il n'est pas trop long) ?

Par ailleurs, je crois qu'il existe une méthode .texttocolumns qui gère la conversion du texte provenant de CSV :

https://docs.microsoft.com/fr-fr/office/vba/api/excel.range.texttocolumns

A regarder avec attention.

Cdlt,

Sub Macro1()
Dim chemin_Data As String
Dim chemin_import As String

chemin_Data = "G:\Projet_Oullins\ExportTransactions_Oullins_20201201_20210101.csv"
Application.Workbooks.Open (chemin_Data)
Cells.Select
Selection.Copy

chemin_import = "C:\Users\equat\OneDrive\Bureau\toto.csv"
Application.Workbooks.Open (chemin_import)
'Sheets.Add After:=ActiveSheet
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Dim dialogBox As FileDialog
Dim selectedFile As String

Set dialogBox = Application.FileDialog(msoFileDialogFilePicker)

With dialogBox
    .Filters.Add "csv", "*.csv", 1
    .AllowMultiSelect = False

    If .Show = True Then
        selectedFile = .SelectedItems(1)
    End If
    Debug.Print selectedFile

End With

    If selectedFile <> "" Then
        Open selectedFile For Input As #1
            Dim rowNumber As Long
            Dim lineFromFile As String
            Dim lineItems As Variant
            Dim itteration As Integer '= 0

            rowNumber = 2

            Do Until EOF(1)
                Line Input #1, lineFromFile
                lineItems = Split(lineFromFile, ";")

                For itteration = 0 To 26
                    Range("importRange").Cells(rowNumber, itteration + 1) = lineItems(itteration)
                Next

                rowNumber = rowNumber + 1
            Loop
        Close #1
     End If

End Sub

Bonsoir

j'ai utiliser PowerQuery pour recuperer d'un fichier *.csv les données, et ensuite les mettre dans un nouveau classeur au format plus lisible par excel.

Le soucis est que ce fichier *.csv ce mois ci s'appel x le mois prochain y etc....il n'aura jamais le meme nom.

Dans le code ci-dessous, quel est l'endroit ou je peux modifier les noms des fichiers *.csv pour chaque mois a venir ?

Sub macro1()
'
' macro1 Macro
'

'
    ActiveWorkbook.Queries.Add Name:="transaction_history", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Csv.Document(File.Contents(""C:\Users\equat\OneDrive\Bureau\transaction_history.csv""),[Delimiter="";"", Columns=27, Encoding=1252, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & "    #""En-têtes promus"" = Table.PromoteHeaders(Source, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & "    #""Type modifié"" = Table.TransformColumnTypes(#""En-têtes promus"",{{""Moyen de paiement"", type t" & _
        "ext}, {""Heure Serveur"", type datetime}, {""Date Horo"", type datetime}, {""Code horo"", Int64.Type}, {""Montant"", Int64.Type}, {""Durée d'occupation"", type text}, {""Durée payée"", type text}, {""Durée d'occupation en minutes"", type text}, {""Durée payée en minutes"", type text}, {""ID système"", Int64.Type}, {""Identifiant imprimé "", Int64.Type}, {""N° de pla" & _
        "ce"", type text}, {""N° de plaque"", type text}, {""Type de carte "", type text}, {""Numéro carte :"", type text}, {""Description zone"", type text}, {""Description circuit"", type text}, {""Code Parc"", Int64.Type}, {""Parc"", type text}, {""Description horo."", type text}, {""Adresse"", type text}, {""Type"", type text}, {""Type usager :"", Int64.Type}, {""Date de" & _
        " fin"", type datetime}, {""Temps gratuit :"", type text}, {""Durée gratuite en minutes"", type text}, {""Devise"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Type modifié"""
    ActiveWorkbook.Worksheets.Add
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=transaction_history;Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [transaction_history]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "transaction_history"
        .Refresh BackgroundQuery:=False
    End With
End Sub

je me servirais d'un INPUT par exemple pour donner des noms.

Bonjour

Inutile de coder la requête en VBA...

L'actualiser suffit et on peut en récupérer le résultat via VBA pour le coller ailleurs

Le chemin d'accès au fichier peut être stocké dans une cellule nommée, par exemple, Fichier, que PQ peut récupérer avec

Excel.CurrentWorkbook(){[Name="Fichier"]}[Content][Column1]{0}

Bonjour,
Je ne comprend pas bien.
Ce mois ci mon fichier *.CSV s'appelait : transaction hystory Mars.csv.
Le mois prochain il s’appellera : transaction hystory Avril.csv.
et ainsi de suite.....
la structure sera la même, sauf les valeurs, qui elles vont changer chaque mois.
1 - Comment je peux Actualiser si le nom du fichier change chaque mois ?
2 - Comment créer un chemin d'accès ?
Rechercher des sujets similaires à "recuperer donnees classeur"