IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Importation de données d'un fichier à un autre [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Importation de données d'un fichier à un autre
    Bonjour,

    Je débute sur VBA depuis quelques jours et je coince sur un problème. J'ai besoin qu'avec un bouton sur mon classeur de base, je puisse importer des données d'un autre classeur et qu'il me les place au bon endroit.

    J'ai fait deux fichiers d'exemple pour illustrer mon problème. Pour synthétiser, j'ai deux fichiers : base.xlsm et import.xlsm . Dans mon fichier "base", j'ai un bouton permettant de choisir le fichier à importer (ici, import.xlsm du coup). Une fois le fichier choisi, la macro doit pouvoir mettre les valeurs des colonnes B et C du fichier d'import dans les colonnes C et D du fichier "base". Le tout en faisant correspondre le nom et le numéro, ceux ci n'étant pas inscrit sur le même format sur les deux fichiers, et étant un peu plus long sur le fichier d'import. Tout en sachant que les fichiers d'exemple ne sont qu'un aperçu, ils se peut qu'il y ai beaucoup plus de lignes.

    Je sais pas si je suis très clair, mais en espérant que quelqu'un puisse m'aider.

    Merci beaucoup
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Points : 584
    Points
    584
    Par défaut
    Si j'ai bien compris tu voudrait qu'on te fasse ton code de A à Z ?

    Et bien non ça marche pas comme ça (enfin en tout cas pour ma pomme )

    Donc si tu veux un coup de main de ma part penche toi d'abord un peu sur ton problème cherche des astuces et reviens avec un bout de code qu'on puisse voir si tu t'égare pas trop

    Good Luck
    C'est en creusant qu'on fait des trous

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bonjour Al,

    Je comprends tout à fait ton point de vue, étant en période d'apprentissage du VBA, mon but est surtout de comprendre l'aide qui m'est donnée. J'ai fait pas mal de tests qui ne se sont pas avérer concluant, du coup j'ai préféré donné que ce qui fonctionnait. Il y a un bout de code pour la sélection du fichier à importer sur le fichier "base.xlsm" dans la "Feuil1". Pour ce qui est de la copie des données, la seule chose que j'arrivais vraiment à faire c'était de la copie point par point à base de, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Workbooks(CmpFileName).Sheets("Feuil1").Range("C2") = Workbooks(RsltFileName).Sheets("Feuil1").Range("B1")
    Workbooks(CmpFileName).Sheets("Feuil1").Range("D2") = Workbooks(RsltFileName).Sheets("Feuil1").Range("C1")
    Workbooks(CmpFileName).Sheets("Feuil1").Range("C4") = Workbooks(RsltFileName).Sheets("Feuil1").Range("B2")
    Workbooks(CmpFileName).Sheets("Feuil1").Range("D4") = Workbooks(RsltFileName).Sheets("Feuil1").Range("C2")
    Ce qui me pose vraiment soucis, c'est de pouvoir placer automatiquement à la bonne ligne en comparant les noms et numéros alors qu'ils ne sont pas sur le même format sur les deux fichiers. Pour ça je n'ai pas vraiment d'idée :/

    Merci pour ta réponse

  4. #4
    Membre confirmé
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Points : 584
    Points
    584
    Par défaut
    Si j'ai bien compris tu récupère quelque chose du genre :
    A1 : Dupont B1 : 002
    Etc.

    Et dans ton autre feuille tu as une cellule (pourquoi pas G3) ou il y a Dupont et tu souhaite mettre dans la cellule en face (ici H3) 002 ?
    C'est en creusant qu'on fait des trous

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    C'est à peut près ça

    Dans mon base je peux avoir :
    A5 : Dupont B5 : Jean
    ...

    Et dans le fichier Import
    A1 : Dupont_Jean_Test * B1 : 50 C1 : 60

    *: Il se peut qu'il y ai du texte derrière ce qui nous intéresse, mais on ne doit pas en tenir compte.

    Et la macro doit pouvoir mettre le "50" et le "60" en C5 et D5 du fichier base.

    En espérant être un peu plus clair. Au besoin, je posterai des fichiers d'exemple un peu plus clair demain matin.

    Merci de ton aide

  6. #6
    Membre confirmé
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Points : 584
    Points
    584
    Par défaut
    Donc en fait tu fait un concatener de tes deux données (Nom/prénom) puis tu recherche l’occurrence dans ton autre fichier et dès que tu la trouves tu mets 50 dans la colonne suivante et 60 dans l'autre ?
    Et es-ce que tes Dupont_Jean_Test sont tous dans la même colonne ?
    C'est en creusant qu'on fait des trous

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bon Al

    C'est ça ! En gros au niveau de l'algo :

    - Je clique sur le bouton de mon fichier base qui m'ouvre un explorateur de fichier pour choisir le fichier à importer (Ca je l'ai fait)
    - Je compare mon "Dupont_Jean_Test1" du fichier "import" dans la colonne A au colonne A et B (donc potentiellement "Dupont" et "Jean") du fichier "Base" (Ce qui me bloque totalement)
    - Une fois qu'il a trouver la bonne ligne dans le fichier "Base" il importe les 2 valeurs colonne B et C du fichier "Import" dans les colonne C et D du fichier "Base"
    - Ensuite il passe la prochaine ligne du fichier "import" et fait une recherche de "Alain_Delon_Test2" par exemple

    Tout en sachant qu'il se peut qu'il y ai 50 lignes dans le fichier base mais seulement une dizaine dans le fichier d'import.

  8. #8
    Membre confirmé
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Points : 584
    Points
    584
    Par défaut
    Essaie ca en l'adaptant avec tes fichiers et en activant : Microsoft Scripting Runtime dans Outils => Références

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub Données()
     
    Dim DicoNom As New Dictionary 'Création d'un dictionnaire
     
    With Workbooks(Base).Sheets(1) 'dans ton fichier de base
        For x = 1 To .Range("A" & Rows.Count).End(xlUp).Row 'de la ligne 1 à la dernière
        DicoNom.Add Workbooks(Base).Sheets(1).Range("A" & x).value & Workbooks(Base).Sheets(1).Range("B" & x).value, x 'concatener du nom/prénom et ligne de cette occurrence en item
    Next x
    End With
     
    With Workbooks(Import).Sheets(1) 'dans ton fichier import
        For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row 'de la ligne 1 à la dernière
        tabNom = Split(.Range("A" & i).value, "_") 'explose ta ligne Nom_Prénom_Test
        Nomimp = tabNom(0) & tabNom(1) 'récupère NomPrénom
        If DicoNom.Exists(Nomimp) Then 'Vérifie si il existe dans le dico
        Workbooks(Base).Sheets(1).Range("C" & DicoNom(Nomimp)).value = .Range("B" & i).value 'copie 1
        Workbooks(Base).Sheets(1).Range("D" & DicoNom(Nomimp)).value = .Range("C" & i).value 'copie 2
        End If
    Next i
    End With
     
    End Sub
    Ce que je fait :
    - Un concatener de tout les NomsPrénoms que tu as dans ton fichier de base dans un dictionnaire, et j'affecte en objet la ligne de ce concatener
    - Séparation des différentes données de ta ligne dans ton fichier import en prenant le _ comme séparateur
    - Concatener du NomPrénom de ton fichier import
    - Vérification de si cette paire NomPrénom existe dans le dictionnaire, si elle existe copie des données en appelant les lignes correspondantes

    En fouillant un peu je suppose qu'on peut faire mieux

    Dans tout les cas dis moi si a marche

    Et si tu veux en savoir plus sur les dictionnaires je te laisse faire une recherche sur le forum il y a plein d'exemples ou ici
    C'est en creusant qu'on fait des trous

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bonjours Al !

    Merci beaucoup, j'ai pas mal pu apprendre avec le code que tu m'as fourni ! Je l'ai légèrement adapté sur mon fichier de test afin de facilité l'intégration à mon véritable fichier plus tard, mais j'ai un petit soucis que je n'arrive pas à résoudre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Sub import()
     
        Dim Result As String
        Dim RsltFileName As String
        Dim CmpFileName As String
        Dim i As Integer
        Dim DicoNom As New Dictionary 'Création d'un dictionnaire
     
        CmpFileName = ThisWorkbook.Name
     
        With Application.FileDialog(msoFileDialogFilePicker)
            .Title = "Selectionner un fichier Excel"
            .AllowMultiSelect = False
            .Filters.Clear
            .Filters.Add "Classeurs Excel", "*.xls; *.xlsx; *.xlsm"
            .Show
            If .SelectedItems.Count > 0 Then
                Result = .SelectedItems(1)
            Else
                Result = ""
            End If
        End With
     
        If Result <> "" Then
            Application.ScreenUpdating = False
            Workbooks.Open Result
            RsltFileName = ActiveWorkbook.Name
     
     
            Workbooks(CmpFileName).Activate
            With Workbooks(CmpFileName).Sheets("Feuil1") 'dans ton fichier de base
                For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row 'de la ligne 2 à la dernière
                    DicoNom.Add .Range("A" & i).Value & .Range("B" & i).Value, x 'concatener du nom/prénom et ligne de cette occurrence en item
                Next i
            End With
     
            With Workbooks(RsltFileName).Sheets("Feuil1") 'dans ton fichier import
                For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row 'de la ligne 1 à la dernière
                    tabNom = Split(.Range("A" & i).Value, "_") 'explose ta ligne Nom_Prénom_Test
                    Nomimp = tabNom(0) & tabNom(1) 'récupère NomPrénom
                    If DicoNom.Exists(Nomimp) Then 'Vérifie si il existe dans le dico
                        Workbooks(CmpFileName).Sheets("Feuil1").Range("C" & DicoNom(Nomimp)).Value = .Range("B" & i).Value 'copie 1
                        Workbooks(CmpFileName).Sheets("Feuil1").Range("D" & DicoNom(Nomimp)).Value = Workbooks(RsltFileName).Sheets("Feuil1").Range("C" & i).Value 'copie 2
                    End If
                Next i
            End With
     
        Else
            MsgBox "Vous n'avez pas selectionné de fichier.", vbCritical, "Erreur"
        End If
     
    End Sub
    A la ligne 42, j'ai une erreur d'exécution '1004' "Erreur définie par l'application ou par l'objet". Après quelques tests j'ai pu voir que c'était le : "DicoNom(Nomimp)" qui ne renvoyait rien. J'ai bien compris qu'il devait renvoyé un chiffre mais je n'ai pas réussi à le faire fonctionner alors que, avec l'espion sur le dictionnaire, j'ai pu voir qu'il se créait correctement.

    Merci pour ton aide

  10. #10
    Membre confirmé
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Points : 584
    Points
    584
    Par défaut
    Remplace ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row 'de la ligne 2 à la dernière
                    DicoNom.Add .Range("A" & i).Value & .Range("B" & i).Value, x 'concatener du nom/prénom et ligne de cette occurrence en item
                Next i
    Par cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row 'de la ligne 2 à la dernière
                    DicoNom.Add .Range("A" & i).Value & .Range("B" & i).Value, i 'concatener du nom/prénom et ligne de cette occurrence en item
                Next i
    C'est en creusant qu'on fait des trous

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bonjour Al,

    Effectivement, je n'avais pas vu ce petit "x" En tout cas, merci beaucoup car ça fonctionne parfaitement ! Il ne me reste plus qu'à l'intégrer dans mon véritable fichier

    PS : Je ne mets pas encore en résolu, au cas où je bloquerai sur mon intégration.

  12. #12
    Membre confirmé
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2015
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Alternant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 413
    Points : 584
    Points
    584
    Par défaut
    Content de t'avoir été utile
    Bon courage pour la suite
    C'est en creusant qu'on fait des trous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Importer les données d'un fichier CSV dans une base de données
    Par joueur dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/11/2008, 11h59
  2. [SQLCE 2000] Importer des données à partir de fichiers
    Par Friz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/03/2006, 19h39
  3. Réponses: 2
    Dernier message: 05/01/2006, 00h29
  4. Importation de données venant de fichier fermé ( *.xls)
    Par stormless dans le forum Macros et VBA Excel
    Réponses: 31
    Dernier message: 08/11/2005, 21h21
  5. Réponses: 3
    Dernier message: 13/12/2004, 13h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo