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 :

Macro d'import de données selon ref qui ne fonctionne pas [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 238
    Points : 116
    Points
    116
    Par défaut Macro d'import de données selon ref qui ne fonctionne pas
    Bonjour a tous,

    J'ai un petit souci avec une macro qui fonctionne selon certain classeur et ne fonctionne pas selon d'autre
    et je voudrais savoir selon quoi cette macro fonctionne ou pas ?
    Ce code me permet d'importer des données en croisant deux fichiers Excel :

    Exemple

    Premier colonne (A) du fichier 1 :
    R1
    R2
    R3
    R4

    Deuxième colonne (B) du fichier 1 :
    12
    96
    54
    87

    Première colonne du fichier 2 :
    R3
    R2
    R4
    R1

    La deuxième colonne du fichier 2 est vide (c'est celle que je veux remplir)
    Mon code fait une rechercher et copie les données qu'il a trouver sur la ligne.
    Pour R3 il copie 54 en deuxieme colonne (B) du fichier 2
    ETC..

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    Sub Import_Donnees()
     
    Dim Chemin_Dossier_Source As String
    Dim Dossier_Source As String
    Dim Numero_Page_Info As Integer
    Dim Colonne1_fichier1 As Integer
    Dim Colonne_de_Recherche1 As String
    Dim Colonne_de_Recherche2 As Integer
    Dim Page_Fichier2 As String
    Dim Colonne1_fichier2 As Integer
     
    ''''''''''CHAMP A MODIFIER''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '''''(classeur1)'''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Le chemin du fichier ou l'on va faire la recherche
    Chemin_Dossier_Source = "C:\Users\Documents"
     
    'Le nom du fichier ou l'on va faire la recherche
    Dossier_Source = "\" & "Classeur1"
     
    'Le Numéro de la feuille ou il y a les informations à prendre
    'Pour exemple : Feuil2 (Nom_de_la_page) => 2
    Numero_Page_Info = 1
     
    'La colonne de recherche
    'Pour exemple :"A" correspond à la colonne 1  ||  "B" correspond à la colonne 2'
    Colonne_de_Recherche1 = "A"
     
    'Pour ces info : la colonne "0" est la colonne de recherche
    'Si les REF sont en colonne "C" et les infos à importer le sont en colonne "L", alors il faut mettre colonne1_fichier2 = 9'
    Colonne1_fichier1 = 1
    '''''Fin(classeur1)''''''''''''''''''''''''''''''''''''''''''''''''''''
     
    '''''(classeur2)'''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Le nom de la page à compléter et d'ou on recherche les REF
    'Pour exemple : Feuil2 (Nom_de_la_page) => Nom_de_la_page
    Page_Fichier2 = "Feuil1"
     
    'La colonne des REF que l'on recherche
    '1 correspond à "A"  ||  2 correspond à "B"'
    Colonne_de_Recherche2 = 1
     
    'Pour ces info : la colonne "0" est la colonne de recherche
    'Si les REF sont en colonne "C" et la colonne à remplire est la "L", alors il faut mettre colonne1_fichier1 = 9'
    Colonne1_fichier2 = 1
    '''''Fin(classeur2)''''''''''''''''''''''''''''''''''''''''''''''''''''
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
        Dim fichier_existant As String
        Dim fichier_existant_q As String
        fichier_existant_q = Dir(Chemin_Dossier_Source & Dossier_Source)
        fichier_existant = (Chemin_Dossier_Source & Dossier_Source)
        If fichier_existant_q = "" Then
            With Application
            .ScreenUpdating = False
            .Calculation = xlCalculationManual
            End With
        End If
     
        Sheets(Page_Fichier2).Select
     
        'Ouverture du fichier de prix (en caché)
        Dim xlApp As Object
        Set xlApp = CreateObject("Excel.Application")
        Dim xlWk As Workbook
        Set xlWk = xlApp.Workbooks.Open(Chemin_Dossier_Source & Dossier_Source)
        Dim xlWs As Worksheet
        Set xlWs = xlWk.Worksheets(Numero_Page_Info)
        xlApp.Visible = True 'rend la deuxieme fenêtre visible
     
        Dim rngArticle As Range
        Dim myWS As Worksheet
        Set myWS = ThisWorkbook.ActiveSheet
        DerLig = myWS.Cells(Rows.Count, Colonne_de_Recherche2).End(xlUp).Row
        Set rngArticle = myWS.Range(myWS.Cells(1, Colonne_de_Recherche2), myWS.Cells(DerLig, Colonne_de_Recherche2))
     
        'Recherche de l'article dans l'autre fichier
        Dim rngArticleRecherche As Range
        'ICI LA COLONNE RECHERCHE
        Set rngArticleRecherche = xlWs.Range(xlWs.Range(Colonne_de_Recherche1 & "1"), xlWs.Range(Colonne_de_Recherche1 & "65536").End(xlUp))
     
        Dim rngRefTrouve As Range
        Dim cell As Range
     
        For Each cell In rngArticle
            Set rngRefTrouve = rngArticleRecherche.Find(cell.Value, , xlValues, xlWhole)
     
            If rngRefTrouve Is Nothing Then
            Else
                'MsgBox cell.Value
                cell.Offset(, Colonne1_fichier2).Value = rngRefTrouve.Offset(, Colonne1_fichier1).Value 'prix
            End If
        Next
     
        'Libération des ressources (fermeture du fichier caché)
        Set xlWs = Nothing
        xlWk.Close (False)
        Set xlWk = Nothing
        xlApp.Quit
        Set xlApp = Nothing
     
        With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
        End With
    End Sub
    Merci de vos retour

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    D'après tes explications, cela ressemble furieusement à ce que fait la formule RECHERCHEV que tu peux utiliser directement en VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.WorksheetFunction.VLookup(Param1, Param2, Param3, Param4)
    Sinon, j'ai développé une fonction plus complète qui utilise la combinaison INDEX et EQUIV que tu trouveras dans cette contribution LookupLabelRange - Ajouter une colonne à une liste de données

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 238
    Points : 116
    Points
    116
    Par défaut
    Bonjour Philippe Tulliez,
    Et merci de ta réponse

    Effectivement c'est ce que fait une RechercherV
    mais je ne peux pas mettre la RechercheV car c'est une demande de mes collaborateur..

    J'ai regardé ton code et c'est effectivement la même chose, je vais tenter de le comprendre et de l'essayer

    Par contre cela ne répond toujours pas à ma question
    C'est grandement perturbant que mes macro fonctionne avec certain fichier et pas d'autre !!

    Merci !

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Effectivement c'est ce que fait une RechercherV
    mais je ne peux pas mettre la RechercheV car c'est une demande de mes collaborateur..
    Comme je l'ai écrit, tu peux parfaitement faire un RECHERCHEV en VBA soit en utilisant WorksheetFunction, soit en utilisant EVALUATE soit encore en écrivant la formule à l'aide de la propriété Formula de l'objet Range. Formule que tu peux ensuite remplacer par son résultat (équivalent d'un Copier/Collage spécial - Valeur
    L'utilisation de la formule sur une plage entière est plus rapide qu'une boucle sur chaque ligne.
    Par contre cela ne répond toujours pas à ma question
    C'est grandement perturbant que mes macro fonctionne avec certain fichier et pas d'autre !!
    Tu ne précises pas ce qui ne va pas. As-tu une erreur (si oui, quel n° et quel message) ou une cellule vide ?
    Si la référence n'est pas trouvée, je chercherais du côté de la valeur cherchée ou des références à trouver. Il est possible que des espaces avant ou après sont présents et si on peut facilement visualiser les espaces avant, on ne voit jamais les espaces après.
    Est-ce qu'une recherche manuelle sur les classeurs posant problèmes fonctionne ?
    Si un souci d'espace se trouve sur une des références du fichier 1 la fonction Trim peut régler le problème. Si c'est sur le fichier 2, on détourner le problème en utilisant le caractère générique *

    Si tu souhaites supprimer les espaces de tableaux entiers, tu peux aller voir du côté de cette contribution Code pour éliminer les espaces (TRIM) dans un tableau

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 238
    Points : 116
    Points
    116
    Par défaut
    Philippe Tulliez,

    Tout d’abord, pour le rechercheV et le worksheetfunction , je n'ai pas encore regardé
    e vais m'y atteler de suite

    Tu ne précises pas ce qui ne va pas. As-tu une erreur (si oui, quel n° et quel message) ou une cellule vide ?
    Si la référence n'est pas trouvée, je chercherais du côté de la valeur cherchée ou des références à trouver. Il est possible que des espaces avant ou après sont présents et si on peut facilement visualiser les espaces avant, on ne voit jamais les espaces après.
    Est-ce qu'une recherche manuelle sur les classeurs posant problèmes fonctionne ?
    Si un souci d'espace se trouve sur une des références du fichier 1 la fonction Trim peut régler le problème. Si c'est sur le fichier 2, on détourner le problème en utilisant le caractère générique *
    Je n'ai aucune erreur, je code se termine normalement, sauf que ma colonne n'est pas remplis,
    Les cellules vides ne sont pas le problèmes car j'ai testé le même code avec les mêmes valeurs mais dans deux autres fichier et cela fonctionne
    Les espaces avant et après ne sont pas non plus le problème car je les ais supprimer avant et le code ne fonctionnerais pas dans les deux cas et pas un seul
    La recherche manuelle fonctionne bien

    Je te remercie de me donner une autre solution à mon problème, mais j'aimerais savoir pourquoi,
    Car au fil du temps je me rend compte que Excel est bien, mais comme je rencontre des problèmes fréquemment, il faut connaitre cette outil parfaitement pour pouvoir tous les éviter

    Merci

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il y a forcément une raison pour laquelle la recherche ne s'effectue pas
    Voici un exemple avec l'utilisation de la propriété Formula
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     With ThisWorkbook.Worksheets("Feuil4").Range("B2:B1000")
     .Formula = "=VLOOKUP(A2,db!$A$2:$O$5000,4,0)"
     .Value = .Value ' Equivalent d'un Copier/CollageSpecial-Valeur
     End With
    C'est instantané
    Il faut bien entendu s'il y a lieu utiliser Application.ScreenUpdating=False, etc.
    Il faut également utiliser des variables objets pour l'intégrer dans une boucle.

    Il faudrait utiliser le débogage. Point d'arrêt (F9) et l'exécution du programme pas à pas (F8)

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 238
    Points : 116
    Points
    116
    Par défaut
    Bonjour Philippe Tulliez, bonjour tout le monde

    Philippe Tulliez,
    j'ai essayre un code avec Vlookup, mais je n'arrive pas à trouver la bonne syntaxe,

    pourrais-tu m'aider stp

    voici le code que j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Colonne1_fichier2 & ligne_fichier_2).Formula = "=VLOOKUP(" & Valeur_Cherchee & "," & Chemin_Source & "\[" & Dossier_Source & ".xls]" & Nom_Page_Info & "'!" & Colonne_de_Recherche1 & ligne_fichier_2_min & ":" & Colonne_de_Recherche1 & ligne_fichier_2_max & ",2,FALSE)"
    J'ai tout mis en variable, mais je ne comprend pas trop ^^
    j'espere que ces variables sont assez explicite

    mais en gros :

    Colonne1_fichier2 = "B"
    ligne_fichier_2 = 1
    Valeur_Cherchee = la valeur cherche (1961 )
    Chemin_Source = C\User\Documents
    Dossier_Source = Classeur_de_recherche
    Nom_Page_Info = page du classeur
    Colonne_de_Recherche1 = "C"
    ligne_fichier_2_min = 2
    Colonne_de_Recherche1 = "C"
    ligne_fichier_2_max = 2000

    Merci

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 922
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 922
    Points : 28 908
    Points
    28 908
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    j'ai essayre un code avec Vlookup, mais je n'arrive pas à trouver la bonne syntaxe,
    pourrais-tu m'aider stp
    J'utilise pour cela des balises que je remplace à l'aide de la fonction Replace
    Voir cette réponse ou encore celle-ci et enfin cette autre encore.

  9. #9
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour sharox, Philippe.

    J'ai un petit souci avec une macro qui fonctionne selon certain classeur et ne fonctionne pas selon d'autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Le nom du fichier ou l'on va faire la recherche
    Dossier_Source = "\" & "Classeur1"
    Il serait préférable d'inclure l'extension au nom du classeur. Sinon c'est n'importe quel fichier qui sera ouvert.

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

Discussions similaires

  1. Macro pour importer des données web avec plusieurs variables
    Par lajim dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 17/04/2015, 15h46
  2. importer des données selon la couleur de la police
    Par delphine1987 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/03/2011, 13h46
  3. éélaboration d'une macro pour importation de donnée dans excel 2003
    Par wuging dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 17/09/2010, 08h33
  4. Script JSP qui ne fonctionne pas sur n'importe quel poste
    Par vannary dans le forum Servlets/JSP
    Réponses: 15
    Dernier message: 18/12/2006, 11h56
  5. [MySQL] Ajout de données qui ne fonctionne pas
    Par paterson dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/05/2006, 20h28

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