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 :

Copie de lignes entières d'un fichier vers un autre [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur environnement
    Inscrit en
    Juillet 2014
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur environnement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 37
    Par défaut Copie de lignes entières d'un fichier vers un autre
    Salut! Je dois être très fatigué ou bien malade... je n'arrive pas du tout à faire quelque chose somme tout d'assez simple : copier des lignes de mon classeur courant (thisworkbook) vers un nouveau classeur en fonction d'une condition sur une cellule. Je m'emmèle les pinceaux lorsqu'il s'agit de passer d'un fichier à un autre... je sais qu'il faut déclarer des variables pour identifier le fichier source du fichier cible, mais impossible d'arriver à quoi que ce soit... je n'ai même pas de lignes de codes à vous proposer : tout ce que j'ai ne rime à rien...

    Pour la condition, c'est bon : ce sera une boucle de type
    If cells (i, 31) = 1 then... ->JE COPIE LA LIGNE TOUTE ENTIERE

    Une fois que les lignes sont copiées, j'ai une procédure qui me permettra de donner un nom qui s'incrément. C'est tout le début qui me manque... merci pour votre aide afin d'y voir plus clair!

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par SaulEman Voir le message
    copier des lignes de mon classeur courant (thisworkbook) vers un nouveau classeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Worksheets("FeuilleSource").Rows(LigneSource).Copy Workbooks("ClasseurDest.xlsx").Worksheets("FeuilleDest").Rows(LigneDest)
    Pour la condition, c'est bon : ce sera une boucle de type
    If cells (i, 31) = 1 then... ->JE COPIE LA LIGNE TOUTE ENTIERE
    N'oublie pas d'indiquer le classeur et la feuille de la Cells si ce n'est pas ceux qui sont actifs.

    Mais tout ceci pourrait sans doute se faire plus simplement avec un filtre avancé.
    http://philippetulliez.developpez.co...dvancedfilter/

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur environnement
    Inscrit en
    Juillet 2014
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur environnement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 37
    Par défaut Oui, mais non.
    Bon, j'ai un peu de mal car avant que je ne copie mes lignes, le fichier n'a pas encore été sauvegardé.

    Je pensais faire un truc dans le genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Set xL = Workbooks.add 'création du nouveau fichier
    WorkBooks.Sheets("Feuil1").Select
    WorkBooks("Feuil1").Name="extraction" 'renommer la feuille
     
    For i = 2 to Derlig
    If cells (i, 31).Value = 1 then ' condition de copie de la ligne sur mon fichier source ThisWorkbook
     
    ThisWorkbook.Worksheets("Questions").Rows(i).Copy Workbooks("WorkBooks.add").Worksheets("extraction").Rows(i)
    End if
    next i
    puis ensuite, j'appelle une procédure pour enregistrer le fichier avec un nom qui s'incrémente et qui vérifie que le fichier n'existe pas déjà.

    Mais je ne comprends pas comment utiliser la fonction WorkBooks.add (est-ce bien le nom du fichier que j'ouvre?).

    Merci pour votre aide!

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Première chose : essaye au moins d'écrire ton code dans le VBE qui t'indiquera une partie de tes erreurs.
    Parce que ce que tu proposes-là n'est visiblement pas tiré d'un code écrit avec cet éditeur.

    Deuxième chose : prends la peine de te former un minimum au VBA parce que le code que tu présentes ici contient plus d'une erreur par ligne.
    http://bidou.developpez.com/article/VBA/
    Se contenter de recopier des portions de code récupérées ici et là sans vraiment les comprendre, ça ne permet pas d'aller bien loin.

    Je te déconseille d'utiliser un nom de variable si proche de mots réservés VBA.
    Avant d'utiliser la variable de référence de ce classeur, déclare-la avec son type.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim WBDest As Workbook
    Set WBDest = Workbooks.add
    Citation Envoyé par SaulEman Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WorkBooks.Sheets("Feuil1").Select
    WorkBooks("Feuil1").Name="extraction" 'renommer la feuille
    Workbooks représente la collection de tous les classeurs ouverts et non pas un classeur particulier.
    Pour que ce soit un classeur particulier, il faut lui mettre un indice ou son nom.

    Il est peu judicieux de référencer une feuille par un nom qu'on ne lui a pas donné soi-même.
    Je te conseille donc de remplacer "Feuil1" simplement par son indice.

    Le Select ne sert à rien.

    Workbooks("Feuil1") ne représente pas un onglet d'un classeur mais un classeur nommé Feuil1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WBDest.WorksSheets(1).Name = "extraction"
    Ta variable Derlig n'est ni déclarée, ni renseignée.
    Il faudrait aussi déclarer la variable i.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If cells (i, 31).Value = 1 then
    Comme déjà dit dans mon message précédent, il faut que tu indiques à quel classeur et quel onglet appartient cette Cells

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks("WorkBooks.add")
    Puisque la référence du classeur créé a été placé dans une variable, il suffit d'utiliser cette variable pour référencer ton classeur.
    Tu peux donc remplacer cette portion de code par un simple WBDest.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur environnement
    Inscrit en
    Juillet 2014
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur environnement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 37
    Par défaut Où j'en suis
    Tu as tout à fait raison, Menhir : il me manque de sérieuses bases, et je prévois de faire une formation très prochainement. Il y a des choses que j'ai bien comprises, et d'autres beaucoup moins, du coup, je m'emmèle les pinceaux.
    Voici la procédure que j'essaie de valider. Il s'agit de récupérer dans un premier temps les titres de mes colonnes de mon fichier source (thisworkbook) qui se trouvent sur les cellules A2 à P2 puis de les coller dans un nouveau fichier, dont je renomme la feuille 1 en "extraction".

    Ensuite, je veux récupérer les lignes de mon fichier source qui remplissent la condition cells(i, 31) = 1 et les coller à la suite dans mon fichier cible.
    Sur le papier, rien de plus facile. Par contre, à faire, j'ai des bugs partout... toujours pour le même souci : je n'arrive pas à comprendre comment appeler les propriétés des fonctions.
    Pour passer du fichier source au fichier cible, j'utilise à chaque fois la propriété activate, puis select. Sauf que ça ne marche pas : code erreur à la ligne wbCible.Sheets("extraction").range("A2).paste

    Merci pour ton aide.


    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
    Sub export()
     
    Application.ScreenUpdating = False
     
    Dim wbSource As Workbook, wbCible As Workbook
    Dim DerLig As Integer
    Dim i As Integer, j As Integer
     
    'Déclaration des variables : fichier source = wbSource / fichier cible = wbCible
    Set wbSource = ThisWorkbook
    Set wbCible = Workbooks.Add
     
    wbCible.Worksheets(1).Name = "extraction"
    wbSource.Activate
     
    wbSource.Worksheets("Questions").Range("A2:P2").Copy '<---- copie des cellules A2 à P2 qui sont les entêtes des colonnes en ligne 2
    wbcible.sheets.select  '<---- collage 
    Selection.Range("A2").Paste
     
     
    wbSource.Activate
    'Détermination de la dernière ligne remplie
    DerLig = Range("A65536").End(xlUp).Row
    j = 3
    MsgBox "derlig = " & DerLig
     
    For i = 3 To DerLig
            wbSource.Activate
            If wbSource.Sheets("Questions").Cells(i, 31).Value = 1 Then
                wbSource.Sheets("Questions").Rows(i).Select
                Selection.Copy
                wbCible.Activate
                Range("A" & j).Select
                j = j + 1
            End If
    Next i
     
    End Sub

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par SaulEman Voir le message
    code erreur à la ligne wbCible.Sheets("extraction").range("A2).paste
    Quand tu as une erreur, indique quel est le message d'erreur. Ca aide pour l'identification.
    Ici, tu as de la chance, l'erreur est évidente.

    L'objet Range n'a pas de méthode Paste.
    La méthode de collage pour cet objet est PasteSpecial.
    Lire ça : https://msdn.microsoft.com/fr-fr/lib...6(v=office.15)
    Ceci aussi peut te servir : https://docs.microsoft.com/fr-fr/pre...4(v=office.15)

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

Discussions similaires

  1. [DOS] copie de ligne d'un fichier vers un autre
    Par Ted37 dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 23/01/2009, 19h08
  2. copier une ligne entière d'un tableau vers un autre
    Par ktulu77 dans le forum VBA PowerPoint
    Réponses: 3
    Dernier message: 15/09/2008, 10h12
  3. copie d'un fichier vers un autre d'un extrait XML
    Par MOMO321 dans le forum Modules
    Réponses: 2
    Dernier message: 05/07/2006, 12h21
  4. [VBA-E]Comment mettre une ligne entière d'un fichier excel en gras ?
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/05/2006, 09h23
  5. copie d'un fichier vers un autre serveur
    Par jexl dans le forum ASP
    Réponses: 4
    Dernier message: 20/12/2004, 17h04

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