XL 2013 Exportation onglet avec condition

ismailo

XLDnaute Nouveau
Bonsoir à tous,
dans mon dossier que vous trouverez ci-joint j'ai 2 fichiers.
mon fichier principal est ODA qui comporte 3 onglets
ce que je souhaite avoir c'est historizer mes informations de chaque mois avant de passer au mois d'après par un code VBA comme ceci :
  1. exporter l'onglet ODA MO dans le fichier MO (qui contient déjà les feuilles 08-16 et 09-16) en mettant 10-16 comme nom de l'onglet exporté qu'on va prendre de la cellule G1 de l'onglet ODA MO et on va le mettre après l'onglet 09-16
  2. si on change 10-2016 par 11-2016 dans la cellule G1 de ODA MO il fera l'exportation de la même manière par contre si on change toutes les information et on garde 10-2016 il fera juste une mise à jour de l'onglet exporté
  3. Si le fichier MO n'existe pas dans le même dossier que ODA MO, le code doit créer le fichier avec 10-16 comme premier onglet pour commencer l'historique
  4. l’exportation des cellules qui contiennent les sommes en bas du tableau je ne souhaite pas le faire (H17,H18,L17,L18,O17,O18) toute en sachant de ces cellules sont variables

Cordialement
ISMAILO
 

Pièces jointes

  • ODA.xlsx
    26.9 KB · Affichages: 56
  • MO.xlsx
    20 KB · Affichages: 47
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour ismailo,

Vous n'avez pas de réponse car le but du forum n'est pas de réaliser un projet clé en main mais d'aider sur des points précis.

Par ailleurs ce que vous voulez faire est bien lourd pour pas grand-chose.

Il vous suffit quand vous désirez créer un nouveau mois de créer un nouveau tableau (vide ?) à droite du précédent.

Que vous renseignerez tranquillement jusqu'au prochain mois.

Nombreux exemples sur le forum.

A+
 

ismailo

XLDnaute Nouveau
Bonsoir job,
Ce n'est pas un projet je veux juste faire l'exportation de l'onglet oda mo après le dernier mois du fichier Mo et le nom sera celui de la cellule G1..
Je ne veux pas le créer dans mon tableau chaque fois à la main je voulais que ce soit automatique mais bon.
Je me suis adressé à ce forum parce que je pensais que vous pouviez m'aider même si je suis nul en Vba... Je ne savais pas que je devais connaitre un peu en vba
En tout cas merci beaucoup pour votre réponse

Je vous souhaite une bonne soirée

Cordialement
Ismailo
 

job75

XLDnaute Barbatruc
Re,

Pour illustrer ce que j'ai dit voyez le fichier joint et cette petite macro :
Code:
Sub Nouveau_Tableau()
'se lance par Ctrl+T
Dim dercol%
dercol = Cells(4, Columns.Count).End(xlToLeft).Column
Columns(dercol - 17).Resize(, 19).Copy Columns(dercol + 2)
Cells(1, dercol + 8) = Left(Cells(1, dercol - 11), Len(Cells(1, dercol - 11)) - 7) & "MM-AAAA"
Cells(4, dercol + 2).CurrentRegion.Resize(, 18).Offset(2, 1) = "" 'RAZ
Application.Goto Cells(1, dercol + 2), True 'cadrage
End Sub
Un nouveau tableau (vide) est créé sur n'importe quelle feuille.

Bonne fin de soirée.
 

Pièces jointes

  • ODA(1).xlsm
    36.2 KB · Affichages: 39

ismailo

XLDnaute Nouveau
Re Job,
merci beaucoup pour votre réponse mais ce que je souhaite ce n'est pas vider le même tableau,
mais d'exporter mon tableau vers un nouveau fichier
s'il existe et il s'appelle MO, mettre l'onglet exporter en dernier et son nom portera la date trouvé dans la cellule G1
s'il n'existe pas il se crée avec MO le nom du classeur et l'onglet portera le nom de la date de G1

exemple : dans les deux fichiers que j'ai joint dans mon premier post :
l'onglet ODA MO doit être exporté dans MO et portera comme nom 10-16 tout en excluant les cellules d'en bas qui comportent les sommes

je ne sais pas si ce serait possible de le faire mais je vous en serais éternellement reconnaissant si vous m'aider à faire ça

Bonne fin de soirée
 

job75

XLDnaute Barbatruc
Bonjour ismailo, le forum,

J'ai pourtant été clair :
Par ailleurs ce que vous voulez faire est bien lourd pour pas grand-chose.
Puisque vous voulez construire une usine à gaz, continuez tout seul, au moins vous apprendrez le VBA.

