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 :

Sauvegarde Copie classeur à 2 Onglets


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Par défaut Sauvegarde Copie classeur à 2 Onglets
    Bonjour,

    Après quelques heures de galère, je me résigne à faire appel à la communauté des développeurs

    En effet, je rencontre le problème suivant :

    J'ai un classeur avec un userform qui permet d'alimenter une feuille de ce dit classeur en données. Ces données sont ensuite copiées dans un autre classeur que je créé afin de garder mon classeur source vierge, comme modèle.
    Le classeur qui contient donc le modèle rempli est donc sauvegardé dans un répertoire.
    Là où cela se complique, c'est que dans certains cas, je souhaite ajouter une deuxième feuille, cette feuille provient d'un autre fichier que j'ouvre avec la procédure "getopenfilename".
    Et là problème, je ne parviens plus a enregistrer mon fichier.

    Je pense que le problème vient des "activeworkbook" ou autre déclarations dan ce genre.

    Autre remarque : si je démarre mon userform, que je fais une fois la démarche avec une seule feuille, cela fonctionne ok.
    Puis je le fais avec deux feuilles, cela fonctionne.
    Mais si je démarre le userform et que j'insère la deuxième feuille lors de la première démarche, ça plante. Etrange, c'est comme si un chemin ne se faisait pas.

    Un aperçu des codes :



    Voilà la démarche pour Ajouter la deuxième feuille
    Nota : cette démarche à lieu avant la procédure pour Enregistrer


    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
    Private Sub opendim_Click()
    'on insere un rapport dimensionnel dans une nouvelle feuille du dossier de non conformité
     
    On Error GoTo Fin
     
    Dim rapportdim As Variant
        rapportdim = ""
        rapportdim = Application.GetOpenFilename("Fichier excel(*.xls;*.xlsx;*.xlsm),*.xls;*.xlsx;*.xlsm", Title:="Insertion Rapport Dimensionnel", MultiSelect:=False)
     
     
    If rapportdim <> False Then
     
            Workbooks.Open (rapportdim)
            Worksheets(1).Copy After:=Workbooks("DeclarationNC_V2.xlsm").Sheets("ficheNC")
     
     
    End If
     
    'on ferme le classeur qui a fourni le rapport dimensionnel
    Dim Wbk As Workbook
    Dim AWb As String
     
    AWb = ThisWorkbook.Name
    For Each Wbk In Workbooks
    If Wbk.Name <> AWb Then
    Wbk.Close False
    End If
    Next Wbk
     
    Workbooks("DeclarationNC_V2.xlsm").Activate
    'on renomme la feuille pour signifier la présence d'un rapport dimensionnel
    ActiveWorkbook.Sheets(2).Name = "RapDim"
    ActiveWorkbook.Sheets("ficheNC").Select
     
    canceldim.Locked = False
    opendim.Locked = True
     
    Fin:
     
     
    End Sub

    Ceci est une petite partie de la procédure globale qui se déroule lorsque j'enregistre mon document.
    Et dans laquelle j'appelle la procédure Enregistrer que je joint ci dessous.


    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
            If ExisteFichier(Chemin & ThisWorkbook.Sheets("ficheNC").Range("B5") & "-" & ThisWorkbook.Sheets("ficheNC").Range("D3") & "-" & ThisWorkbook.Sheets("ficheNC").Range("D2") & "-" & Left(ThisWorkbook.Sheets("ficheNC").Cells(3, 2), 1) & ".xlsx") Then
                    'si le fichier existe on affiche un message et la demarche s'interrompt
                    UserForm2.Show
     
                    Else
                            'on enregistre dans un fichier au nom de l'OF
                            enregistrer
     
                            If filesaved = True Then
                            'MsgBox ("fichier exporté")
                            'on exporte l'OF, la date et la description dans une liste (autre fichier excel) via cette fonction
                            exportlist
     
                            'on envoie un mail via outlook via la fonction prévu a cet effet
                            envoimail
     
                            'on initialise le processus
                                    Do Until filesaved = True
                                    Application.Wait Now + TimeValue("00:00:01")
                                    'MsgBox ("attente sauvegarde")
                                    Loop
     
                            initprocess
     
                            Else
                            MsgBox ("fichier NON exporté")
     
     
                            initprocess
     
                            End If
                    End If




    Et voilà donc la fonction pour Enregistrer :

    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
    Function enregistrer()
    'on crée une fonction pour enregister la fiche de non conformité
     
    Dim Chemin As String
    Dim rapexist As Boolean
    filesaved = False
     
    Dim cheminsuite As String
    cheminsuite = ""
     
     
    Application.ScreenUpdating = False
     
    Dim y As Integer
     
            For y = 1 To Sheets.Count
                If Sheets(y).Name = "RapDim" Then
                    rapexist = True
                End If
            Next y
     
        If rapexist = True Then
        'Dans le cas où a un rapport on copie/exporte la nouvelle feuille qui le contient
            Sheets(Array("ficheNC", "RapDim")).Copy
            'MsgBox ("avec rapport")
        Else
     
            Sheets("ficheNC").Copy
            'MsgBox ("SANS rapport")
        End If
     
    Chemin = "Blablabla" *le chemin est bien défini mais ça sert a rien de le diffuser ici
     
    cheminsuite = ActiveWorkbook.Sheets("ficheNC").Range("B5") & "-" & ActiveWorkbook.Sheets("ficheNC").Range("D3") & "-" & ActiveWorkbook.Sheets("ficheNC").Range("D2") & "-" & Left(ActiveWorkbook.Sheets("ficheNC").Cells(3, 2), 1) & ".xlsx"
     
     
            ActiveWorkbook.SaveAs Filename:=Chemin & cheminsuite
            'on memorise le chemin du fichier pour le joindre au mail ou l'utiliser ailleurs
            cheminfichiersauve = ActiveWorkbook.FullName
     
            ActiveWorkbook.Close savechanges:=False
     
    cheminsuite = ""
     
    filesaved = True
     
    End Function
    Je me suis emmêlé les pinceaux quelque part, si vous pouvez m'en sortir je vous en serez reconnaissant !

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonsoir,

    sans entrer dans le détail du code, je te conseille d'éviter les "ActiveWorkbook".

    Ca va toujours te jouer des mauvais tours quand tu lances des macros qui travaillent sur plusieurs classeurs. Tu vas faire un "ActiveWorkbook" en pensant au classeur A, alors que la macro sera sur le classeur B

    tu as plusieurs pistes pour ça :

    1) utiliser des variables auxquelles tu affectes chaque classeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim MonClasseurDeDepart as Workbook
    Dim MonClasseurDeDestination as Workbook
     
    ' attention, il faut que les classeurs soient déjà ouverts !
    ' sinon il faut les ouvrir avant ...
    Set MonClasseurDeDepart = Workbooks("Lenomdetonclasseurdedépart")
    Set MonClasseurDeDestination = Workbooks("Lenomdetonclasseurdedestinatation")
     
    ' ton code
     
    Set MonClasseurDeDepart = Nothing  'toujours libérer la variable après usage
    Set MonClasseurDeDestination = Nothing
    2) Si tu n'as pas beaucoup de manipulations à faire, tu désignes directement le nom de ton classeur. Comme ça aucun problème de mélange

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WorkBooks("Lenomdetonclasseur").Sheets("Lenomdetafeuille").Range...

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Par défaut
    Bonjour,

    Merci pour cette première consigne que j'essaie de mettre en application.
    Toutefois là où je bloque pour cette mise en application c'est à ce niveau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim rapportdim As Variant
        rapportdim = ""
        rapportdim = Application.GetOpenFilename("Fichier excel(*.xls;*.xlsx;*.xlsm),*.xls;*.xlsx;*.xlsm", Title:="Insertion Rapport Dimensionnel", MultiSelect:=False)
     
     
    If rapportdim <> False Then
     
            Workbooks.Open (rapportdim)
            Worksheets(1).Copy After:=Workbooks("DeclarationNC_V2.xlsm").Sheets("ficheNC")
     
     
    End If
    Je n'arrive pas a attribuer le nom "monclasseurdedepart" au fichier que j'ouvre.
    Du coup cela ne marche pas pour la copie et pas non plus pour le fermer, ce qui est logique.

    C'est pour cela que j'essaie de jongler avec les activeworkbook en fait...

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    et pourtant tu l'as à disposition sous le coude à portée de souris ‼
    C'est comme un gamin ne comprenant pas un mot et n'ouvrant pourtant pas le dictionnaire posé devant lui …

    Curseur dans le code positionné sur Workbooks puis touche !

    Ensuite en naviguant, tu dois déboucher sur l'aide de l'objet Workbook,
    ou tu peux directement l'appeler dans la zone de recherche de l'environnement VBA,
    dans laquelle tu accèdes à ses propriétés comme Name par exemple …


  5. #5
    Membre habitué
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Par défaut
    Merci pour vos infos j'ai réussi à nommer les classeurs pour éviter les soucis.
    Toutefois je ne suis pas plus avancé.

    Le code s'arrête toujours sur SaveAs lorsque j'ai 2 feuilles.

    Ne serait-il pas possible qu'un conflit existe entre
    getopenfilename
    et
    saveAs filename:=

    ???

    Le problème ne vient pas du chemin, j'ai testé quelque chose de plus basique cela ne marche pas non plus.
    A moins que cela ne vienne du workbook mais je ne pense pas car il est correctement déclaré que ce soit pour une feuille ou deux feuilles
    Ma cible est donc le saveAs.

    Qu'en pensez vous ? Comment puis je contourner ça ?

    Merci encore

  6. #6
    Membre habitué
    Inscrit en
    Novembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 10
    Par défaut
    il semblerait que j'ai trouvé l'origine du problème !!

    Apparemment cela serait du au contenu des feuilles copiées.
    En effet, pour une feuille contenant uniquement des valeurs tout fonctionne.
    Mais à partir du moment où la feuille contient des images par exemple,
    Le problèle apparait !

    Il faut que je vois pour gérer la copie/sauvegarde avec ces objets.

    EDIT :
    l'enquête avance. Ce ne sont apparemment pas les objets de la feuille mais le format xlsx qui poserait problème.
    En effet j'ai renommé une feuille contenant un objet en .XLS et le problème a disparu.
    Pourtant la version utilisée est bien XL2010.

    Va comprendre

Discussions similaires

  1. Quand je sauvegarde un classeur excel est lent
    Par Subkill dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 18/06/2015, 14h51
  2. [c#][Excel] copie d'un onglet
    Par Zolstead dans le forum C#
    Réponses: 2
    Dernier message: 28/06/2013, 09h51
  3. Sauvegarder un classeur EXCEL à la même version que l'application
    Par jkrtu dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/01/2008, 10h49
  4. Fermer Excel sans sauvegarder le classeur
    Par GonAl dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/08/2006, 12h32
  5. [Excel] Sauvegarder un classeur sans userform
    Par maketossss dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 10/12/2005, 16h41

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