Exporter mise en page en VBA

maryrossignon

XLDnaute Junior
Bonjour le Forum,

A partir d'un classeur, le code ci-dessous me permet d'exporter des sous-totaux dans de nouveaux classeurs par responsable.

Est que quelqu'un pourrait m'aider et me dire comment modifier le code pour qu'il exporte également la mise en page du classeur de départ vers les nouveaux classeurs créés (code créé par BrunoM45) :

Code:
Sub ExportParResponsable()
  Dim DerLig As Long, Lig As Long, LigDeb As Long
  Dim NomResp As String, ShtNew As Worksheet
  Dim VPath As String
  ' Effectuer peut-être un TRI ici
  'Cells.Sort Key1:=Range("K2"), Order1:=xlAscending, _
    Key2:=Range("F2"), Order2:=xlAscending, _
    Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  ' Créer les sous-totaux
  Cells.RemoveSubtotal
  Cells.Subtotal GroupBy:=6, Function:=xlSum, TotalList:=Array(8, 9, 10), _
        Replace:=True, PageBreaks:=True, SummaryBelowData:=True
  ' Exporter chaque groupe du même responsable
  With ActiveSheet
    DerLig = .Range("F" & Rows.Count).End(xlUp).Row - 1
    LigDeb = 2: NomResp = ""
    ' Récupérer le chemin d'accès de ce classeur
    VPath = ActiveWorkbook.Path & "\"
    ' Pour chaque ligne
    For Lig = 2 To DerLig
      ' Mémoriser le nom du responsable
      If NomResp = "" Then NomResp = .Range("K" & Lig)
      ' Si la ligne contient le terme "Total"
      If InStr(1, .Range("F" & Lig), "Total") > 0 Then
        ' Vérifie si la suivante appartient au même RESPONSABLE
        If .Range("K" & Lig + 1) <> NomResp Then
          ' On crée une nouvelle feuille
          Sheets.Add After:=Sheets(Sheets.Count)
          ' On mémorise dans une variable objet
          Set ShtNew = ActiveSheet
          .Range("A1:N1,A" & LigDeb & ":N" & Lig).Copy Destination:=ShtNew.Range("A1")
          ShtNew.Name = NomResp
          ' On déplace la feuille dans un nouveau classeur
          ShtNew.Move
          ' On sauvegarde ce nouveau classeur
          ActiveWorkbook.SaveAs Filename:=VPath & NomResp & "_ECHEANCIER-CLIENTS.xlsx"
          ActiveWorkbook.Close
          ' Mémoriser la nouvelle ligne de départ
          LigDeb = Lig + 1: NomResp = ""
          ' Effacer la variable objet
          Set ShtNew = Nothing
        End If
      End If
    Next Lig
  End With
  ' Petit message
  MsgBox "Exportation terminée !", vbInformation, "Yeeessss"
End Sub

PS : Trouvez ci-joint, un échantillon du fichier en version 2003 mais que j'utilise à la base en version 2007.

Cordialement

MaryR
 

Pièces jointes

  • Classeur1_V2003.zip
    15 KB · Affichages: 52

PMO2

XLDnaute Accro
Re : Exporter mise en page en VBA

Bonjour,

Essayez avec votre macro où le code cerné par des ### a été modifié

Code:
Sub ExportParResponsable_modifPMO()
  Dim DerLig As Long, Lig As Long, LigDeb As Long
  Dim NomResp As String, ShtNew As Worksheet
  Dim VPath As String
  ' Effectuer peut-être un TRI ici
  'Cells.Sort Key1:=Range("K2"), Order1:=xlAscending, _
    Key2:=Range("F2"), Order2:=xlAscending, _
    Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  ' Créer les sous-totaux
  Cells.RemoveSubtotal
  Cells.Subtotal GroupBy:=6, Function:=xlSum, TotalList:=Array(8, 9, 10), _
        Replace:=True, PageBreaks:=True, SummaryBelowData:=True
  ' Exporter chaque groupe du même responsable
  With ActiveSheet
    DerLig = .Range("F" & Rows.Count).End(xlUp).Row - 1
    LigDeb = 2: NomResp = ""
    ' Récupérer le chemin d'accès de ce classeur
    VPath = ActiveWorkbook.Path & "\"
    ' Pour chaque ligne
    For Lig = 2 To DerLig
      ' Mémoriser le nom du responsable
      If NomResp = "" Then NomResp = .Range("K" & Lig)
      ' Si la ligne contient le terme "Total"
      If InStr(1, .Range("F" & Lig), "Total") > 0 Then
        ' Vérifie si la suivante appartient au même RESPONSABLE
        If .Range("K" & Lig + 1) <> NomResp Then
          ' On crée une nouvelle feuille
          
      '##### Modifications PMO #####
          .Copy After:=Sheets(Sheets.Count)
          ' On mémorise dans une variable objet
          Set ShtNew = ActiveSheet
          ShtNew.Cells.Delete
      '#############################
                    
          .Range("A1:N1,A" & LigDeb & ":N" & Lig).Copy Destination:=ShtNew.Range("A1")
          ShtNew.Name = NomResp
          ' On déplace la feuille dans un nouveau classeur
          ShtNew.Move
          ' On sauvegarde ce nouveau classeur
          ActiveWorkbook.SaveAs Filename:=VPath & NomResp & "_ECHEANCIER-CLIENTS.xlsx"
          ActiveWorkbook.Close
          ' Mémoriser la nouvelle ligne de départ
          LigDeb = Lig + 1: NomResp = ""
          ' Effacer la variable objet
          Set ShtNew = Nothing
        End If
      End If
    Next Lig
  End With
  ' Petit message
  MsgBox "Exportation terminée !", vbInformation, "Yeeessss"