Mais pour les happy few je continue avec cette macro dans chaque feuille pour naviguer sur les mois créés :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, mois$
Set r = [Mois_MO] 'liste nommée, à adapter pour chaque feuille
mois = Right(Target(1), 7)
If IsDate(mois) Then
  If Target.Row = 1 Then
    If IsError(Application.Match(mois, r, 0)) Then
      r(1).Offset(r.Count) = mois
      r.Resize(r.Count + 1).Name = r.Name.Name 'renomme la liste
    End If
  ElseIf Target.Row = 2 Then
    Set r = Rows(1).Find(mois, , xlValues, xlPart)
    If r Is Nothing Then Exit Sub 'si le mois n'est pas trouvé
    Application.Goto r.Offset(, -6), True 'cadrage
    ActiveCell(2, 2).Select
    Application.EnableEvents = False 'désactive les évènements
    ActiveCell = mois
    Application.EnableEvents = True 'réactive les évènements
  End If
End If
End Sub
J'ai aussi modifié la macro (dans Module1) pour créer un nouveau mois :
Code:
Sub Nouveau_Mois()
'se lance par Ctrl+M
If ActiveSheet.Name Like "Liste*" Then Exit Sub 'feuille à exclure
Dim dercol%, OldMois$, NewMois$
dercol = Cells(4, Columns.Count).End(xlToLeft).Column
OldMois = Right(Cells(1, dercol - 11), 7)
If Not IsDate(OldMois) Then
  Application.Goto Cells(1, dercol - 17), True 'cadrage
  Cells(1, dercol - 11).Select
  MsgBox "Le dernier mois en " & Cells(1, dercol - 11).Address(0, 0) & " est incorrect..."
  Exit Sub
End If
Columns(dercol - 17).Resize(, 19).Copy Columns(dercol + 2)
NewMois = Format(DateAdd("m", 1, OldMois), "mm-yyyy") 'incrémentation
Cells(1, dercol + 8) = Replace(Cells(1, dercol + 8), OldMois, NewMois)
Cells(4, dercol + 2).CurrentRegion.Resize(, 18).Offset(2, 1) = "" 'RAZ
Cells(2, dercol + 3) = NewMois 'lance la macro Worksheet_Change pour le cadrage
End Sub
Fichier (2).

A+
 

Pièces jointes

  • ODA(2).xlsm
    46.9 KB · Affichages: 40

ismailo

XLDnaute Nouveau
Bonjour Job,
merci beaucoup pour votre réponse, le code que vous m'avez fourni je vais l'utiliser dans un autre exemple
en revanche j'ai pu avoir une grande partie de la réponse dans le code que vous pouvez constater ci-dessous

VB:
Sub exporter()
Dim nbf As Byte
Dim nom As String
Dim dlg As Integer
nom = Right(ThisWorkbook.Sheets("ODA MO").Range("G1"), 7)
With Workbooks("MO.xlsx")
    nbf = .Sheets.Count
    ThisWorkbook.Sheets("ODA MO").Copy After:=.Sheets(nbf)
    For i = 1 To nbf
        If Sheets(i).Name = nom Then Application.DisplayAlerts = False: Sheets(i).Delete
    Next
    .ActiveSheet.Name = nom
    lg = .ActiveSheet.Range("A" & .ActiveSheet.Rows.Count).End(xlUp).Row + 3
    .ActiveSheet.Rows(lg & ":" & lg + 1).Delete
End With
End Sub

mais il a besoin de quelques modifications si c'est possible:
  • premièrement il m'oblige à ce que MO soit ouvert pour faire l'exportation alors que normalement il doit ouvrir et fermer le fichier Mo tout seul
  • si MO n'existe pas dans le même dossier, il faut le créer et mettre l'onglet exporté comme premier onglet
  • coller les informations en valeur sans formules
  • supprimer les drawings objects
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour ismailo, le forum,

J'ai cru comprendre que vous voulez faire des statistiques pour chaque année.

Avec plusieurs fichiers contenant plusieurs feuilles ce sera bien difficile !

Alors que c'est facile (et par formules) quand tous les mois sont dans une même feuille.

Voyez ce fichier (3), bien sûr j'ai enlevé ce qui était sous les tableaux, je l'ai mis au-dessus.

Bonne journée.
 

Pièces jointes

  • ODA(3).xlsm
    54.3 KB · Affichages: 40

ismailo

