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 :

Création de plusieurs onglets avec saut de ligne


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 50
    Points : 17
    Points
    17
    Par défaut Création de plusieurs onglets avec saut de ligne
    Bonjour,

    Je suis sous Excel 2007. J’ai une macro qui me génère X onglets excel à partir d'une feuille excel (en fait la macro 'split' la feuille Sheet n°1 en autant d'onglets excel qu'il y a termes différents dans la colonne B de Sheet n°1). De plus, la macro « devrait » recopier l’entête du tableau initial dans chaque onglet créé et insérer une ligne en tout début d’onglet pour afficher un titre. « Devrait » car justement, c’est ces 2 étapes là qui me pose problème…

    A partir du fichier initial :

    Sujet Age (an) Poids (kg)
    100 0 3
    100 1 9
    100 2 12
    100 3 15
    101 2 9
    101 3 11
    102 0 4
    103 0 2

    Je souhaiterai obtenir :

    Onglet '100' :
    Age (an)
    Sujet Age (an) Poids (kg)
    100 0 3
    100 1 9
    100 2 12
    100 3 15

    Onglet '101'
    Age (an)
    Sujet Age (an) Poids (kg)
    101 2 9
    101 3 11


    Onglet '102'
    Age (an)
    Sujet Age (an) Poids (kg)
    102 0 4

    Onglet '103'
    Age (an)
    Sujet Age (an) Poids (kg)
    103 0 2


    Mais pour le moment, je n’obtiens que :
    Onglet '100'
    Sujet Age (an) Poids (kg)
    100 0 3
    100 1 9
    100 2 12
    100 3 15

    Onglet '101'
    Sujet Age (an) Poids (kg)
    101 2 9
    101 3 11


    Onglet '102'
    102 0 4

    Onglet '103'
    103 0 2

    En fait, je ne parviens pas à insérer le titre de l’onglet : Age (an).
    Et lorsqu’il n’y a qu’une seule ligne dans mon fichier initial, l’entête ne se créée pas (exemple onglets 102 et 103).

    Voici mon code :

    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
    Sub Creation_Onglets()
    Dim Ws As Worksheet
    Dim trouve As Boolean
    Dim contenu As String
    Dim lig, derlig As Integer
    With Sheets("Sheet n°1") 'feuille ou sont les données initiales
    derlig = .Range("A65536").End(xlUp).Row 'A = colonne contenant le séparateur d'onglet
    For lig = 1 To derlig
    contenu = .Cells(lig, 1).Value '1 = 1ère col cf A ci dessus
    For Each Ws In ThisWorkbook.Worksheets
    trouve = False
            If StrComp(Ws.Name, contenu, vbTextCompare) = 0 Then
                trouve = True
                Exit For
            End If
    Next Ws
    If trouve = True Then
            .Rows(lig).Copy Sheets(contenu).Range("A65536").End(xlUp).Offset(1, 0)
            Worksheets("Sujet").Range("A2:M2").Copy Ws.Range("A1:M1")
            'Worksheets("Sujet").Range("B2").Copy Ws.Range("A1")
        Else
            Sheets.Add
            ActiveSheet.Name = contenu
            .Rows(lig).Copy Sheets(contenu).Range("A65536").End(xlUp).Offset(1, 0)
            'ActiveSheet.Rows(1).Insert
    End If
    Next lig
    End With
    End Sub
    Avez-vous une solution ?

    Merci d’avance pour votre aide qui me sera très utile.

    Aude_alti

  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 942
    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 942
    Points : 28 941
    Points
    28 941
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu peux t'inspirer de cette intervention.
    Là il s'agit de "spliter" un tableau en fonction des données se trouvant en colonne A d'une feuille et ce sur des classeurs différents.
    Il suffit de l'adapter ce n'est pas très compliqué mais si tu as des problèmes tu peux toujours reposer une question.
    C'est basé sur les filtres élaborés d'excel.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 50
    Points : 17
    Points
    17
    Par défaut
    Bonjour Philippe,

    Merci pour ta réponse mais je t'avoue que je débute en VBA et que je ne vois pas trop comment adapter ton exemple à mon code....

    Désolée, j'ai peur de trop modifier mon code et de ne plus m'y retrouver!

    Dans mon code, j'arrive à insérer 2 lignes en début de chaque onglets mais à chaque fois elles sont vides. Je ne récupère pas le titre ni l'entête. C'est vraiment dommage. Je pensais naivement qu'il me fallait que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'ActiveSheet.Rows(1).Insert
    Mais à cause de la boucle, ça ne fonctionne pas...

    Peux-tu m'aider un peu plus?

    Merci d'avance

  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 942
    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 942
    Points : 28 941
    Points
    28 941
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Merci pour ta réponse mais je t'avoue que je débute en VBA et que je ne vois pas trop comment adapter ton exemple à mon code....
    Désolée, j'ai peur de trop modifier mon code et de ne plus m'y retrouver!
    As-tu seulement essayé de tester le classeur qui est téléchargeable.
    D'après ce que j'ai lu c'est plus simple d'utiliser le code que j'ai donné que celui que tu as écrit.
    As-tu lu les commentaires du code que j'ai affiché dans cette intervention ?
    Alors t'aider s'il s'agit d'une petite erreur oui mais passer du temps sur un code alors que je trouve qu'une autre méthode est meilleure, tu comprendras que c'est un peu difficile.
    En fait, je ne parviens pas à insérer le titre de l’onglet : Age (an).
    Et lorsqu’il n’y a qu’une seule ligne dans mon fichier initial, l’entête ne se créée pas (exemple onglets 102 et 103).
    Si j'ai bien compris tu crées une feuille par âge et tu donnes comme nom à la feuille le n° du sujet qui se trouve en colonne A.
    A la limite tu fais une copie de la première ligne que tu places dans une variable objet nommée Titre et à chaque création de feuille tu commence par coller la valeur de cette variable.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 50
    Points : 17
    Points
    17
    Par défaut
    As-tu seulement essayé de tester le classeur qui est téléchargeable.
    D'après ce que j'ai lu c'est plus simple d'utiliser le code que j'ai donné que celui que tu as écrit.
    As-tu lu les commentaires du code que j'ai affiché dans cette intervention ?
    Alors t'aider s'il s'agit d'une petite erreur oui mais passer du temps sur un code alors que je trouve qu'une autre méthode est meilleure, tu comprendras que c'est un peu difficile.
    Je vais essayer ce week-end alors...j'ai essayé de déchiffrer le code et je n'ai pas compris. Je débute vraiment en VBA et je cherche juste des solutions pour optimiser mon travail mais je ne travaille pas dans l'informatique....Déjà, j'étais très content du code que j'avais trouvé sur ce forum pour créer plusieurs onglets(ce n'est pas moi qui l'ai écrit)! Je l'ai légèrement adapté à mon cas mais je n'arrive pas à faire les autres adaptations. Si je n'y parviens pas, c'est dommage pour moi, je vais tout faire à la main (mais je suis très content d'avoir découvert un peu le VBA! merci à ce forum!) Je te comprends tout à fait, pour toi, ton code est nickel donc autant l'utiliser (ah si je pouvais! ;-) )

    Si j'ai bien compris tu crées une feuille par âge et tu donnes comme nom à la feuille le n° du sujet qui se trouve en colonne A.
    En fait, une feuille par sujet et j'insère le titre 'Age' en tête de l'onglet créé (c'est juste pour donner un titre à l'onglet ).

    A la limite tu fais une copie de la première ligne que tu places dans une variable objet nommée Titre et à chaque création de feuille tu commence par coller la valeur de cette variable.
    une variable objet, je ne sais pas trop ce que c'est, je crois l'avoir lu dans un tutoriel. Je vais relire ce tutoriel et je vais voir ça ce week-end.
    Je vais en avoir pour 5/6 heures et je ne suis même pas sûr d'y arriver (juste pour insérer une ligne! )

  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 942
    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 942
    Points : 28 941
    Points
    28 941
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Comme le sujet m'intéresse puisqu'il traite du filtre élaboré, j'ai passé un peu de temps pour adapter le code.
    Voici le code qui comprends deux procédures mais j'aurais pu le faire en trois procédures cela aurait été plus propre.
    La premier procédure nommée ExportDataByAdvancedFilter est le début du programme qui crée dynamiquement une feuille paramètres et qui la détruit ensuite.
    La deuxième procédure ExportRange est la procédure qui exporte les données en utilisant la méthode AdvancedFilter (filtre avancé). Cette procédure crée également les feuilles d'une façon dynamique.
    Il y a un argument facultatif nommé ClearSheet qui est à True par défaut.
    Cela signifie que si l'on souhaite écraser les anciennes valeurs contenues dans les feuilles en les remplaçant par les nouvelles, la syntaxe est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExportRange rngData, rngCriteria, rngList.Offset(r)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExportRange rngData, rngCriteria, rngList.Offset(r), ClearSheet:=True
    Si l'on souhaite ajouter les nouvelles lignes aux anciennes présentes, la syntaxe est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExportRange rngData, rngCriteria, rngList.Offset(r), ClearSheet:=False
    C'est ce dernier cas qui pour l'instant est programmé. Voir la partie mis en rouge ligne 27 dans la première procédure
    Il y a en début de la première procédure une constante qui est le nom que tu as donné à ta feuille Sheet n°1
    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
    Option Explicit
    Const shtName = "Sheet n°1"
    Sub ExportDataByAdvancedFilter()
     ' Déclaration + Initialisation des variables
     Const ParamName = "_ParamWrk"
     Dim rngList As Range, rngData As Range, rngCriteria As Range, r As Long
     Dim shtParam As Worksheet
     Dim wkb As Workbook: Set wkb = ThisWorkbook
     Application.ScreenUpdating = False
    CreaSheet:  ' Création de la feuille paramètre
     On Error Resume Next
     Set shtParam = wkb.Worksheets(ParamName)
     If Err Then wkb.Worksheets.Add.Name = ParamName: GoTo CreaSheet
     On Error GoTo 0
     With shtParam
      Set rngList = .Range("A1"): Set rngCriteria = .Range("C1:C2")
     End With
     Set rngData = wkb.Worksheets(shtName).Range("A1").CurrentRegion
     ' Etape 1 - Création d'une liste unique basée sur la colonne 1
     With rngData
     .Resize(, 1).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=rngList, Unique:=True
     With shtParam: .Range("C1") = .Range("A1"): End With
     End With
     ' Etape 2 - Exportation vers nouvelle feuille (Dans la boucle)
     For r = 1 To rngList.CurrentRegion.Rows.Count - 1
      rngCriteria.Cells(2, 1) = rngList.Offset(r) ' Insère le critère
      ExportRange rngData, rngCriteria, rngList.Offset(r), ClearSheet:=False
     Next
     ' Destruction de la feuille paramètres
     Application.DisplayAlerts = False
      shtParam.Delete: Set shtParam = Nothing
     Application.DisplayAlerts = True
     '
     Set rngList = Nothing: Set rngData = Nothing: Set rngCriteria = Nothing
     Application.ScreenUpdating = True
    End Sub
    La procédure d'exportation
    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
    Sub ExportRange(SourceData As Range, areaCriteria As Range, TargetSheetName As String, Optional ClearSheet As Boolean = True)
     ' Fonction qui exporte les données filtrées vers une nouvelle feuille
     ' Contrainte l'exportation est faite sur le même classeur que SourceData
     ' SourceData - (Range) la plage des données à exporter
     ' areaCriteria - (Range) la plage des critères
     ' TargetSheetName - (String) Nom de la feuille où exporter les données filtrées
     ' [ClearSheet] - Boolean [d:=True] si False ajoute les lignes exportées derrières les autres
     Dim rngStart As Range ' Cellule où écrire dans la feuille cible
     Dim nbRow As Long
     Dim wkb As Workbook: Set wkb = SourceData.Worksheet.Parent
     On Error Resume Next
     wkb.Sheets.Add before:=Sheets(1): wkb.Sheets(1).Name = TargetSheetName ' Création feuille
     Application.DisplayAlerts = False
     If Err Then wkb.Sheets(1).Delete ' Delete NewSheet if TargetSheetName Exist
     Application.DisplayAlerts = True
     On Error GoTo 0
     ' Exportation vers nlle feuille suivant critère
     Set rngStart = wkb.Sheets(TargetSheetName).Range("A1")
     With rngStart
      If ClearSheet Then
         .Worksheet.Cells.Clear
        Else
         nbRow = .CurrentRegion.Rows.Count: nbRow = nbRow + Abs((nbRow > 1))
         ClearSheet = nbRow = 1
         Set rngStart = .Range("A" & nbRow)
      End If
     End With
     ' Exportation
     With SourceData: .AdvancedFilter xlFilterCopy, areaCriteria, rngStart: End With
     If Not ClearSheet Then rngStart.EntireRow.Delete
     Set rngStart = Nothing: Set wkb = Nothing
    End Sub
    Fichiers attachés Fichiers attachés

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 50
    Points : 17
    Points
    17
    Par défaut
    Philippe,

    Merci beaucoup pour ta patientce et tes explications (je ne t'apprends rien si je te dis que je n'ai pas compris tout ton code, je suis désolée).

    J'ai copié/collé tes 2 code et lancé ExportDataByAdvancedFilter()

    mais ça plante au niveau de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set rngData = wkb.Worksheets(shtName).Range("A1").CurrentRegion
    Phillipe, combien de lignes peuvent être traitées avec ton code dans Sheet n°1?

    Avec le code que j'avais initiallement, le nombre maximum de lignes traitées dans Sheet n°1 est entre 32 000 et 33 000, au delà, j'ai un message d'erreur.

    De plus, est-ce que la mise en page du fichier Sheet 1 est conservée dans les onglets créés?

    Merci encore!

  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 942
    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 942
    Points : 28 941
    Points
    28 941
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Citation Envoyé par aude_alti Voir le message
    Phillipe, combien de lignes peuvent être traitées avec ton code dans Sheet n°1?
    Je ne connais pas la limite mais j'ai fait un jour un test avec plus de 100 000 lignes il me semble.
    Avec le code que j'avais initiallement, le nombre maximum de lignes traitées dans Sheet n°1 est entre 32 000 et 33 000, au delà, j'ai un message d'erreur.
    Ton message d'erreur vient certainement du fait que tu as utilisé une variable typée Integer (Entier) dont le maximum est de 32 767 (si j'ai bonne mémoire). Il faut utiliser un type Long pour les lignes
    De plus, est-ce que la mise en page du fichier Sheet 1 est conservée dans les onglets créés?
    Oui (excepté les largeurs des colonnes mais on peut pallier ce problème avec du collage special).

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 50
    Points : 17
    Points
    17
    Par défaut
    Merci Phillipe, avec Long, effectivement ca ne plante plus.
    Je viens de lancer 'mon' code pour 50 000 lignes et ça passe


    As-tu vu mon message juste au-dessus et le bug que je rencontre avec ton code? Merci!

  10. #10
    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 942
    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 942
    Points : 28 941
    Points
    28 941
    Billets dans le blog
    53
    Par défaut
    Bonjour,

    Non cette ligne m'avait échappée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rngData = wkb.Worksheets(shtName).Range("A1").CurrentRegion
    Tu écris que cela plante mais si tu me donnais le message d'erreur ce serait plus simple.
    Tes données commencent t'elle à la cellule A1 ?
    C'est la contrainte du code
    Une feuille de données idéalement et pour utiliser facilement les outils d'excel doit commencer à la première ligne avec les étiquettes de colonnes, ne pas avoir de cellules fusionnées.

    J'ai mis un classeur à télécharger où tu peux voir comment cela se déroule

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 50
    Points : 17
    Points
    17
    Par défaut
    Philippe, j'ai relancé ton code et ça marche maintenant (j'ai dû faire une fausse manip tout à l'heure, désolé).

    Donc ton code est mieux que celui que j'avais, puisque effectivement, lorsqu'une seule ligne est créée dans un onglet, l'entête du fichier est également créée (ce qui faisait défaut dans le code que j'avais).

    Donc merci pour ton code, je vais m'en servir et essayer de le comprendre!

    Par contre, il y a toujours un problème non résolu : ajouter une ligne en début de fichier, avec une cellule contenenant le mot 'Age'.
    Ca sera le titre de mes onglets.

    Sais-tu comment faire?

    La mise en page du fichier Sheet n°1 est bien conservée dans les onglets créés mais comme tu le dis, en effet, la taille des colonnes n'est pas identiques entre Sheet n°1 et ses bébés onglets. Tu penses à un collage spécial...mais...euh...comment faire? Merci encore à toi!

  12. #12
    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 942
    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 942
    Points : 28 941
    Points
    28 941
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Par contre, il y a toujours un problème non résolu : ajouter une ligne en début de fichier, avec une cellule contenenant le mot 'Age'.
    Ca sera le titre de mes onglets.Sais-tu comment faire?
    Je crois mais cela demande un peu de modification.
    Tu veux que le mot âge soit en cellule A1 et que la liste des données commencent en A2 ?
    Est-ce pour l'impression ou la visualisation parce-que le mot âge se trouve déjà en colonne B1 que je sache.
    La mise en page du fichier Sheet n°1 est bien conservée dans les onglets créés mais comme tu le dis, en effet, la taille des colonnes n'est pas identiques entre Sheet n°1 et ses bébés onglets. Tu penses à un collage spécial...mais...euh...comment faire?
    Le meilleur ami du programmeur est l'enregistreur de macros.
    Pour cela il faut bien entendu savoir ce que recèle le collage spécial d'excel.
    Lorsque l'on fait la copie d'une ou plusieurs cellules et que l'on fait ensuite un collage spécial, une des options de celui-ci est le collage des largeurs des colonnes. Donc la largeur de la colonne collée correspondra à la largeur de la colonne copiée.
    Ainsi si l'on veux que toute une feuille prenne la même largeur qu'une autre, on sélectionne toute la feuille source, on fait un Copier, on va dans la feuille cible, on sélectionne la cellule A1 et on fait un Collage spécial - Largeur de colonnes.

    [EDIT]
    Un petit exemple de la copie d'une feuille nommée db dont on colle la largeur de colonnes dans la feuille Export.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Dim shtSource As Worksheet, shtTarget As Worksheet
     With ThisWorkbook
      Set shtSource = .Worksheets("db")
      Set shtTarget = .Worksheets("Export")
     End With
     shtSource.Cells.Copy
     shtTarget.Cells.PasteSpecial Paste:=xlPasteColumnWidths

  13. #13
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 50
    Points : 17
    Points
    17
    Par défaut Un titre pour chaque onglet
    Phillipe,
    merci encore pour ton aide.
    Je vais essayer ce que tu me proposes pour le collage spécial et te tiens au courant.

    Tu veux que le mot âge soit en cellule A1 et que la liste des données commencent en A2 ?
    Oui tout à fait.

    Est-ce pour l'impression ou la visualisation parce-que le mot âge setrouve déjà en colonne B1 que je sache.
    C'est plutôt pour l'impression, pour donner un titre à l'onglet et ne pas avoir directement un tableau de données dès le haut de la page.
    (en fait, j'ai une macro qui fusionnera plusieurs onglets en un fichier pdf, et cette cellule 'Age' me servira de séparateur entre les différents onglets donc les différentes parties de mon pdf).

  14. #14
    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 942
    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 942
    Points : 28 941
    Points
    28 941
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    C'est plutôt pour l'impression, pour donner un titre à l'onglet et ne pas avoir directement un tableau de données dès le haut de la page.
    (en fait, j'ai une macro qui fusionnera plusieurs onglets en un fichier pdf, et cette cellule 'Age' me servira de séparateur entre les différents onglets donc les différentes parties de mon pdf).
    Si c'est pour l'impression, il est préférable alors d'utiliser l'en-tête de la feuille (onglet [Mise en page]) ainsi tu gardes le début de la liste des données en A1 avec les étiquettes de colonnes en ligne 1

  15. #15
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 50
    Points : 17
    Points
    17
    Par défaut
    Mais en fait, je souhaite fusionner un onglet de ce fichier avec un autre onglet d'un autre fichier...ceci avec 4 fichiers excel, et à partir de ces 4 onglets, obtenir un fichier pdf (j'ai déjà la macro qui fusionne ces 4 onglets). Du coup si j'utilise une macro avec Mise en page je pourrai toujours faire une fusion pdf après? Car en fait, je n'imprime pas tout de suite l'onglet, je le fusionne d'abord en pdf...

  16. #16
    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 942
    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 942
    Points : 28 941
    Points
    28 941
    Billets dans le blog
    53
    Par défaut
    Bonjour,

    Bien entendu que l'on peut mettre sur un seul document pdf plusieurs feuilles.
    Sélectionne plusieurs feuilles d'excel (soit avec shift soit avec Ctrl) et fait l'expérience manuellement sans VBA.

  17. #17
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 50
    Points : 17
    Points
    17
    Par défaut
    oui ça je sais faire

    Mais alors je ne vois pas comment utiliser la fonction 'mise en page' que tu proposes dans la macro pour afficher un titre? Et ça sur tous les onglets?

    Phillipe,

    dans ton code du post #7, je ne comprends pas les lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     With shtParam
      Set rngList = .Range("A1"): Set rngCriteria = .Range("C1:C2")
     End With
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    With shtParam: .Range("C1") = .Range("A1"): End With
    En fait je ne comprends pas pourquoi 'C1'?

    D'autre part, en ce qui concerne ton code pour conserver la taille des colonnes, il marche très bien 'tout seul' mais dès que j'essaie d'ajouter les lignes suivantes dans ton code, post #7, ça ne conserve plus la taille des colonnes. C'est sûr, je m'y prends mal.

    En fait, je travaille avec les 2 lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     shtSource.Cells.Copy
     shtTarget.Cells.PasteSpecial Paste:=xlPasteColumnWidths
    Si j'ai bien compris, c'est la feuille paramètre qui contient l'en tête des colonnes donc c'est sur cette feuille qu'il faut ajouter le collage spécial?
    Avant, il faut faire le copier sur 'Sheet n°1'. Et ce copier/collage spécial est à faire dans Sub ExportRange? J'ai fait plusieurs essaies mais cela ne marche pas. Ca ne plante pas, mais la taille des colonnes n'est pas respectée.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Set rngStart = wkb.Sheets(TargetSheetName).Range("A1")
     rngStart.Cells.Copy
     With rngStart
      If ClearSheet Then
         .Worksheet.Cells.Clear
        Else
         nbRow = .CurrentRegion.Rows.Count: nbRow = nbRow + Abs((nbRow > 1))
         ClearSheet = nbRow = 1
         Set rngStart = .Range("A" & nbRow)
         rngStart.Cells.PasteSpecial Paste:=xlPasteColumnWidths
      End If
     End With
    Merci encore pour ton aide!

  18. #18
    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 942
    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 942
    Points : 28 941
    Points
    28 941
    Billets dans le blog
    53
    Par défaut
    Citation Envoyé par aude_alti Voir le message
    Phillipe,
    dans ton code du post #7, je ne comprends pas les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     With shtParam
      Set rngList = .Range("A1"): Set rngCriteria = .Range("C1:C2")
     End With
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    With shtParam: .Range("C1") = .Range("A1"): End With
    En fait je ne comprends pas pourquoi 'C1'?
    Le filtre élaboré d'excel travaille avec une zone Data (ici la feuille nommée [Sheet N°1]), une zone de critère (dans notre cas la plage C1:C2 de la feuille nommée [_ParamWrk] (crée dynamiquement par le code VBA).
    Une zone critère doit avoir un ou plusieurs critères (ici 1) et l'étiquette de la colonne.
    L'étiquette ici est la valeur Sujet qui se trouve en A1 lors de l'exportation sans doublons de la liste des sujets et donc C1=A1 Etquette de la zone critère = Etiquette de la liste.
    Il y a aussi dans le cas qui nous occupe la zone d'exportation qui est la cellule A1 des feuilles crées (100, 101 etc...)
    Pour en savoir plus la lecture du tutoriel Les filtres avancés ou élaborés dans Excel s'impose.
    D'autre part, en ce qui concerne ton code pour conserver la taille des colonnes, il marche très bien 'tout seul' mais dès que j'essaie d'ajouter les lignes suivantes dans ton code, post #7, ça ne conserve plus la taille des colonnes. C'est sûr, je m'y prends mal.
    En fait, je travaille avec les 2 lignes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     shtSource.Cells.Copy
     shtTarget.Cells.PasteSpecial Paste:=xlPasteColumnWidths
    Si j'ai bien compris, c'est la feuille paramètre qui contient l'en tête des colonnes donc c'est sur cette feuille qu'il faut ajouter le collage spécial?
    Non, la copie doit se faire sur [Sheet N°1] et le Collage special - Largeur de colonne sur chaque feuille crée [100], [101] etc ...
    Avant, il faut faire le copier sur 'Sheet n°1'. Et ce copier/collage spécial est à faire dans Sub ExportRange? J'ai fait plusieurs essaies mais cela ne marche pas. Ca ne plante pas, mais la taille des colonnes n'est pas respectée.
    Le collage peut se faire soit dans la procédure ExportRange soit dans la procédure principale juste après l'appel à la procédure ExportRange

    Bonjour,
    Dans la procédure ExportRange la ligne qui est en rouge doit être ajoutée à cet endroit pour avoir la largeur des colonnes telle que celle du fichier source.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     ' Exportation
     With SourceData: .AdvancedFilter xlFilterCopy, areaCriteria, rngStart: End With
     If Not ClearSheet Then rngStart.EntireRow.Delete
     SourceData.Cells.Copy: rngStart.Parent.Cells.PasteSpecial Paste:=xlPasteColumnWidths
     Set rngStart = Nothing: Set wkb = Nothing

  19. #19
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 50
    Points : 17
    Points
    17
    Par défaut
    Bonjour Philippe,

    une fois de plus Merci pour tes explications et ton aide très très précieuse.

    Le copier-collage spécial marche bien et la taille des colonnes est conservée!

    Il ne me reste 'plus qu'à' régler cette histoire d'en-tête (avec ce que tu m'as proposé : Onglet [Mise en page] et j'aurai de super macros qui vont me fusionner x fois 4 onglets excel de 4 classeurs différents en x fichiers pdf, avec 150<x<600! J'ai déjà la macro fusion qui marche très bien.

    Il ne me reste donc 'plus qu'à' insérer un titre pour chaque onglet et je souhaiterai également ci-possible afficher ce titre sur chaque feuille de chaque onglet (comme une zone à répéter en en-tête de page).

    Je vais me renseigner sur la fonction Mise en page, en-tête en macro.

    Avec le code ci-dessous, j'arrive à insérer un titre et numéroter les pages.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub EnTete()
    With Worksheets("Sheet n°1").PageSetup
        .LeftHeader = "Patient"
        .LeftFooter = "Page : &P"
        End With
    End Sub
    Je vais voir comment ajouter une date et les en-têtes à répéter en haut de colonnes.

    Je recopierai mon code final (enfin celui de Phillippe qui a été un peu adapté ! ) quand tout sera résolu, au cas où, ça peut aider quelqu'un!

    Citation Envoyé par aude_alti Voir le message
    Je vais voir comment ajouter une date et les en-têtes à répéter en haut de colonnes.
    J'ai trouvé ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub ImpressionEn_tete_repetee()
        With ActiveSheet.PageSetup
            .PrintTitleRows = "$1:$1"
        End With
    End Sub
    et ça fonctionne.

    Je vais faire finaliser la mise en page.

    Citation Envoyé par aude_alti Voir le message

    Je recopierai mon code final (enfin celui de Phillippe qui a été un peu adapté ! ) quand tout sera résolu, au cas où, ça peut aider quelqu'un!
    Es-tu d'accord Phillippe? C'est toi l'auteur

  20. #20
    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 942
    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 942
    Points : 28 941
    Points
    28 941
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je viens de constater un bug dans la ligne de collage des largeurs de colonnes de la procédure ExportRange.
    En effet la variable rngTarget (anciennement rngStart était Nothing après la ligne If Not ClearSheet Then rngTarget.EntireRow.Delete et donc provoquait une erreur et ce uniquement dans le cas où l'argument ClearSheet est à False.
    C'est donc réparé et voici la nouvelle version
    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
    Sub ExportRange(SourceData As Range, areaCriteria As Range, TargetSheetName As String, Optional ClearSheet As Boolean = True)
     ' Fonction qui exporte les données filtrées vers une nouvelle feuille
     ' Basé sur méthode AdvancedFilter
     ' Contraintes :
     '   L'exportation est faite sur le même classeur que SourceData
     ' Author  : Philippe Tulliez http://philippe.tulliez.be
     ' Date    : 2013/03/27 (2013/03/22 v 1.0)
     ' Version : 2.2
     ' Upgrade
     ' 13/03/26 - 2.1 - Ajouté collage largeur de colonne
     ' 13/03/27 - 2.2 - Correction d'un bug shtTarget.Cells.PasteSpecial au lieu de rngStart
     '                  Rename rngStart -> rngTarget
     ' Arguments
     ' SourceData - (Range) Plage des données à exporter
     ' areaCriteria - (Range) Plage des critères
     ' TargetSheetName - (String) Nom de la feuille où exporter les données filtrées
     ' [ClearSheet] - Boolean [d:=True] si False ajoute les lignes exportées derrières les autres
     Dim shtTarget As Worksheet, rngTarget As Range ' rngStar=Cellule où écrire dans la feuille cible
     Dim wkb As Workbook: Set wkb = SourceData.Worksheet.Parent
     Dim nbRow As Long
     On Error Resume Next
     wkb.Sheets.Add before:=Sheets(1): wkb.Sheets(1).Name = TargetSheetName ' Création feuille
     Application.DisplayAlerts = False
     If Err Then wkb.Sheets(1).Delete ' Delete NewSheet if TargetSheetName Exist
     Application.DisplayAlerts = True
     On Error GoTo 0
     ' Exportation vers nlle feuille suivant critère
     Set shtTarget = wkb.Sheets(TargetSheetName): Set rngTarget = shtTarget.Range("A1")
     With rngTarget
      If ClearSheet Then
         .Worksheet.Cells.Clear
        Else
         nbRow = .CurrentRegion.Rows.Count: nbRow = nbRow + Abs((nbRow > 1))
         ClearSheet = nbRow = 1
         Set rngTarget = .Worksheet.Range("A" & nbRow) ' Correction 27/3/13 - ajouté parent
      End If
     End With
     ' Exportation
     With SourceData: .AdvancedFilter xlFilterCopy, areaCriteria, rngTarget: End With
     If Not ClearSheet Then rngTarget.EntireRow.Delete
     ' Collage des largeurs des colonnes
     SourceData.Cells.Copy: shtTarget.Cells.PasteSpecial Paste:=xlPasteColumnWidths ' (27/3/13)
     Set shtTarget = Nothing: Set rngTarget = Nothing: Set wkb = Nothing
    End Sub
    Dans la procédure ExportDataByAdvancedFilter, j'ai également remplacé ce code peu élégant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CreaSheet:  ' Création de la feuille paramètre
     On Error Resume Next
     Set shtParam = wkb.Worksheets(ParamName)
     If Err Then wkb.Worksheets.Add.Name = ParamName: GoTo CreaSheet
     On Error GoTo 0
    Par celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     ' Etape 1 - Création de la feuille paramètre
     Do
      On Error Resume Next
      Set shtParam = wkb.Worksheets(ParamName)
      If Err Then wkb.Worksheets.Add.Name = ParamName
      On Error GoTo 0
     Loop While shtParam Is Nothing

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 4 1234 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/10/2012, 19h59
  2. Création de plusieurs doc avec XSL
    Par Soupape dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 09/05/2007, 09h27
  3. Requête INSERT ou UPDATE avec saut de ligne
    Par CinErarY dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 02/05/2007, 04h38
  4. [ASP/Flash] Toujours soucis avec sauts de ligne :(
    Par delavega dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 15/12/2006, 18h31
  5. Variable avec saut de ligne à l'intérieur
    Par MaTHieU_ dans le forum Langage
    Réponses: 2
    Dernier message: 09/08/2004, 22h39

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