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. #21
    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 mis à jour le code avec tes 2 dernières corrections.

    J'ai également écris une macro 'mise en page' à appliquer à Sheet n°1, puis à reporter sur l'ensemble des onglets créés. Par contre je ne vois pas où l'insérer dans ton code. Peux-tu m'aider?

    Voici ma macro MiseEnPage:

    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
    Sub miseEnPageAvantImpression()
    With Worksheets("Sheet n°1").PageSetup
        .CenterHeader = "&14Age" 'avec la police 14
        .RightHeader = "Patient &A" '&A nom de l'onglet
        .LeftHeader = "&11Altizen"
        .LeftFooter = "Page &P of &N"
        .RightFooter = "&D"
        ' Centrer le contenu de la feuille
        .CenterHorizontally = False
        .CenterVertically = False
        ' en-tête à répéter en haut de chaque page
        .PrintTitleRows = "$1:$1"
        ' taille des marges
        .LeftMargin = Application.InchesToPoints(0.2)
        .RightMargin = Application.InchesToPoints(0.2)
        .TopMargin = Application.InchesToPoints(1.2)
        .BottomMargin = Application.InchesToPoints(1.2)
        .HeaderMargin = Application.InchesToPoints(0.2)
        .FooterMargin = Application.InchesToPoints(0.2)
        ' orientation de la page
        .Orientation = xlLandscape
        End With
    End Sub
    Merci à toi!

  2. #22
    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 977
    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 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il me semble ou bien je n'ai rien compris que ce sont les feuilles "splitées" qui doivent avoir un titre.
    Si c'est le cas, première chose à faire de toute les manières est de créer une procédure avec arguments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sub miseEnPageAvantImpression(sheetName As String)
     With Worksheets(sheetName).PageSetup
    J'ai simplement affiché les deux premières ligne de la procédure que tu as écrite parce-que ce sont les seules à modifier.
    et appeler cette procédure dans la boucle de l'étape 3 de la procédure ExportDataByAdvancedFilter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     ' Etape 3 - Boucle qui invoque la procédure d'exportation [ExportRange]
     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
      miseEnPageAvantImpression rngList.Offset(r) ' Appel de a procédure MiseEnPage
     Next
    Petit bémol, c'est très lent.
    C'est malheureusement le cas avec le code de mise en page.
    As-tu besoin de toutes les propriétés de mise en page que tu as placé dans ton code ?
    Je n'ai pas examiné l'ensemble de cette procédure.

    Si maintenant c'est vraiment la feuille source [Sheet N°1] qui doit recevoir la mise en page, la procédure doit être appelée d'un autre endroit

  3. #23
    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,

    ça marche très bien, c'est exactement ce que je voulais obtenir! Un grand merci à toi encore.

    Par contre, en effet comme tu le soulignes, avec la mise en page, c'est très très trsè long! Et encore, je n'ai testé que sur la création de 20 onglets (et pas sur 600 comme je vais devoir faire).

    Mise à part cette lenteur, ce post est résolu, grâce à toi!


    Es-tu ok, pour que je mette sur le forum tout le code que tu m'as donné?

  4. #24
    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 977
    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 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    Citation Envoyé par aude_alti Voir le message
    Philippe,
    Es-tu ok, pour que je mette sur le forum tout le code que tu m'as donné?
    Avec plaisir.
    Il n'y a jamais de problème du moment que l'on cite l'auteur ou sa participation active quand c'est le cas.
    Par contre, en effet comme tu le soulignes, avec la mise en page, c'est très très trsè long! Et encore, je n'ai testé que sur la création de 20 onglets (et pas sur 600 comme je vais devoir faire).
    Avec 600 onglets, je pense que tu peux aller boire un ou deux cafés.
    Pour ce problème là, il y aurait une solution mais cela demande une modification du code.
    Au lieu de créer une feuille pour chaque groupe et effectuer la mise en page dans la boucle.
    Créer un modèle (feuille vierge mais avec la mise en page souhaitée) et faire une copie de cette feuille modèle en la renommant du nom du groupe et ensuite faire l'exportation.
    Cette feuille modèle peut-être cachée et crée dynamiquement ou pas.

    Bonjour,
    J'ai adapté la procédure pour l'utilisation d'une feuille modèle.
    Je crois que l'essayer c'est l'adopter (au niveau vitesse il n'y a pas photo).
    Ci-dessous la nouvelle version du code où j'ai donc ajouté un argument facultatif TemplateSheet qui est de type Objet WorkSheet
    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
    66
    Sub ExportRange(SourceData As Range, areaCriteria As Range, TargetSheetName As String, Optional ClearSheet As Boolean = True, Optional TemplateSheet As Worksheet)
     ' 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
     '   La liste exportée est fait sur la première ligne
     ' Author  : Philippe Tulliez http://philippe.tulliez.be
     ' Date    : 2013/03/27 (2013/03/22 v 1.0)
     ' Version : 3.1
     ' 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
     '            2.3 - Ajouté ctrl du nombre de colonne et sortie de procédure
     '            3.1 - Ajouté argument Template
     ' 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
     ' [TemplateSheet] - (obj WorkSheet) Feuille modèle
     Const ver As String = "V 3.0"
     Const ErrTitle As String = "Procédure - ExportRange " & ver
     Dim ErrMsg As String: ErrMsg = "*** Sortie de procédure ***" & vbCrLf & vbCrLf
     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
     ' Création de la feuille
     Select Case TemplateSheet Is Nothing
       Case True ' Création feuille
         wkb.Sheets.Add Before:=Sheets(1)
       Case False
        TemplateSheet.Copy Before:=Sheets(1)
        Debug.Print "Copie modèle " & TemplateSheet.Name
     End Select
     On Error Resume Next
     wkb.Sheets(1).Name = TargetSheetName
     '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))
         If nbRow > 1 And rngTarget.CurrentRegion.Columns.Count <> SourceData.Columns.Count Then
          ErrMsg = ErrMsg & "Feuille [" & shtTarget.Name & "] nombre de colonnes différent de la source"
          MsgBox ErrMsg, vbOKOnly, ErrTitle
          Set shtTarget = Nothing: Set rngTarget = Nothing: Set wkb = Nothing
          Exit Sub
         End If
         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: ' Supprime le titre si upgrade
     ' 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
    J'avais aussi ajouté cet après-midi un test de nombre de colonnes ce qui est plus prudent si on ajoute des informations avec des colonnes qui auraient été ajoutées ou supprimées.
    Il manque le test de concordance des étiquettes de colonnes (même nombre mais pas même libellé)
    Pour appeler la procédure s'il y a une feuille modèle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExportRange rngData, rngCriteria, rngList.Offset(r), ClearSheet:=False, TemplateSheet:=shtTemplate
    ou, s'il y a lieu de recommencer à zéro avec les listes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExportRange rngData, rngCriteria, rngList.Offset(r), TemplateSheet:=shtTemplate
    Il faut bien entendu créer l'objet modèle (la feuille se nomme Template et a été crée manuellement et n'a que l'en-tête et pied de page.
    En rouge les lignes à ajouter dans la procédure ExportDataByAdvancedFilter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub ExportDataByAdvancedFilter()
     ' Procédure de création de feuilles
     ' avec exportation de données filtrées
     '
     ' Déclaration + Initialisation des variables
     Const ParamName = "_ParamWrk"
     Const TemplateName = "Template" ' Nom de la feuille modèle
     Dim rngList As Range, rngData As Range, rngCriteria As Range, r As Long
     Dim shtParam As Worksheet, shtTemplate As Worksheet
     Dim wkb As Workbook: Set wkb = ThisWorkbook
     Set shtTemplate = wkb.Worksheets(TemplateName) ' Feuille modèle
    Le classeur démo sur demande

  5. #25
    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 C'est super!
    Bonjour Philippe,

    Je n'ai qu'un mot : Magique!!!

    En effet, il n'y a pas photo ;-)

    Merci énormément pour tout le travail que tu as fais, j'ai repris entièrement ton code, sans adaptation! Il va beaucoup me servir!

  6. #26
    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 977
    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 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    Bonjour Aude et ravi d'avoir pu t'aider

  7. #27
    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, quand j'ai fait le test ce matin avec ton dernier code et la feuille template, je n'ai pas fait appel à la fonction MiseEnPageAvantImpression et je n'ai pas fait attention à ce moment-là mais les onglets créés n'avaient pas de mise en forme...tu confirmes que bien qu'on passe maintenant par une feuille template, il faut toujours faire appel à MiseEnPageAvantImpression ?

    Merci à toi!

    ah zut, je suis perdu! Je ne trouve plus ce que j'avais ce matin...

    En fait la mise en page des onglets créés n'a rien à voir avec celle de 'Template' :-( ( et ce en ne faisant pas appel à MiseEnPageAvantImpression). Je ne vois même pas les pieds de page et en-tête de Template dans les onglets créés. Je ne comprends pas le problème, j'étais sûr que c'était bon ce matin.

    Je vais chercher un peu plus mais si j'ai bien compris:
    --l'entête et le pied de page sont recopiés à partir de 'Template' lors de la création des onglets (mais je ne vois pas la ligne qui fait ça)
    --on doit faire appel à MiseEnPageAvantImpression pour : les en-têtes à répéter en debut de feuille, les marges et le sens de l'impression soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        .PrintTitleRows = "$1:$1"
        ' taille des marges
        .LeftMargin = Application.InchesToPoints(0.2)
        .RightMargin = Application.InchesToPoints(0.2)
        .TopMargin = Application.InchesToPoints(0.2)
        .BottomMargin = Application.InchesToPoints(0.2)
        .HeaderMargin = Application.InchesToPoints(0.2)
        .FooterMargin = Application.InchesToPoints(0.2)
        'orientation paysage
        .Orientation = xlLandscape

  8. #28
    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 977
    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 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    Bonjour Aude,
    Citation Envoyé par aude_alti Voir le message
    Philippe, quand j'ai fait le test ce matin avec ton dernier code et la feuille template, je n'ai pas fait appel à la fonction MiseEnPageAvantImpression et je n'ai pas fait attention à ce moment-là mais les onglets créés n'avaient pas de mise en forme...tu confirmes que bien qu'on passe maintenant par une feuille template, il faut toujours faire appel à MiseEnPageAvantImpression ?
    Merci à toi!
    Je confirme qu'il ne faut pas utiliser la procédure MiseEnPageAvantImpression.
    La procédure telle que je l'ai écrite fait une copie d'une feuille modèle nommée [Template] qui peut être masquée ou pas et qui est vide de toute valeur dans les cellules mais qui a une mise en page telle que tu l'as définie dans ta procédure MiseEnPageAvantImpression.
    Donc une fois que cette mise en page est faite, comme les valeurs exportées le sont dans une copie de la feuille modèle, elle a forcément la mise en page de la feuille modèle.
    Le nom donné à la feuille modèle peut bien entendu être libre.
    Il faut juste passer l'objet feuille par l'argument TemplateSheet à la procédure ExportRange
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExportRange rngData, rngCriteria, rngList.Offset(r), ClearSheet:=False, TemplateSheet:=shtTemplate
    [EDIT]Je réaffiche les deux procédures
    Donc la feuille modèle [Template] DOIT avoir reçu la mise en page désirée que l'on peut faire manuellement ou par procédure.
    Mais une fois faite, il n'y a plus de raison de la modifier.
    Procédure de début nommée ExportDataByAdvancedFilter
    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
    Option Explicit
    Const shtName = "Sheet n°1"
    Sub ExportDataByAdvancedFilter()
     ' Procédure de création de feuilles
     ' avec exportation de données filtrées
     '
     ' Déclaration + Initialisation des variables
     Const ParamName = "_ParamWrk"
     Const TemplateName = "Template" ' Nom de la feuille modèle
     Dim rngList As Range, rngData As Range, rngCriteria As Range, r As Long
     Dim shtParam As Worksheet, shtTemplate As Worksheet
     Dim wkb As Workbook: Set wkb = ThisWorkbook
     Set shtTemplate = wkb.Worksheets(TemplateName) ' Feuille modèle
     Application.ScreenUpdating = False
     ' 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
     With shtParam
      Set rngList = .Range("A1"): Set rngCriteria = .Range("C1:C2")
     End With
     Set rngData = wkb.Worksheets(shtName).Range("A1").CurrentRegion
     ' Etape 2 - 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 3 - Boucle qui invoque la procédure d'exportation [ExportRange]
     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, TemplateSheet:=shtTemplate
     Next
     ' Etape 5 - 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
    Procédure ExportRange
    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
    66
    67
    68
    69
    Sub ExportRange(SourceData As Range, areaCriteria As Range, TargetSheetName As String, Optional ClearSheet As Boolean = True, Optional TemplateSheet As Worksheet)
     ' 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
     '   La liste exportée est fait sur la première ligne
     ' Author  : Philippe Tulliez http://philippe.tulliez.be
     ' Date    : 2013/03/27 (2013/03/22 v 1.0)
     ' Version : 3.1
     ' 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
     '            2.3 - Ajouté ctrl du nombre de colonne et sortie de procédure
     '            3.1 - Ajouté argument Template
     '            3.2 - Modif pour Template invisible - Ajouté Variable isSheetVisible
     ' 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
     ' [TemplateSheet] - (obj WorkSheet) Feuille modèle
     Const ver As String = "V 3.0"
     Const ErrTitle As String = "Procédure - ExportRange " & ver
     Dim ErrMsg As String: ErrMsg = "*** Sortie de procédure ***" & vbCrLf & vbCrLf
     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, isSheetVisible As Boolean
     ' Création de la feuille
     Select Case TemplateSheet Is Nothing
       Case True ' Création feuille
         wkb.Sheets.Add Before:=Sheets(1)
       Case False
        With TemplateSheet
         isSheetVisible = .Visible: .Visible = xlSheetVisible
         .Copy Before:=Sheets(1) ': Sheets(1).Visible = True
         .Visible = isSheetVisible
        End With
     End Select
     On Error Resume Next
     wkb.Sheets(1).Name = TargetSheetName
     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))
         If nbRow > 1 And rngTarget.CurrentRegion.Columns.Count <> SourceData.Columns.Count Then
          ErrMsg = ErrMsg & "Feuille [" & shtTarget.Name & "] nombre de colonnes différent de la source"
          MsgBox ErrMsg, vbOKOnly, ErrTitle
          Set shtTarget = Nothing: Set rngTarget = Nothing: Set wkb = Nothing
          Exit Sub
         End If
         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: ' Supprime le titre si upgrade
     ' 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
    Classeur démo sur demande

  9. #29
    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,

    je veux bien que tu m'envoies le classeur Demo car même en réutilisant les 2 procédures que tu viens de poster j'ai des soucis :
    lors de la création des onglets
    --la tailles des colonnes n'est pas celle de Template
    --seule la première colonne de Sheet n°1 est recopiée dans les onglets

    Est-ce que j'ai fait une mauvaise manip?

  10. #30
    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 977
    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 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    Voici le classeur.
    Je n'ai pas terminé toute la présentation mais je crois que cela suffira pour l'instant.
    La feuille [Accueil] est protégée pour éviter la perte de formatage mais de toute manière n'a aucune incidence dans le processus.
    J'ai modifié le nom de la procédure (ExportToRange) par ExportToSheet qui me semble plus logique.

    Je rappelle que la feuille [Template] peut être masquée.
    Fichiers attachés Fichiers attachés

  11. #31
    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,

    Super ce travail et quelle présentation...ça me fait rêver!

    Bon, mais je vais t'embêter encore...en plus tout ce que tu me proposes ou me montres me pousse toujours à en faire plus et donc à t'embêter plus!

    Tu as raison, une fois la mise en page de l'onglet figée, il n'y a plus raison d'y toucher, du coup, c'est intéressant de le masquer. Ce que j'ai fait.

    J'ai donc lancé la macro à partir de ton classeur, et ça marche très bien. J'ai alors copier coller ton code dans mon classeur et lancer la macro sur mes données et j'ai une erreur au niveau de 'shtName' dans la ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set rngData = wkb.Worksheets(shtName).Range("A1").CurrentRegion
    Le message d'erreur est 'erreur de compilation, constante requise'.


  12. #32
    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 977
    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 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    Aude,

    shtName est une constante qui se trouve en début de module et qui contient comme valeur le nom de la feuille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Option Explicit
    Const shtName = "Sheet n°1"
    Sub ExportDataByAdvancedFilter()

  13. #33
    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
    Ma feuille qui contient les données à exporter s'appelle bien : Sheet n°1...

    Edit: ah je viens de voir que tu as répondu, je vais regarder ta réponse. Merci

    Oui, j'ai bien vérifié, ma feuille est 'Sheet n°1'.

    et j'ai bien, en tout début de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Option Explicit
    Const shtName = "Sheet n°1"
    Sub ExportDataByAdvancedFilter()

  14. #34
    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 977
    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 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    C'est peut-être le classeur représenté par la variable objet wkb.
    Dans ma démonstration, c'est le classeur où se trouve le code VBA.
    [EDIT]
    Les données contenues dans la feuille [Sheet n°1] commencent bien à la cellule A1 avec les étiquettes de colonnes en ligne 1 ?

  15. #35
    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
    Alors j'ai reessayer dans un autre classeur et d'autres données et là je n'ai plus de message d'erreur mais comme dans mon post juste avant, la taille des colonnes n'est pas conservée et seule la colonne A de Sheet n°1 est recopiée dans les onglets créés (les colonnes B, C, D ..etc ne sont pas recopiées).

    En fait, j'utilise 3 classeurs de tailles différentes (ces classeurs seront mis à jour régulièrement): Ils ont entre 1 et 100 000 lignes.
    Ils n'ont pas le même nombre de colonnes. La Sheet n°1 du classeur 1 a 5 colonnes, la Sheet n°1 du classeur 2 a 7 colonnes et la Sheet n°1 du classeur 3 a 8 colonnes.

    Penses-tu que ce nombre de colonnes peut-être à l'origine du problème?

    Citation Envoyé par Philippe Tulliez Voir le message
    Les données contenues dans la feuille [Sheet n°1] commencent bien à la cellule A1 avec les étiquettes de colonnes en ligne 1 ?
    Oui tout à fait.

  16. #36
    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 977
    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 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    Aude,

    Ah oui, c'est plus clair maintenant. Les colonnes exportées dans les feuilles crées doivent avoir le même nombre de colonnes voir mon intervention d'hier 18h25.
    J'avais aussi ajouté cet après-midi un test de nombre de colonnes ce qui est plus prudent si on ajoute des informations avec des colonnes qui auraient été ajoutées ou supprimées.
    Il manque le test de concordance des étiquettes de colonnes (même nombre mais pas même libellé)
    Pour appeler la procédure s'il y a une feuille modèle.
    Il faudra m'expliquer comment tu procèdes, il faudra peut-être utiliser la méthode de consolidation.
    Pour l'exportation, avec cette méthode, les données exportées doivent avoir le même nombre de colonnes si elles viennent à la suite des autres.
    C'est normal, une liste doit être cohérente.
    Malheureusement, je ne peux plus m'occuper de cela maintenant et demain certainement pas avant midi.

  17. #37
    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
    Citation Envoyé par Philippe Tulliez Voir le message
    Malheureusement, je ne peux plus m'occuper de cela maintenant et demain certainement pas avant midi.
    Ok, je comprends, pas de soucis, à demain après-midi peut-être (je serai là ).

    D'ici là, je vais essayer de comprendre où intervient le nombre de colonnes!

    J'avais aussi ajouté cet après-midi un test de nombre de colonnes ce qui est plus prudent si on ajoute des informations avec des colonnes qui auraient été ajoutées ou supprimées.
    Ca veut dire qu'il faudrait supprimer ce code si mon nombre de colonnes n'est pas fixe?
    Ce nombre de colonne sera fixe par classeur.

  18. #38
    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 977
    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 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    Bonjour Aude,
    Ce que je veux dire, c'est que le nombre de colonne et normalement les étiquettes de champs de la liste de données de la feuille [Sheet N°1] doivent être absolument identique que ceux des feuilles crées dynamiquement par le programme (feuille 100, 103, 105 pour notre exemple).

  19. #39
    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,

    Je suis d'accord avec toi.

    Le nombre de colonnes de Sheet n°1 est égal au nombre de colonne de Template et de 100, 101, 102, 103 et 105 dans ton exemple.


    Mais du coup, si je copie/colle ton code dans un autre classeur où :

    nombre de colonne 'Sheet n°1' = nombre de colonne 'Template' = 8

    ça ne fonctionne pas?

    Ton code fonctionne pour
    nombre de colonne 'Sheet n°1' = nombre de colonne 'Template' = 4
    comme dans ton classeur?

    je vais essayer ton code dans un nouveau classeur avec :

    nombre de colonne 'Sheet n°1' = nombre de colonne 'Template' = 4

    Et je reviens vers toi



    alors avec le classeur à 4 colonnes, j'obtiens la même chose qu'avec mes données:

    Les onglets créés ne contiennent que la colonne A, leur mise en page est celle de Template sauf la taille des colonne qui elle n'est pas respectée.

    Je ne comprends pas pourquoi ça fonctionne bien sur ton classeur et dès que je copie/colle sur un autre classeur avec le même nombre de colonnes ou un nombre de colonnes différents j'obtiens ce que je décris dans les lignes ci-dessus...

    Je dois sûrement faire une fausse manip mais je ne vois pas laquelle?

  20. #40
    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 977
    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 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Sans rien toucher à mon code, j'ai changé les données dans [Sheet N°1] et cela fonctionne parfaitement
    J'ai donc une liste de données avec neuf colonnes et la première colonne contient des états civils (M, C, D, V).
    Il y a bien quatre feuilles nommées respectivement M, C, D, V avec les données filtrées correctement avec les sept colonnes.
    Est-ce que tu as bien les données de rupture (qui servent à la création des feuilles) en première colonne.
    Sinon il faut apporter une modification au programme.
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/10/2012, 20h59
  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, 10h27
  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, 05h38
  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, 19h31
  5. Variable avec saut de ligne à l'intérieur
    Par MaTHieU_ dans le forum Langage
    Réponses: 2
    Dernier message: 09/08/2004, 23h39

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