[VBA] Method Sheet.Copy

Résolu
Bonjour,

J'ai réalisé une fonction permettant de copier des feuilles d'un classeur à un autre. Néanmoins, lorsque je fais fonctionner cette macro, les feuilles, les formules sont bien copiées (sans aucune liaison), mais les images ne le sont pas. A la place des anciennes images, il y a marqué "Impossible d'afficher l'image". Or quand je fais l'opération à la mano, les images sont conservés, alors que le même code VBA est appliqué.

Quelqu'un a-t-il une explication ?

Merci d'avance



--
Prenez le temps de bien rédiger vos questions, et nous prendrons le temps d'y répondre......Timmy ?!?

7 réponses

  1. Bonsoir,
    Avec quelques recherches j'ai finalement réussi par trouver d'où venait le problème. Tout est relativement bien expliqué derrière ce lien :

    https://www.developpez.net/forums/d1003446/logiciels/microsoft-office/excel/macros-vba-excel/pb-affichage-image-feuille-importe-relation-rid1/

    En résumer, c'est un soucis de xml, il faut sauver le fichier modifié avant de fermer le fichier "source" d'ou viennent les feuilles copiées.

    Néanmoins, j'ai désormais un autre soucis. Je vais créer un autre post.
    Voici le lien de ma nouvelle question :
    https://forums.commentcamarche.net/forum/affich-25431796-excel-vba-fermeture-classeur
    Prenez le temps de bien rédiger vos questions, et nous prendrons le temps d'y répondre......Timmy ?!?
    1. Modérateur
      Bonjour,

      Quel code utilises tu?
      Je viens de tester sous mon vieux 2003 et le code suivant fonctionne correctement, même pour des images :
      Sub copier()
      ActiveSheet.Copy Before:=Workbooks("destination.xls").Sheets("Feuil3")
      End Sub
      1. Bonjour,
        VBA sous office 2010 si c'est ça ta question ?
        J'utilise exactement la même commande. C'est incompréhensible.
        Lors que je le fais à la main cela fonctionne.
        Lorsque le lance le code, avec plusieurs feuilles à copier, les images s'éffacent et sont remplacées par un carré blanc avec une croix rouge : "Impossible d'afficher l'image".
        Il me semble que les images sont des objets shapes. Le problème peut venir de la manière dont on été importée les images ?

        Prenez le temps de bien rédiger vos questions, et nous prendrons le temps d'y répondre......Timmy ?!?
        1. Modérateur
          Ces images sont peut être dans des contrôles Image ou autre... Effectivement cela peux bloquer.
          Comment les intègres tu à ta feuille?
          Sinon je te demandais ton code VBA...
          1. Je les ai intégré une seule fois, via le menu de excel "Insérer image".
            Je te fournis le code ce soir, mais ce n'est qu'une boucle avec une commande de type :
            Workbooks().Sheets().Copy After:=Workbooks().Sheets() à l'intérieur de la boucle...donc bon.
            Je te copie/colle le code aux alentours de 20h.
            1. Voilà mon code :
              Sub workbook_open()
              recent_file = ActiveWorkbook.Name
              Application.DisplayAlerts = False
              Application.ScreenUpdating = False
              On Error GoTo suite
              With Application.FileDialog(msoFileDialogOpen)
              .Title = "Mise à jour obligatoire, Veuillez selectionner votre ancien fichier de bons de commande"
              .InitialFileName = ActiveWorkbook.Path
              .AllowMultiSelect = False
              .Filters.Clear
              .Filters.Add "Excel Files", "*.xlsm"
              .Show
              old_file = .SelectedItems(1)
              End With
              Sheets("MAJ").Delete
              Workbooks(recent_file).Sheets(1).Unprotect
              Workbooks.Open "" & old_file & ""
              old_file = Right(old_file, InStr(StrReverse(old_file), "\") - 1)
              For i = 1 To Workbooks("" & old_file & "").Sheets.Count - 3
              shee = StrReverse("" & Workbooks("" & old_file & "").Sheets(1 + i).Name & "")
              num = StrReverse(Left(shee, InStr(1, shee, " ") - 1))
              nam = StrReverse(Right(shee, Len(shee) - InStr(1, shee, " ")))
              Workbooks(old_file).Sheets(1 + i).Copy Before:=Workbooks(recent_file).Sheets(i + 1)
              Next
              Workbooks(old_file).Close
              Workbooks(recent_file).Sheets(1).Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
              Workbooks(recent_file).Sheets(1).Select
              MsgBox "Mise à jour effectuée !", vbInformation
              Application.DisplayAlerts = True
              Application.ScreenUpdating = True
              Exit Sub
              suite:
              MsgBox "Mise à jour annulée, veuillez contacter le support.", vbCritical
              ActiveWorkbook.Close
              End Sub

              Prenez le temps de bien rédiger vos questions, et nous prendrons le temps d'y répondre......Timmy ?!?