XLDnaute Nouveau
Bonjour Job,
non je ne veux pas faire des statistiques, mais plutot historiser les données de chaque mois dans un fichier à part.
l'onglet ODA MO est un onglet principal il doit garder un seul tableau je ne dois pas le toucher ni rajouter dedans d'autres tableaux
et le code VBA va me permettre d'exporter l'onglet ODA MO dans un fichier MO et lui donner comme nom la date qui se trouve dans la cellule G1.
le mois d'après ODA MO restera le même c'est juste les données et les lignes et la date que je vais changer manuellement et par la suite quand je fini mon travail le code va exporter l'onglet à nouveau dans le même fichier MO et lui donner comme nom la date de G1
comme ça par la suite dans MO j'aurais chaque moi avec son tableau

j'ai amélioré le code d'hier mais il bug 10 fois avant de fonctionner, et parfois le fichier même bug
je ne sais pas comment l'optimiser

VB:
Sub exporter()
Application.ScreenUpdating = False
Dim nbf As Byte
Dim nom As String, chemin As String, fichier As String
Dim dlg As Integer
nom = Right(ThisWorkbook.Sheets("ODA MO").Range("G1"), 7)
chemin = ThisWorkbook.Path & "/"
fichier = "MO.xlsx"
On Error Resume Next
Workbooks.Open Filename:=chemin & fichier
If Err > 0 Then
   If MsgBox("Le fichier M0 n'existe pas !. Voulez vous le creer ?", vbYesNo + vbQuestion + vbDefaultButton2) = vbYes Then
        Workbooks.Add: ActiveWorkbook.SaveAs chemin & fichier
   Else: Exit Sub
   End If
End If
On Error GoTo 0
With Workbooks(fichier)
    nbf = .Sheets.Count
    ThisWorkbook.Sheets("ODA MO").Copy After:=.Sheets(nbf)
   For i = 1 To nbf
       If Sheets(i).Name = nom Then Application.DisplayAlerts = False: Sheets(i).Delete
   Next
   With .ActiveSheet
        .Name = nom
        lg = .Range("A" & .Rows.Count).End(xlUp).Row + 3
        .Rows(lg & ":" & lg + 1).Delete
        .DrawingObjects.Delete
   End With
    .Save
    .Close
End With
End Sub


EDIT: j'ai rajouté <<Application.ScreenUpdating = False>> au début de la macro

les points que je compte rectifier :
1-après l'exportation le code garde les liens entre les feuilles chose qu'il faut pas

2-si MO ne se trouve pas dans le même dossier que ODA, le code crée bien le fichier MO avec l'onglet souhaité par contre il rajoute aussi l'onglet Feuil1 chose qu'il ne faut pas

3-le nom de l'onglet ajouté qui est bien la date de G1 s'écrit de cette manière 10-2016 alors que je souhaite qu'elle soit comme ça 10-16


Merci d'avance pour votre aide
 
Dernière édition:

job75

XLDnaute Barbatruc
Re,
non je ne veux pas faire des statistiques
Si vous ne faites aucun traitement sur les données stockées il n'y a aucun intérêt de créer des fichiers Excel avec plein de feuilles.

Il est alors beaucoup plus simple de créer des fichiers PDF, un pour chaque mois :
Code:
Sub ExportPDF()
'se lance par Ctrl+E
Dim chemin$, nom$
chemin = ThisWorkbook.Path & "\" 'adapter éventuellement
nom = ActiveSheet.Name
If Not nom Like "ODA *" Then Exit Sub 's'il y a d'autres feuilles
nom = Split(nom)(1) & Right([G1], 5) & "-" & Left(Right([G1], 7), 2)
Range([A1], [A5].CurrentRegion.Resize(, 18)).ExportAsFixedFormat xlTypePDF, chemin & nom
End Sub
Les noms des fichiers créés sont de la forme MO-2016-10 pour qu'ils soient classés dans le répertoire par ordre chronologique des mois.

Fichier joint.

A+
 

Pièces jointes

  • ODA Export PDF(1).xlsm
    39.9 KB · Affichages: 34

ismailo

XLDnaute Nouveau
re,
mon cher Job
c'est pas des PDF que je désire mais un seul fichier avec des onglets exportés parce que en fin d'année je vais copier chaque mois dans un logiciel du coup je dois avoir le même tableau d'origine dans l'onglet exporté

le dernier code fonctionne et le résultat qu'il donne que je souhaite je voudrais juste que vous m'aidez a rectifier les trois point que j'ai cité dans mon dernier post s'il vous plait
 

Discussions similaires

Statistiques des forums

Discussions
312 389
Messages
2 087 933
Membres
103 678
dernier inscrit
bibitm