End Sub

Cordialement.

PMO
Patrick Morange
 

maryrossignon

XLDnaute Junior
Re : Exporter mise en page en VBA

Bonjour le Forum,
Bonjour Patrick,

Je te remercie pour ta réponse. Effectivement ton code fonctionne mais il prend un temps fou lors de l'exécution.
Dans mon fichier original, il est question d'une vingtaine de responsables et le temps d'exécution est de +/- 1min30 par responsable.
J'ai l'impression qu'il rame au moment du déplacement de la feuille...

Il y aurait-il moyen de corriger cette lenteur ?

Cordialement
MaryR
 

PMO2

XLDnaute Accro
Re : Exporter mise en page en VBA

Bonjour,

J'ai Excel 2003 et cela fonctionne bien chez moi sans le traitement interminable que vous signalez.

A tout hasard, essayez avec le code suivant

Code:
Sub ExportParResponsable_modifPMO2()
Dim DerLig As Long, Lig As Long, LigDeb As Long
Dim NomResp As String, ShtNew As Worksheet
Dim VPath As String
Dim S As Worksheet
Set S = ActiveSheet
' Effectuer peut-être un TRI ici
'S.Cells.Sort Key1:=S.Range("K2"), Order1:=xlAscending, _
  Key2:=S.Range("F2"), Order2:=xlAscending, _
  Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
' Créer les sous-totaux
S.Cells.RemoveSubtotal
S.Cells.Subtotal GroupBy:=6, Function:=xlSum, TotalList:=Array(8, 9, 10), _
      Replace:=True, PageBreaks:=True, SummaryBelowData:=True
' Exporter chaque groupe du même responsable
DerLig = S.Range("F" & S.Rows.Count).End(xlUp).Row - 1
LigDeb = 2: NomResp = ""
' Récupérer le chemin d'accès de ce classeur
VPath = ActiveWorkbook.Path & "\"
' Pour chaque ligne
For Lig = 2 To DerLig
  ' Mémoriser le nom du responsable
  If NomResp = "" Then NomResp = S.Range("K" & Lig)
  ' Si la ligne contient le terme "Total"
  If InStr(1, S.Range("F" & Lig), "Total") > 0 Then
    ' Vérifie si la suivante appartient au même RESPONSABLE
    If S.Range("K" & Lig + 1) <> NomResp Then
      ' On crée une nouvelle feuille
      
  '##### Modifications PMO #####
      S.Copy After:=Sheets(Sheets.Count)
      ' On mémorise dans une variable objet
      Set ShtNew = ActiveSheet
      ShtNew.Cells.Delete
  '#############################
                
      S.Range("A1:N1,A" & LigDeb & ":N" & Lig).Copy Destination:=ShtNew.Range("A1")
      ShtNew.Name = NomResp
      ' On déplace la feuille dans un nouveau classeur
      ShtNew.Move
      ' On sauvegarde ce nouveau classeur
      ActiveWorkbook.SaveAs Filename:=VPath & NomResp & "_ECHEANCIER-CLIENTS.xlsx"
      ActiveWorkbook.Close
      ' Mémoriser la nouvelle ligne de départ
      LigDeb = Lig + 1: NomResp = ""
      ' Effacer la variable objet
      Set ShtNew = Nothing
    End If
  End If
Next Lig
' Petit message
MsgBox "Exportation terminée !", vbInformation, "Yeeessss"
End Sub

N'ayant pas Excel 2007 je n'ai pu faire des tests avec cette version.

Cordialement.

PMO
Patrick Morange
 

maryrossignon

XLDnaute Junior
Re : Exporter mise en page en VBA

Bonjour le Forum,
Bonjour Patrick,

Merci pour ta réponse...
Je n'ai pas d'amélioration lors de l'exécution du code.
La macro fonctionne bien mais toujours aussi lente à partir du déplacement de la feuille.

Serait-il possible dans un premier temps que la nouvelle feuille créée soit en mode paysage ?

BàT
MaryR
 

PMO2

XLDnaute Accro
Re : Exporter mise en page en VBA

Bonjour,

Serait-il possible dans un premier temps que la nouvelle feuille créée soit en mode paysage ?

La ligne de code suivante
Code:
S.Copy After:=Sheets(Sheets.Count)
équivaut à faire la manipulation ci-dessous (qui, a contrario du simple copier/coller d'une feuille, transporte également la mise en page d'impression)

clic gauche MAINTENU sur l'onglet et touche Ctrl MAINTENUE et, avec la souris, glissement déplacement à un endroit libre


Si la feuille d'origine est en mode paysage, la feuille résultante le sera également (tout du moins sous Excel 2003).

Cordialement.

PMO
Patrick Morange
 

Discussions similaires

Réponses
3
Affichages
596
Réponses
7
Affichages
449

Statistiques des forums

Discussions
312 379
Messages
2 087 763
Membres
103 661
dernier inscrit
fcleves