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 :

Macro instable Copier/Coller Image [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    ""
    Inscrit en
    Mai 2019
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : ""

    Informations forums :
    Inscription : Mai 2019
    Messages : 201
    Par défaut Macro instable Copier/Coller Image
    Bonjour à tous,

    Après un dur labeur et grâce à votre aide je suis parvenu a faire une macro qui export mes données excel sous Word, j'ai récemment opté pour un copier coller en tant qu'image :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .CopyPicture Appearance:=xlScreen, Format:=xlPicture
    .paste
    Pour remplacer l'ancien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .copy
    .PasteSpecial Link:=True, DataType:=wdPasteBitmap, _
    Placement:=wdInLine, DisplayAsIcon:=False
    La macro s'exécute beaucoup plus rapidement, je n'ai plus les bugs liés aux liaisons et c'est bien plus facile de gérer des images.

    En revanche la macro semble instable. Parfois elle fonctionne, parfois non. Je dirais que sur 10 exécutions, 6 fonctionnent.
    Ça à l'air aléatoire, sans que je ne change rien au fichier (ou que je clique ailleurs)

    Quand ça ne fonctionne pas c'est tantôt la ligne du .CopyPicture Appearance:=xlScreen, Format:=xlPicture qui est surlignée et parfois la ligne du .Paste

    Si besoin je peux vous laisser un fichier exemple qui reproduit le même phénomène. Le code en question est 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    Function exist(feuille As String, nom As String) As Boolean
    exist = False
    On Error Resume Next
        x = Sheets(feuille).Range(nom).Address
        If Err.Number = 0 Then exist = True
    On Error GoTo 0
    End Function
     
    Sub export_excel_to_word()
        Dim obj As Object
        Dim newObj As Object
        Dim sh As Worksheet
        Dim myFile
    Application.ScreenUpdating = False
     
     
        Set obj = CreateObject("Word.Application")
        obj.Visible = True
        Set newObj = obj.Documents.Add
    ' obj.Selection.ParagraphFormat.LeftIndent = (20)
          With obj.Selection.PageSetup
            .TopMargin = (20)
            .LeftMargin = (17.5)
            .RightMargin = (20)
            .BottomMargin = (0)
            .HeaderDistance = (0)
            .FooterDistance = (15)
        End With
     
    For n = 1 To 3
        If exist("En_tête", "page_" & Format(n, "00")) Then
         ThisWorkbook.Worksheets("En_tête").Range("page_" & Format(n, "00")).CopyPicture Appearance:=xlScreen, Format:=xlPicture
            With obj.Selection
            .Paste
           ' .PasteSpecial Link:=True, DataType:=wdPasteBitmap, _
          'Placement:=wdInLine, DisplayAsIcon:=False
         '   .PasteSpecial Link:=True, DataType:=wdPasteEnhancedMetafile, _
          '  Placement:=wdInLine, DisplayAsIcon:=False
            .InsertBreak Type:=6
            End With
         End If
    Next
     
    For n = 1 To 15
        If exist("Descriptif", "page_" & Format(n, "00")) Then
         ThisWorkbook.Worksheets("Descriptif").Range("page_" & Format(n, "00")).CopyPicture Appearance:=xlScreen, Format:=xlPicture
            With obj.Selection
            .Paste
            .InsertBreak Type:=6
            End With
        End If
    Next
     
    For n = 1 To 5
        If exist("Carac_tech", "page_" & Format(n, "00")) Then
         ThisWorkbook.Worksheets("Carac_tech").Range("page_" & Format(n, "00")).CopyPicture Appearance:=xlScreen, Format:=xlPicture
            With obj.Selection
            .Paste
            .InsertBreak Type:=6
            End With
        End If
    Next
     
    newObj.Sections(1).Footers(1).PageNumbers.Add (2)
     
        'obj.Sections(1).Footers(wdHeaderFooterPrimary).PageNumbers.Add _
          ' PageNumberAlignment:=wdAlignPageNumberRight
     
       Application.CutCopyMode = False
        myFile = Replace(ActiveWorkbook.Name, "xlsm", "docx")   'remplacer "docx" par l'extension qui convient, si nécessaire
        newObj.SaveAs Filename:=Application.ActiveWorkbook.Path & "\" & myFile
    Application.ScreenUpdating = True
        MsgBox "Export vers Word terminé", vbInformation + vbOKOnly, "Export vers Word"
     
        obj.Activate
        Set obj = Nothing
        Set newObj = Nothing
    End Sub

    NB : Une personne me propose d'enregistrer temporairement les images copiées pour ensuite les insérer sous word. Sauf que je ne comprend pas comment faire.

  2. #2
    Membre confirmé
    Homme Profil pro
    ""
    Inscrit en
    Mai 2019
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : ""

    Informations forums :
    Inscription : Mai 2019
    Messages : 201
    Par défaut
    Pour ceux que ça peut aider, j'ai corriger mes bug avec une attente qui vérifie que l'image a bien était collée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With obj.Selection
                nn = newObj.InlineShapes.Count + 1
                While newObj.InlineShapes.Count < nn: DoEvents: .Paste: Wend 'en attente de l'exécution
                .InsertBreak Type:=6
            End With

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Lorsque je fais ce type de boucle d'attente, j'ai l'habitude de mettre une tempo de quelque ms pour limiter la charge de l'application et surtout je met en place une variable me permettant de ne pas rester sur une boucle infinie en cas de problème.

    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
     
     
    Dim iTimeOut as integer
    'Init
    iTimeOut = 20
     
    'On boucle
    while (newObj.InlineShapes.Count < nn) and (iTimeOut > 0)
       .Paste
       slepp 100 '100ms
       DoEvents
       iTimeOut = iTimeOut - 1
    Wend 
     
    'On teste si l'opération a réussi
    if iTimeOut > 0 then
       'Réussit
       '....
    else
       'Echec
       '...
    end if
    Je te souhaite une bonne soirée
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2016] Macro en boucle pour copier coller image sous condition
    Par benjamin7983 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/11/2018, 15h12
  2. [OpenOffice] Macro pour copier/coller les paramètres de dimensionnement d'une image
    Par cecile0123 dans le forum OpenOffice & LibreOffice
    Réponses: 3
    Dernier message: 08/02/2015, 17h21
  3. copier/ coller image
    Par johruss dans le forum Java ME
    Réponses: 4
    Dernier message: 12/05/2008, 14h06
  4. Macro Excel : copier-coller-concaténer
    Par neo2k2 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/06/2007, 10h39
  5. Copier/coller images
    Par Saroi dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/02/2006, 20h52

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