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 :

Copier et concaténer depuis 1 fichier source vers fichier recap


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Copier et concaténer depuis 1 fichier source vers fichier recap
    Bonjour à tous,

    La situation : un fichier Source qui contient une 40aine de colonne.
    Un fichier Recap dans lequel j'ai fais une macro qui me permet de copier juste les informations du clients (nom, adresse, ect ...) issu du fichier source vers le fichier recap.

    Je veux récupérer uniquement les colonnes G à R, sans la K et la P. Pour ce faire j'utilise le code suivant :

    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
    DerniereLigne = ActiveSheet.UsedRange.Rows.Count
     
    classeurSource.Sheets("Rapport 1").Range("G3:J" & DerniereLigne).Cells.Copy
    classeurDestination.Activate
    classeurDestination.Sheets("Feuil1").Range("B2").Select
    classeurDestination.Sheets("Feuil1").Paste
     
    classeurSource.Sheets("Rapport 1").Range("L3:O" & DerniereLigne).Cells.Copy
    classeurDestination.Activate
    classeurDestination.Sheets("Feuil1").Range("F2").Select
    classeurDestination.Sheets("Feuil1").Paste
     
    classeurSource.Sheets("Rapport 1").Range("Q3:R" & DerniereLigne).Cells.Copy
    classeurDestination.Activate
    classeurDestination.Sheets("Feuil1").Range("J2").Select
    classeurDestination.Sheets("Feuil1").Paste
     
    'fermer le classeur source
    classeurSource.Close False
    Déjà je voudrais optimiser ce bout de code, quand j'essaye de faire un Range("G3:J" & DerniereLigne, "L3:O" & DerniereLigne, "Q3:R" & DerniereLigne), ça me sélectionne tout, même la colonne K et P (comme si je faisais un Range("G3:R" & DerniereLigne). Donc comment faudrait-il faire ?

    Ma deuxième question, je voudrais lorsque je copie les colonnes L, M, N (numéro de voie, type de voie, libellé de la voie) depuis mon fichier Source, pouvoir les coller sur mon fichier récap mais concatener que sur 1 cellule (adresse) et non 3 comme actuellement avec ma méthode.

    Merci d'avance

  2. #2
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    Bonjour,
    Je n'ai pas compris pourquoi à partir du code que tu as posté, les colonnes intermédiaires sont copiées.
    Mais le code truffé d'Activate et Select me file déjà une migraine.
    Peut-être qu'un tour dans les tutos http://excel.developpez.com/cours/ t'aidera à mieux faire.

    Plusieurs optimisations sont possibles. Tu peux essayer d'arranger le code ci-dessous pour ton besoin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Dim d as Range
    ...
        classeurSource.Sheets("Rapport 1").Range("G3:R" & DerniereLigne).Copy classeurDestination.Sheets("Feuil1").Range("b2")
        Set d = classeurDestination.Sheets("Feuil1").UsedRange
        d.Columns(5).delete
        d.columns(9).delete
    Pour la dernière question, les tutos comme suggéré plus haut.
    Utilises une variable qui concatène tes valeurs et affecte le à la cellule cible.

  3. #3
    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 974
    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 974
    Points : 29 003
    Points
    29 003
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour exporter des données en sélectionnant certaines colonnes rien de tel que la méthode AdvancedFilter même s'il n'y a pas de critères.
    En effet, cette méthode permet d'exporter toutes ou une partie des étiquettes de colonnes de la liste source et ce sans pour autant utiliser l'argument CriteriaRange qui est optionnel.
    La procédure ExportByAdvancedFilter
    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
    Function ExportByAdvancedFilter(areaSource As Range, sheetTarget As Worksheet, _
                                    Optional ListLabel As String, _
                                    Optional Append As Boolean = True) As Range
     ' Author : Philippe Tulliez
     ' Arguments
     '  areaSource (range) : Source de données
     '  sheetTarget (Worksheet) : Feuille cible - Les données seront exportée à partir de A1
     '  [ListLabel] (string) : Liste des colonnes à exporter (séparées par des ;)
     '                         si l'argument est vide, toutes les colonens seront exportées
     '  [Append] (Booléen) : Faux si la liste précédente doit être effacée (Vrai par défaut)
     Dim areaTarget As Range
     If Not Append Then sheetTarget.Cells.Clear
     Set areaTarget = sheetTarget.Range("A1").CurrentRegion
     Select Case True
      Case (Append = True And areaTarget.Count = 1) Or Not Append
       If Len(ListLabel) Then
        areaTarget = ListLabel
        sheetTarget.Range("A1").TextToColumns TextQualifier:=xlDoubleQuote
       End If
       Set areaTarget = areaTarget.CurrentRegion
      Case Else
       With areaTarget
       .Offset(.Rows.Count).Resize(1).Value = .Resize(1).Value ' Copie de la ligne 1
        Set areaTarget = .Offset(.Rows.Count).Resize(1)
       End With
     End Select
     areaSource.AdvancedFilter Action:=xlFilterCopy, copytorange:=areaTarget
     Set ExportByAdvancedFilter = areaTarget.CurrentRegion
     If areaTarget.Row > 1 Then
      areaTarget.EntireRow.Delete
     End If
     Set areaTarget = Nothing
    End Function
    La procédure qui appelle la fonction (Cette procédure peut être utilisée comme une Sub ou comme une Function)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub TestExport()
     Dim rngSource As Range, shtTarget As Worksheet, List As String
     With ThisWorkbook
      Set rngSource = .Worksheets("db_1").Range("A1").CurrentRegion ' Liste source
      Set shtTarget = .Worksheets("Export") ' Feuille cible
     End With
     List = "NOM;PRENOM;LOGEMENT;CIVIL;ENFANTS;Salaire" ' Liste des colonnes à exporter
     ExportByAdvancedFilter rngSource, shtTarget, ListLabel:=List, Append:=False
     MsgBox "Nombre de lignes pour la feuille export " & _
        ExportByAdvancedFilter(rngSource, shtTarget).Rows.Count
    End Sub
    Cette procédure démontre encore une fois, la puissance de cette méthode pour exporter des données.

  4. #4
    Candidat au Club
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Avril 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour à tous,


    Déjà merci à vous 2 pour vos contributions !

    J'ai pratiquement tout terminé, du coup j'ai réparti ça en 3 boutons :

    Import : importation des colonnes voulu depuis le fichier source
    Nettoyage : concatenation de plusieurs cellules et suppression des espaces superflus
    Export : exportation d'une plage et sauvegarde au format excel

    Code Import : 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
    Sub copie()
     
    Dim classeurSource As Workbook, classeurDestination As Workbook
     
    ' Définition de la dernière ligne
    DerniereLigne = ActiveSheet.UsedRange.Rows.Count
     
    ' Effacement de la feuille
    ThisWorkbook.Sheets("Feuil1").Range("B3:X" & DerniereLigne).ClearContents
     
     
    'ouvrir le classeur source (en lecture seule)
    ChDir ThisWorkbook.Path & "\sources"
    Set classeurSource = Application.Workbooks.Open(Application.GetOpenFilename, , True)
     
    'définir le classeur destination
    Set classeurDestination = ThisWorkbook
     
    'copier les données de la "rapport1" du classeur source vers la "Feuil1" du classeur destination
    Dim d As Range
        classeurSource.Sheets("Rapport 1").Range("G3:R" & DerniereLigne).Copy classeurDestination.Sheets("Feuil1").Range("B2")
        Set d = classeurDestination.Sheets("Feuil1").UsedRange
        d.Columns(5).Delete
        d.Columns(9).Delete
     
    'fermer le classeur source
    classeurSource.Close False
     
    End Sub

    Code Nettoyage : 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
    Sub layout()
     
    For i = 3 To ActiveSheet.UsedRange.Rows.Count
        NoLigne = i
        For j = 7 To 8
            Cells(NoLigne, 6) = Cells(NoLigne, 6) & " " & Cells(NoLigne, j) & " "
        Next j
        Cells(NoLigne, 6) = Trim(Cells(NoLigne, 6)) 'supprime les espaces superflus à gauche et à droite
    Next i
     
    'définir le classeur destination et supprime les colonnes inutiles
    Set classeurDestination = ThisWorkbook
    Dim d As Range
        Set d = classeurDestination.Sheets("Feuil1").UsedRange
        d.Columns(7).Delete
        d.Columns(6).Delete
     
    End Sub

    Code Export : 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
    Sub export()
     
    Dim MaPlage As Range
    DerniereLigne = ActiveSheet.UsedRange.Rows.Count
    ChDir ThisWorkbook.Path & "\export"
     
    ' Exporter une plage dans un autre fichier excel
    Set MaPlage = Range("B2:I" & DerniereLigne) 'Applique la plage voulue à la variable
        MaPlage.Copy
        Workbooks.Add
        ActiveSheet.Paste 'Colle la sélection à copier sur la feuille active
        ActiveWorkbook.SaveAs Filename:=Application.Dialogs(xlDialogSaveAs).Show, _
            FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
        ActiveWorkbook.Close False
     
    End Sub

    Il y a juste avec le module d'export que j'ai un petit problème. Je veux qu'à la fin de l'exportation il me ferme le classeur actif (celui généré par l'exportation) d'où mon ActiveWorkBook.Close. Sauf que j'ai ce message la "un fichier nommé "TRUE.xls existe déjà à cet emplacement. Voulez-vous le remplacer ?" Si je fais oui ca ferme bien le classeur, si je fais non ça le ferme pas. En faite ca me génère un fichier TRUE.XLS à chaque fois.

  5. #5
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Cette procédure démontre encore une fois, la puissance de cette méthode pour exporter des données.
    Bonjour Philippe. On l'oublie souvent à tort.
    En effet les fonctionnalité du Filtre Excel sont sous-estimé ou ignorés par beaucoup.
    Beaucoup de code ou questions d'exportations, de copie, de synthèse n'ont pas lieu quand on a cet outil.

Discussions similaires

  1. [XL-2010] Copier des onglets d'un fichier source vers un nouveau classeur + autres boucles
    Par P4nd0r3 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/04/2015, 19h14
  2. [XL-2010] Synthétiser des données, MAJ auto vers fichiers sources
    Par boutm41 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/03/2015, 22h03
  3. Ftp fichier txt vers fichier AS400
    Par marcl1 dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 09/06/2008, 14h08
  4. Recopier fichier ANSI vers fichier Unicode
    Par Aka Guymelef dans le forum Contribuez
    Réponses: 1
    Dernier message: 17/03/2008, 14h51
  5. lecture de fichier C avec fichiers sources
    Par ToF19100 dans le forum C
    Réponses: 8
    Dernier message: 04/06/2007, 19h31

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