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 :

Aide pour Macro VBA copie lignes entre 2 classeur


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut Aide pour Macro VBA copie lignes entre 2 classeur
    bonjour à tous
    J'ai un soucis avec une macro et j'aurais besoin d'aide.
    Je vous explique. Je dois créer pour mon boulot un fichier qui va servir à gérer des CV. J'ai déjà pas mal avancer sur le sujet mais il me manque une chose essentielle c'est de pouvoir importer de nouveaux CV. Je vous explique, l'entreprise pour laquelle je travaille est amené à recevoir un fichier contenant les nouveaux Cv. Chaque Cv existant dans la base possède un code unique en colonne A.
    Pour l'exemple, disons dans le 1er classeur nommé classeurexemple j'ai la base actuelle et dans le classeur nommé classeurdata j'ai les données à importer. Je voudrais vérifier que le code unique contenu dans la 1ère colonne de classeurdata n'existe pas dans le classeurexemple et si c'est le cas copier/coller la ligne de classeurdata dans le classeurexemple.
    Les problèmes sont les suivant :
    - le classeurdata n'a pas forcément toujours le même nom et ne sera pas forcément toujours enregistré au même endroit
    - Je voudrais utiliser un dictionnaire pour accélérer les recherches mais je n'arrive pas à ce que l'import des données soit rapide...
    - Je pensais également à un tableau de variables mais là aussi je sèche...
    Sachez que le nombre de colonnes reste le même pour le classeurdata.
    merci pour votre aide

    Je vous joint les 2 classeurs.
    Classeurdata.xlsm
    Classeurexemple.xlsm

  2. #2
    Membre éclairé Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Points : 758
    Points
    758
    Par défaut


    Bonjour,

    Si ton classeurdata n'est pas enregistrer au même endroit, et n'a pas le même nom, comment peux tu le chercher ? Sur quelle critère te base-tu ? Sinon, Peut on envisager de l'ouvrir via une boîte de dialogue ?

    Peux tu poster ton code à propos du dictionnaire ? Je pense qu'on peut commencer à bosser avec le code plutôt que de s'envoyer des classeurs dès le début ! (De plus, j'ouvre rarement les classeurs exemple, et encore moins les xlsm !)

    Qu'entends tu par tableaux de données ?

    Bon courage !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    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
    Option Explicit
    Option Base 1
    Option Compare Text
    Dim cheminfichier As Variant
    Dim nomfichier As String
    Private Declare PtrSafe Function QueryPerformanceCounter Lib "Kernel32" (X As Currency) As Boolean
    Private Declare PtrSafe Function QueryPerformanceFrequency Lib "Kernel32" (X As Currency) As Boolean
     
    Sub importdonnee()
    Dim f1 As Worksheet
    Dim f2 As Worksheet
    Dim a() As Variant, b() As Variant, d()
    Dim Debut As Currency, Fin As Currency, Freq As Currency
    Dim tmpstr() As String
    Dim mondico1 As Object
    Dim ligne As Long
    Dim k As Long
    Dim lastline As Long
    Dim lastrow As Long
    Dim lastline2 As Long
    Dim temp As String
    Dim aa(), bb(), i As Long
      Application.ScreenUpdating = False
      Application.Calculation = xlCalculationManual
      QueryPerformanceCounter Debut
      cheminfichier = Application.GetOpenFilename("Fichiers Excels (*.xlsx), *.xlsx")
    If cheminfichier = False Then
    Exit Sub
    End If
     
    Workbooks.Open cheminfichier
    tmpstr = Split(cheminfichier, "\")
    nomfichier = tmpstr(UBound(tmpstr))
    Set f1 = Workbooks(nomfichier).Sheets("NOUVEAU_CV")
      Set f2 = ThisWorkbook.Sheets("Cvtheque")
      lastline = ThisWorkbook.Sheets("Cvtheque").Cells(Rows.Count, "A").End(xlUp).Row
      a = f2.Range("A1:AC" & lastline).Value
      lastrow = Workbooks(nomfichier).Sheets("NOUVEAU_CV").Cells(Rows.Count, "A").End(xlUp).Row
      b = f1.Range("A1:AC" & lastrow).Value
    Set mondico1 = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(a)
    temp = a(i, 1)
    mondico1(temp) = ""
    Next i
    ligne = 1
    Dim c
    ReDim c(1 To Application.Max(UBound(a), UBound(b)), 1 To UBound(a, 2))
    For i = 2 To UBound(b)
    temp = b(i, 1)
    If Not mondico1.Exists(temp) Then
    For k = 1 To UBound(b, 2): c(ligne, k) = b(i, k): Next k
    ligne = ligne + 1
    End If
    Next
     
      lastline2 = lastline + 1
      ThisWorkbook.Sheets("Cvtheque").Range("A" & lastline2).Resize(UBound(c, 1), UBound(c, 2)) = c
        QueryPerformanceCounter Fin
    QueryPerformanceFrequency Freq
    MsgBox "Durée de la procédure = " & Format(((Fin - Debut) / Freq), "0.00") & " s"
        Set mondico1 = Nothing
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationAutomatic
     
    End Sub
    voilà mon code la feuille nouveau_cv se trouve dans le classeurdata que je joins à nouveau j'ai modifié l'extension...
    pour le tableau de variable je pensais utiliser une variable du type dim tablo() as variant contenant la plage de cellules mais niveau rapidité c'est un peu lent...
    Classeurexemple.xlsm
    Classeurdata.xlsx

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut



    Bonjour, bonjour !

    Pour un import rapide sans dictionnaire, voir du côté d'un filtre avancé ou élaboré avec un critère calculé,
    résultat instantané en à peine vingt lignes de code …



    __________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo

  5. #5
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    je ne peux malheureusement pas utiliser cette solution car je travaille sur un classeur partagé. seul le filtre auto est disponible d'où l'utilisation des dictionnaires.

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut





    Et bien à partir d'un simple filtre il est possible de copier les données filtrées et ce,
    sans dictionnaire toujours en peu de lignes de code et c'est donc forcément rapide …

  7. #7
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    comment récupérer un sélection filtrée sachant que je souhaite récupérer les lignes dont le code n'existe pas dans mon classeurexemple
    c'est une macro avec autofilter ?

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    Oui et avec une colonne supplémentaire utilisant par exemple la fonction de feuille de calculs EQUIV
    le résultat est égal à une erreur (critère du filtre) lorsque le code n'existe pas …

    Sinon pour un dictionnaire, consulter l'aide VBA de l'objet Dictionary ou encore sur MSDN …

  9. #9
    Futur Membre du Club
    Homme Profil pro
    employé de bureau
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : employé de bureau
    Secteur : Transports

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    le fichier d'où je prend les données est un fichier qu'un prestataire envoie.
    est-il possible d'inclure un filtre avec equiv dans ce fichier source avec VBA ?
    Edit : finalement j'ai trouvé d'où venait le traitement trop long de ma macro. En fait j'avais pas pris la bonne méthode pour l'ouverture du fichier source. J'ai finalement préférer mettre le fichier dans un dossier prédéfini. Me restera plus qu'à demander au client de mettre le classeur source au bon endroit et de le nommer correctement. Sujet resolu donc ! Merci à tous

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

Discussions similaires

  1. [XL-2013] Aide pour macro de recherche et copie de lignes entière en utilisant un dictionnaire
    Par magicsismic dans le forum Macros et VBA Excel
    Réponses: 25
    Dernier message: 06/04/2015, 13h43
  2. [Debutant] Aide pour macro VBA
    Par sousou94 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/09/2010, 06h07
  3. besoin d'aide pour macros ou VBA
    Par jmsor dans le forum VBA Access
    Réponses: 1
    Dernier message: 07/02/2007, 18h41
  4. [VBA-E][débutant]aide pour macro sous excel
    Par julyBL dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 09/06/2006, 22h42
  5. [VBA-E] aide pour macro sur excel
    Par letoulouzin31 dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 24/05/2006, 11h29

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