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 :

[Ref 92621] Excel-VBA Rechercher puis copier plusieurs lignes dans un nouveau classeur


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Par défaut [Ref 92621] Excel-VBA Rechercher puis copier plusieurs lignes dans un nouveau classeur
    Bonjour,

    cela fait quelques jours que je cherche à programmer un module sur Excel mais étant novice en VBA, j'ai trouvé la forme générale du programme et la pluparts des fonctions a utiliser mais je galère sur la syntaxe exact.

    J'ai besoin de créer un programme qui ferait ceci:
    ( De base j'ai un ClasseurSource avec 3 feuilles ( F1, F2, F3))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    POUR chaque ligne (compteur i) FAIRE 
     
         SI ClasseurSource.F1.ColonneF contient la chaine de caractère "aspv"
              && ColonneAD contient NULL ALORS
     
              Créer un classeur au format CSV avec le nom ( ClasseurSource.F1.Lignei.ColonneG & ClasseurSource.F1.Lignei.ColonneJ & ClasseurSource.F1.Lignei.ColonneF".CSV")
     
              Copier la ligne du ClasseurSource dans le nouveau Classeur créé. (sauf dernière ligne)
              Enregistrer le classeur créé à un endroit précis ( exemple chemin: C:\Intel\Logs\) 
     
         end if
         i=i+1 
     
    end FOR

    J'ai ajouté en pièce jointe l'algorithme correctement indenté, ce sera plus simple à lire.
    Ca ne me paressait pas très compliqué de premier abord mais la syntaxe Excel n'est pas mon fort.
    Merci d'avance à celui ou ceux qui voudront bien m'aider à avancer. ^^
    Fichiers attachés Fichiers attachés

  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 AboutBlank1 Voir le message
    j'ai trouvé la forme générale du programme et la pluparts des fonctions a utiliser mais je galère sur la syntaxe exact.
    Peut-être pourrais-tu partager ce que tu as déjà fait pour que nous t'indiquions où se trouvent les erreurs de ton code.

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Par défaut
    Pour le moment, je n'ai pas grand chose en VBA, j'ai testé plusieurs trucs pour tenter de me familiariser avec le language.

    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
    Sub AddNewWorkbook()
    Dim xlApp As Excel.Application
    Dim xlbook As Excel.Workbook
    Dim i As Integer
    '
    'Création d'un nouveau classeur.csv
    '
        'On créer l'objet Excel
        Set xlApp = CreateObject("Excel.Application")
        'On défini le nombre d'onglets (ici 5)
        'xlApp.SheetsInNewWorkbook = 5
        'On ajoute un classeur
        Set xlbook = xlApp.Workbooks.Add
        'On donne un nom au classeur
        xlbook.SaveAs "S:\MonClasseur", FileFormat:=xlCSV
        'On rend le classeur visible
        xlApp.Visible = True
        'On ferme l'application
        'xlApp.Quit
     
     
    '
    'Copie d'une ligne dans le classeur csv créé précédement
    '
     
     
    'cherche la ligne vide dans le classeur de destination
    'i = xlBook.Worksheets(1).Range("A65536").End(xlUp).Row + 1
     
    'Copie la 2eme ligne de la premiere feuille dans le classeur source.
    'Colle la ligne à la suite de la derniere ligne non vide dans le classeur de
    'destination.
    'WBSource.Worksheets(1).Rows(2).Copy Destination:=xlBook.Worksheets(1).Cells(i, 1)
     
    'Modifier colonne Traité/Non-Traité avec la valeur T
        j = 1
        For i = 1 To ActiveSheet.Rows.Count
     
            If ActiveSheet.Range("A" & i).Value = "" Then
                xlbook.Range("A" & j & ":E" & j).Value = ActiveSheet.Range("A" & i & ":E" & i).Value
                j = j + 1
            End If
        Next i
     
     
     
    End Sub
    C'était plus un brouillon qu'autre chose, pour voir comment ça fonctionnait.

  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
    C'était plus un brouillon qu'autre chose, pour voir comment ça fonctionnait.
    C'est déjà un bon début.

    Comme tu es dans Excel, ceci est inutile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim xlApp As Excel.Application
    Et, pour la même raison, ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim xlbook As Excel.Workbook
    S'écrit plus simplement :
    Un conseil au sujet de cette ligne : évite de commencer le nom de tes variable pas "xl". C'est le préfixe utiliser par les constantes Excel en VBA donc il peut y avoir parfois des coïncidences malheureuses.


    Le nombre de lignes dans Excel pouvant dépasser 32000, il est préférable d'utiliser le type Long quand une variable va faire référence à des lignes.
    Donc, au lieu de :
    écrire :

    Ce que tu as fait ici est redondant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        'On créer l'objet Excel
        Set xlApp = CreateObject("Excel.Application")
        'On défini le nombre d'onglets (ici 5)
        'xlApp.SheetsInNewWorkbook = 5
        'On ajoute un classeur
        Set xlbook = xlApp.Workbooks.Add
    L'instruction Workbooks.Add va créé le classeur sans qu'il soit nécessaire d'utiliser CreateObjet. Cette instruction est plutôt réservés aux cas où on veut créer un élément d'une autre application comme un document Word.
    Et, à nouveau, le xlApp n'est pas utile.


    Attention, ceci ferme Excel. Je ne pense pas que c'est ce que tu voulais faire dans ton code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        'On ferme l'application
        'xlApp.Quit

    Pour le reste, je ne comprends pas trop ton algorithme (celui qui est dans ton premier message.
    Est-ce que tu veux créer un fichier CSV pour chaque ligne correspondant à ta condition avec, dans chaque, une seule ligne ?

    Quand tu écris :
    Copier la ligne du ClasseurSource dans le nouveau Classeur créé. (sauf dernière ligne)
    "sauf dernière ligne", est-ce que ça veut dire que tu copies plusieurs ligne dans le fichier destination ou est-ce que ça veut dire que tu ne scrutes pas la dernière ligne de ton fichier source ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Par défaut
    Salut,

    déjà merci pour ton aide. ^^

    Pour le reste, je ne comprends pas trop ton algorithme (celui qui est dans ton premier message.
    Est-ce que tu veux créer un fichier CSV pour chaque ligne correspondant à ta condition avec, dans chaque, une seule ligne ?

    Quand tu écris :

    Copier la ligne du ClasseurSource dans le nouveau Classeur créé. (sauf dernière ligne) "sauf dernière ligne", est-ce que ça veut dire que tu copies plusieurs ligne dans le fichier destination ou est-ce que ça veut dire que tu ne scrutes pas la dernière ligne de ton fichier source ?
    Oui, je veux créer un fichier CSV (avec un nom généré en fonction des cellules de la ligne que je vais copier) dans lequel je copie une ligne si elle respecte les conditions. Donc 1 ligne dans 1 fichier csv unique.
    Mais je ne veux pas copier la colonneAD. ( Je me suis tromper en écrivant "ligne" sur mon algorithme désolé. La colonne AD contient "T" si elle a déjà était traitée et rien si jamais traitée.)

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut Classeur
    Bonjour Aboutblank et Menhir, Bonjour au forum,

    Si je peux me permettre

    Lorsque tu écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 1 To ActiveSheet.Rows.Count
    Alors tu pourrais être plus restrictif

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim derlign as Long
     
    With Worksheets("Données")
        derlign = .Cells(.Rows.Count, 1).End(xlUp).Row
    End With
     
    For i = 1 to derlign
    Pour la méthode,

    Le plus efficace, à mon avis, serait d'alimenter, avec conditions, une variable Tableau et de transposer celui-ci dans le classeur CSV créé à cet effet.

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

Discussions similaires

  1. [VBA][Excel]Copier une feuille dans un nouveau classeur
    Par illight dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 02/10/2020, 12h51
  2. [XL-2007] Excel-VBA : Formule longue sur plusieurs lignes erreur fin d'instruction
    Par Pauline1374 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/03/2014, 17h46
  3. [VB.NET Excel] Copier un worksheet dans un nouveau classeur
    Par Uranne-jimmy dans le forum VB.NET
    Réponses: 2
    Dernier message: 04/04/2013, 10h56
  4. [XL-2007] Erreur pour copier plusieurs feuilles dans un autre classeur
    Par manu900 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 08/02/2012, 09h31
  5. Copier des lignes dans un nouveau classeur
    Par adelnikov dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/03/2008, 21h55

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