Copie valeurs

Bonjour,

Je bloque sur une macro en VBA , je voudrais faire une macro qui copie la première feuille excel de mon classeur dans un autre classeur nommé "archivage" contenu dans un dossier , mais en ne collant que les valeurs des cellules et les graphes , et puis répéter l'opération plusieurs fois ( c-a-d exporter plusieurs feuilles dans le classeur "archivage")
merci d'avance pour votre aide.

4 réponses

  1. Modérateur
    Bonjour,

    Avez-vous essayé via l'enregistreur de macro?

    1. Oui en fait j'ai utilisé l'enregistreur des macros et qui me donne le code suivant :
      Sub exportindic3()
      '
      ' exportindic3 Macro
      '
      
      '
          Sheets("Indicateurs ").Select
          
          Sheets("Indicateurs ").Copy After:=Workbooks("Archivage.xlsx").Sheets(1)
          Windows("indicateurs last 8.xlsm").Activate
          Cells.Select
          Range("J6").Activate
          Selection.Copy
          Windows("Archivage.xlsx").Activate
          Range("A1").Select
          Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
              xlNone, SkipBlanks:=False, Transpose:=False
      End Sub


      - le probleme c'est que je doit ouvrir le fichier cible pour pouvoir exporter mes feuilles , en plus les graphes contenus dans mon fichier source ("indicateurs") se mettent à jour automatiquement après chaque export chose que je ne veut pas !
      merci d'avance
      1. Modérateur
        Bonjour,

        Tout d'abord :
        Lorsque vous placez du code sur notre forum, merci d'utiliser les balises code à votre disposition.
        Le mode d'emploi (au cas ou) est ICI.

        Première étape :
        Ensuite, nous allons travailler avec deux classeurs. Pour ne pas nous mélanger les pinceaux, nous allons utiliser deux variables pointant vers nos 2 classeurs :
        WbkArchiv => classeur d'archivage
        WbkIndic => classeur d'indicateurs, celui qui contient la macro à exécuter.

        Dans le code, cela donne ceci :

        Sub ExportIndic()
        Dim WbkArchiv As Workbook, WbkIndic As Workbook
        Dim Fichier As String
        
        'classeur indicateurs
        Set WbkIndic = ThisWorkbook
        'Fichier va contenir le chemin d'accès complet + le nom du fichier Archivage
        Fichier = "C:\Users\Travail\Archives\Archivage.xlsx" 'A ADAPTER
        'classeur archivage
        Set WbkArchiv = Workbooks.Open(Fichier)
        End Sub


        Seconde étape :
        Détermination de la feuille à copier
        Nous avons son nom, et donc pouvons l'utiliser directement.
        Dans la procédure donnée ci-dessus, cela donne donc :
        Sub ExportIndic()
        Dim WbkArchiv As Workbook, WbkIndic As Workbook
        Dim Fichier As String
        
        'classeur indicateurs
        Set WbkIndic = ThisWorkbook
        'Fichier va contenir le chemin d'accès complet + le nom du fichier Archivage
        Fichier = "C:\Users\Travail\Archives\Archivage.xlsx" 'A ADAPTER
        'classeur archivage
        Set WbkArchiv = Workbooks.Open(Fichier)
        'utilisation de la feuille à copier
        With WbkIndic.Sheets("Indicateurs ") 'attention aux espaces dans les noms...
           'ici le code de copié collé
        End With
        End Sub


        Troisième étape :
        Le copié-collé.
        Pour cela, plusieurs possibilités.
        Nous allons utiliser celle que t'a donné l'enregistreur de macro. Si cela ne te convient pas, nous adapterons autre chose...
        Les codes important, et donc à retenir, de ta macro sont :
        Sheets("Indicateurs ").Select
        Cells.Select
        Selection.Copy
        Windows("Archivage.xlsx").Activate
        Range("A1").Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
        Nous voyons donc qu'il nous faut :
        - sélectionner la plage à copier
        - la coller au bon endroit.
        A savoir : En VBA, il est souvent inutile de sélectionner. Il suffit de bien déterminer l'objet Range (ou autre objet) avec lequel nous devons travailler.
        Ici, ton code ci-dessus deviendrait donc :
        Sheets("Indicateurs ").Cells.Copy Windows("Archivage.xlsx").Sheets("Feuil1").Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False

        Quatrième étape :
        Détermination de l'endroit ou coller les données.
        Ici, nous allons ajouter une feuille dans le classeur archivages, feuille que nous allons renommer "Indicateurs " + date et heure (au moment du copié-collé)
        'Dans le classeur archivages
        With WbkArchiv
            'on ajoute une feuille => elle devient automatiquement la feuille active
            .Sheets.Add
            'on la renomme
            .ActiveSheet.Name = "Indicateurs " & Format(Date, "yyyymmdd") & " " & Format(Time, "hhmmss")
            'on y colle les valeurs
            .ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
                xlNone, SkipBlanks:=False, Transpose:=False
            'on ferme le classeur
            .Close
        End With


        Cinquième étape [Optionnelle] :
        On teste, avant de l'ouvrir, si le fichier Archivages n'est pas déjà ouvert...
        Pour cela, on utilises une petite fonction de notre cru :
        Function ClasseurOuvert(Wbk As String) As Boolean
        On Error Resume Next
        Workbooks(Wbk).Activate
        If Err = 0 Then ClasseurOuvert = True
        On Error GoTo 0
        End Function

        Que l'on appelle dans notre procédure principale, comme ceci :
        '--------------classeur archivage---------------------
        'Fichier va contenir le chemin d'accès complet + le nom du fichier Archivage
        Fichier = "C:\Users\Travail\Archives\Archivage.xlsx" 'A ADAPTER
        NomFichier = "Archivages.xlsx"                             'A ADAPTER
        'Si archivage est fermé
        If ClasseurOuvert(NomFichier) = False Then
            'on l'ouvre
            Set WbkArchiv = Workbooks.Open(Fichier)
        'Sinon
        Else
            'on l'attribue à notre variable
            Set WbkArchiv = Workbooks(NomFichier)
        End If


        Code complet :
        Sub ExportIndic()
        Dim WbkArchiv As Workbook, WbkIndic As Workbook
        Dim Fichier As String, NomFichier As String
        
        '--------------classeur indicateurs-------------------
        Set WbkIndic = ThisWorkbook
        
        '--------------classeur archivage---------------------
        'Fichier va contenir le chemin d'accès complet + le nom du fichier Archivage
        Fichier = "C:\Users\Travail\Archives\Archivage.xlsx" 'A ADAPTER
        NomFichier = "Archivages.xlsx"                             'A ADAPTER
        'Si archivage est fermé
        If ClasseurOuvert(NomFichier) = False Then
            'on l'ouvre
            Set WbkArchiv = Workbooks.Open(Fichier)
        'Sinon
        Else
            'on l'attribue à notre variable
            Set WbkArchiv = Workbooks(NomFichier)
        End If
        'utilisation de la feuille à copier
        With WbkIndic.Sheets("Feuil1") 'attention aux espaces dans les noms...
            .Cells.Copy
        End With
        'Dans le classeur archivages
        With WbkArchiv
            'on ajoute une feuille => elle devient automatiquement la feuille active
            .Sheets.Add
            'on la renomme
            .ActiveSheet.Name = "Indicateurs " & Format(Date, "yyyymmdd") & " " & Format(Time, "hhmmss")
            'on y colle les valeurs
            .ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
                xlNone, SkipBlanks:=False, Transpose:=False
            'on ferme le classeur
            .Close
        End With
        End Sub
        
        Function ClasseurOuvert(Wbk As String) As Boolean
        On Error Resume Next
        Workbooks(Wbk).Activate
        If Err = 0 Then ClasseurOuvert = True
        On Error GoTo 0
        End Function


        Nota :
        Comme quoi une opération anodine comme un copié-collé dans un autre classeur peut s'avérer une opération plus fastidieuse que prévue...
        1. Un trés grand merci pour vos explications très détaillées et précises , toutefois pour la partie copiage ( 3eme étape) ce que je souhaite c'est copier les valeurs des cellules, la mise en forme ( bordures, couleurs des cellules.. ) ainsi que les graphes contenus dans ma feuille "indicateurs" , pour faire cela j'ai utilisé en premier lieu le code pour dupliquer ma feuille indicateurs ( copier toute la feuille avec formules et graphes et mise en forme ) après, en second lieu , je fait un second recopiage pour écraser les formules et les remplacer par leurs valeurs , sauf qu'avec cette solution mes graphes se mettent à jour automatiquement après chaque collage en conséquence je perds les graphes de l'export précédent !! merci d'avance.
          1. Modérateur
            après chaque collage en conséquence je perds les graphes de l'export précédent !!

            Ben non.
            Pas si vous créez une feuille à chaque export...