XL 2010 signet image word page 2 ne fonctionne pas

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour
J'avais bien fait l'insertion d'une signature en image dans word
Mais là si je passe à une autre page cela ne fonctionne plus ? erreur à : Set Img = .InlineShapes.AddPicture(FichierImage, False, True)
et là je sèche , j'ai testé en mettant un signet texte en page 2 et pas de Pb
J'ai cherché mais rien trouvé sur ce sujet
Donc là je cherche un expert !!!! qui aurait la solution
Bien merci

Correction : AJOUT du bon dossier
 

Pièces jointes

  • Signet_bug.zip
    53.7 KB · Affichages: 10
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour herve62, patricktoulon,

Il ne faut pas vouloir utiliser les signets à tout bout de champ :rolleyes:

Téléchargez les fichiers zippés joints dans le même dossier et voyez cette macro :
VB:
Sub Word()
Dim fichier$, Wapp As Object, Wdoc As Object
fichier = ThisWorkbook.Path & "\02-fichier word.docx"
On Error Resume Next
Set Wapp = GetObject(, "Word.Application")
If Wapp Is Nothing Then Set Wapp = CreateObject("Word.Application")
Wapp.Visible = True
Set Wdoc = Wapp.Documents.Open(fichier)
If Wdoc Is Nothing Then MsgBox "Fichier Word introuvable...": Exit Sub
Wdoc.Content = "" 'RAZ
[Plage].Copy 'copier
Wapp.Selection.Paste 'coller
Application.CutCopyMode = 0
AppActivate Wapp.Caption 'affiche Word
End Sub
Il s'agit donc d'un simple copier-coller.

A+
 

Pièces jointes

  • Dossier signature.zip
    138.2 KB · Affichages: 2

job75

XLDnaute Barbatruc
Maintenant si l'on veut renvoyer la signature sur une 2ème page :
VB:
Sub Word()
Dim fichier$, Wapp As Object, Wdoc As Object, i&
fichier = ThisWorkbook.Path & "\02-fichier word.docx"
On Error Resume Next
Set Wapp = GetObject(, "Word.Application")
If Wapp Is Nothing Then Set Wapp = CreateObject("Word.Application")
Wapp.Visible = True
Set Wdoc = Wapp.Documents.Open(fichier)
If Wdoc Is Nothing Then MsgBox "Fichier Word introuvable...": Exit Sub
On Error GoTo 0
Wdoc.Content = "" 'RAZ
[Plage].Copy 'copier
Wdoc.Content.Paste 'coller
Application.CutCopyMode = 0
'---renvoi de la signature sur une 2ème page---
For i = 1 To Wdoc.Words.Count
    If Wdoc.Words(i) Like "Signature*" Then
        Wdoc.Words(i).InsertBreak Type:=7 'wdPageBreak
        Exit For
    End If
Next
AppActivate Wapp.Caption 'affiche Word
End Sub
Un saut de page est inséré.
 

Pièces jointes

  • Dossier signature.zip
    139.4 KB · Affichages: 4

herve62

XLDnaute Barbatruc
Supporter XLD
Bonsoir
Merci JOB75 , mais ce modèle word fonctionne avec mon prog , de plus ici ce n'est qu'un échantillon d'une appli avec divers traitement .... donc là je devrais TOUT refaire
C'est pour éditer des BL Et en plus la signature peut être différente ( elle est codée selon info d'un tableau)
Sinon le PROBLEME c'est le squelette word peut aussi différer : 2 , 3 ..jusqu'à 5 pages et donc la signature doit se trouver en fin de document
J'ai passé trop de temps à aider mon ami pour sa PME et je ne vais pas tout refaire
 

herve62

XLDnaute Barbatruc
Supporter XLD
Je viens de l'avoir et lui ai proposé ! mais je devrais tout retraiter le gros fichier car au lieu d'affecter des signets je devrais ouvrir des fichiers xlsx différents 'squelette" aussi selon une cellule et aller retranscrire les données mais aussi affecter l'image signature
Il a 300 BL de retard à éditer car aussi il doivent être PDF à la fin ( il a commencé à la "paluche" aie aie !!)
C'est "ballot" !!! juste pour une finition .. tout marchait bien jusqu'à cette modif qui n'était pas prévue de rallonger le modèle ( obligé) et donc décaler la signature
 

laurent950

XLDnaute Accro
Bonsoir @herve62

Suite à votre question sur le Poste #1 avec vos premiers fichiers dans le dossier Zip
J'ai corrigé votre code de votre fichier excel Initial

Il fallait ajouter cela :

Dim WordApp As Word.Application
Dim WordDoc As Word.Document
Dim signet As Word.Bookmark
Dim rg As Word.Range
Dim Img As Word.InlineShape

Ensuite il y a une Erreur Automation avec cette commande (qui était juste) mais je ne sais pas pourquoi
Set Img = signet.Range.InlineShapes.AddPicture(FichierImage, True, False, rg)

Alors il faut sélectionner le signet avant d'y insert l'image
signet.Select
Set Img = signet.Range.InlineShapes.AddPicture(FichierImage, True, False, rg)

Puis lorsque vous appelez la macro à la suite il ne faut pas oublier de décharger les variables
WordDoc.Close True 'on ferme word
Set WordDoc = Nothing
WordApp.Quit ' on quitte word
Set WordApp = Nothing

Je Poste vos deux codes corrigés en relation avec votre premier fichier Excel dans le zip de votre Poste #1

Code : M09_creation_BC_OP

VB:
Public fic, fic_sig As String

Sub Creation_BC_OP()
'nécéssite d'activer la référence Microsoft Word xx.x Object Library
Dim i&, j&, x1&, pos&         ' Long
Dim NomDoc$, celle_qu$        ' String
Dim s As Object
Dim Chemin As String
Dim nom_societe As String

Dim WordApp As Word.Application ' NE PAS OUBLIER DE PRECISER WORD pour EXCEL
Dim WordDoc As Word.Document
Dim signet As Word.Bookmark
Dim rg As Word.Range
Dim Img As Word.InlineShape
               '   "     "
 
Application.ScreenUpdating = False

'*************************************************
'où est le document Word
    Chemin = ThisWorkbook.Path & "\"                    ' MODIFIER SI DOC # REPERTOIRE DE CE FICHIER EXCEL
'Le nom du fichier Word à ouvrir
'Fichier = "Controle.docx"                           ' NOM DU FICHIER SQUELETTE WORD
'Chemin et nom du fichier Image à insérer
    FichierImage = ThisWorkbook.Path & "\" & "AN1 AP1 SIG.png"

    nom_societe = Cells(1, 5).Value ' le nom de la sociéte qui est en E1

    Cells(4, 2).Select ' on positionne le curseur dans la cellule B4

    Application.ScreenUpdating = False ' bloc de defilement ecran

' ON REMPLI SEULEMENT LA PAGE DE GARDE DU DOC WORD
'**************************************************
    num_actif_onglet = ActiveSheet.Index ' recupere de nom de l'onglet actif
    dg = Cells(Rows.Count, 1).End(xlUp).Row + 1 'defini le nombre de lignes à traiter
    Num_dos = 0

    For x = 4 To dg ' boucle pour traiter toutes les lignes du doc
        indic = Cells(x, 1)
            Select Case indic
                Case "fait"
                    GoTo suite1
                    ' test si des croix dans le cases interdites
                Case "x"
                    'Set WordApp = CreateObject("word.application")
                            ' Déclaration du traitement d’erreur initial
                        On Error Resume Next
                    ' Initialisation de Word
                        Set WordApp = GetObject(, "Word.Application")
                        If Err <> 0 Then
                            Err.Clear
                            Set WordApp = CreateObject("Word.Application")
                            If Err <> 0 Then
                                MsgBox "La macro n'a pas pu ouvrir !", vbExclamation
                                End
                            End If
                        End If
                    On Error GoTo 0
                    ' laisser l'application visible
                        WordApp.Visible = True
                    'Chemin =  "C:\Users\JM-essai\"
                    cellule_D = Cells(x, 2).Value 'cellule N°BDC
                    cellule_N = Cells(x, 5).Value 'cellule nom
                    cellule_P = Cells(x, 6).Value 'cellule prénom
                    fic = cellule_N & "_" & cellule_P & "_" & cellule_D & "_BC" 'Nom du nouveau fichier à créer
                    NomDoc = Chemin & fic & ".docm" ' définition du chemin et nom du doc au créer
  
                    '******* choix du fichier àutiliser ******
                    nom = InputBox("Saisie le fichier à utiliser 1 ou 2 : ")
                    If nom = 1 Then nom_doc_vierge = "02-fichier word2" & ".docm"
                    If nom = 2 Then nom_doc_vierge = "02-fichier word - Copie.docm"
    
                    Set WordDoc = WordApp.Documents.Open(ThisWorkbook.Path & "\" & nom_doc_vierge)

                    WordDoc.SaveAs NomDoc ' On enregistre le doc word. là le doc est vide
  
                    '************************************
                    ' ***** on renseigne le document Wort à partir du fichier Excel *****
                        'Teste si le signet existe
                         With WordDoc
                            If .Bookmarks.Exists("signature") Then
                                Set signet = .Bookmarks("signature")    ' Signet
                                Set rg = .Bookmarks("signature").Range  ' Range
                                    'supprimer les images si déjà présentes
                                    'dans le signet
                                    With rg
                                        While .InlineShapes.Count > 0
                                              .InlineShapes(1).Delete
                                        Wend
                                        signet.Select
                                        Set Img = signet.Range.InlineShapes.AddPicture(FichierImage, True, False, rg)
                                    End With
                            End If
                    'Si tu veux travailler avec l'image insérée - Dimension, rogner...
                        With Img
                            'Pour définir plusieurs caractéristiques de l'image
                                .PictureFormat.CropRight = 0.6 ' X valeur à définir
                                .PictureFormat.CropTop = 0.6 ' Y valeur à définir
                                .ScaleHeight = 10
                                .ScaleWidth = 10
                                .LockAspectRatio = msoTrue   ' Garde les proportions donc mettre H ou L mais pas les 2
                               '.Height = 35
                                .Width = 120                   ' Là j'ajuste juste en L pas la Hauteur
                        End With
                        .Bookmarks.Add "signat", rg
                    End With
                  
                    '02-*** Pour remplir tous les champs texte BC à partir du doc EXCEL ***
  
                    WordDoc.Bookmarks("Texte5").Range.Text = Cells(x, 5) 'renseigne NOM
                    WordDoc.Bookmarks("Texte6").Range.Text = Cells(x, 6) 'renseigne PRENOM
                    WordDoc.Bookmarks("Texte7").Range.Text = Cells(x, 7) 'renseigne ADRESSE
                    WordDoc.Bookmarks("Texte8").Range.Text = Cells(x, 8) 'renseigne CP
                    WordDoc.Bookmarks("Texte9").Range.Text = Cells(x, 9) 'renseigne VILLE
                    WordDoc.Bookmarks("Texte17").Range.Text = Cells(x, 9) 'renseigne VILLE 1
                    WordDoc.Bookmarks("Texte10").Range.Text = Cells(x, 10) 'renseigne TEL
                    WordDoc.Bookmarks("Texte12").Range.Text = Cells(x, 12) 'renseigne DATE
  
                    Application.ScreenUpdating = True ' on retabli la vue ecran
                  
                    WordDoc.Close True 'on ferme word
                        Set WordDoc = Nothing
                    WordApp.Quit ' on quitte word
                        Set WordApp = Nothing
  
            Case Else
                GoTo suite1
suite1:
            End Select
fin:
    '***** Fin de la boucle de remplissage du doc Word *****
    Next x ' retour pour vérifier s'il y a encore des donnée à traiter

'Beep
    Application.ScreenUpdating = True

    Call import_signature
End Sub

Code : M12_import_signature
Code:
Sub import_signature()
Dim nom_societe As String
Dim Fichier, Fichier_word, Fichier_pdf As String
Dim chemin_doc_a_sig, chemin_de_sig As String
Dim FicPDF, NomDoc, def_chemin_pdf, n_et_p1 As String
Dim FichierImage, extension As String

Dim WordApp As Word.Application
Dim WordDoc As Word.Document
Dim signet As Word.Bookmark
Dim rg As Word.Range
Dim Img As Word.InlineShape

    nom_societe = Cells(1, 5).Value ' le nom de la sociéte qui est en E1

    Application.ScreenUpdating = False 'bloque l'affichage ecran
    '*************************************************
 
    dg = Cells(Rows.Count, 1).End(xlUp).Row + 1 'defini le nombre de lignes à traiter
  
    For i = 4 To dg ' boucle pour traiter toutes les lignes de données du tableau excel
            a = Cells(i, 1).Value
        If a <> "x" Then
            GoTo passe_ligne
        End If
  
    '01-**** definition des noms fichiers ****
        cellule_D = Cells(i, 2).Value 'cellule date code
        cellule_N = Cells(i, 5).Value 'cellule nom
        cellule_P = Cells(i, 6).Value 'cellule prénom
  
        Fichier = cellule_N & "_" & cellule_P & "_" & cellule_D '*** pour le nom de base
        'Fichier_ext = Fichier & extension '*** extension pour BC,CDF, BL
        Fichier_word = Fichier & "_BC.docm" '*** pour le nom du doc word
        'Fichier_pdf = Fichier_ext & ".pdf" '*** pour le nom du doc pdf
        Fic_vierge = ThisWorkbook.Path & "\02-fichier word2.docm"
  
    '02-**** definition du chemin ou sont les fichiers word ****
        chemin_doc_a_sig = ThisWorkbook.Path & "\"
  
    '03-**** definition du chemin ou sont les signatures ****
        chemin_des_sig = ThisWorkbook.Path & "\"
  
    '04-**** definition du nom du fichier signature à trouver ****
        nom_sig = cellule_N & " " & cellule_P & " SIG.png"
  
    ' **** definition du chemin et  nom de la signature à inserer ****
        FichierImage = chemin_des_sig & nom_sig
  
    '******************************************************************************
        ' Déclaration du traitement d’erreur initial
            On Error Resume Next
        ' Initialisation de Word
            Set WordApp = GetObject(, "Word.Application")
            If Err <> 0 Then
                Err.Clear
                Set WordApp = CreateObject("Word.Application")
                If Err <> 0 Then
                    MsgBox "La macro n'a pas pu ouvrir !", vbExclamation
                    End
                End If
            End If
        On Error GoTo 0
        ' laisser l'application visible
            WordApp.Visible = True
  
    '04-**** définition du chemin et nom du doc word à traiter
        NomDoc = chemin_doc_a_sig & Fichier_word
        'MsgBox "chemin et nom du fichier traité avant sauvegarde " & NomDoc
  
        Set WordDoc = WordApp.Documents.Open(Fic_vierge)   'ouverture du doc word
      
        WordDoc.SaveAs NomDoc ' sauvegarde du doc word
      
        With WordDoc
            'Teste si le signet existe
            If .Bookmarks.Exists("signature") Then
                Set signet = .Bookmarks("signature")    ' Signet
                Set rg = .Bookmarks("signature").Range  ' Range
            '05-**** supprimer les images si déjà présentes ****
                'dans le signet
                    With rg
                        While .InlineShapes.Count > 0
                              .InlineShapes(1).Delete
                        Wend
                            signet.Select
                            Set Img = signet.Range.InlineShapes.AddPicture(FichierImage, True, False, rg)
                    End With
            End If
        'MsgBox "on ajoute la signature "
        .Bookmarks.Add "signature", rg
        End With
  
    '********** On va créer le PDF ici *********
        Set wDoc = WordApp.ActiveDocument
        
    '**** fermer le document Word avec sauvegarde ****

        WordDoc.Close True 'on ferme word
            Set WordDoc = Nothing
        WordApp.Quit ' on quitte word
            Set WordApp = Nothing
  
    'Libérer la mémoire des objets
        Set rg = Nothing: Set Img = Nothing ' a voir ces deux lignes
        Set Dc = Nothing: Set Wd = Nothing
  
        Application.ScreenUpdating = True
  
passe_ligne:

Next i

End Sub

Laurent
 
Dernière édition:

laurent950

XLDnaute Accro
Re @herve62

Pour votre Poste #7
Votre macro fonctionne très bien il faut juste ajouter cette ligne
Rg.Select
Set Img = .InlineShapes.AddPicture(FichierImage, False, True)

Si le signet n'est pas selectionné il y a une Erreur Automation ?

Votre code du Poste #7

Code:
Private Sub signature()
Dim WordApp As Word.Application, WordDoc As Word.Document
Dim Chemin As String, Fichier As String
Dim FichierImage As String, Rg As Word.Range
Dim Img As Word.InlineShape

Application.ScreenUpdating = False

'*************************************************
'où est le document Word
Chemin = ThisWorkbook.Path & "\"                    ' OU SE TROUVE TA SIGNATURE
'Le nom du fichier Word à ouvrir
Fichier = "02-fichier word2.docx" ' Fichier = "Controle.docx"
'Chemin et nom du fichier Image à insérer
FichierImage = ThisWorkbook.Path & "\SignCD.jpg"   '"C:\captures\SignCD.jpg"             ' MODIFIE ICI TON IMAGE SIGNATURE
'*************************************************


Set WordApp = CreateObject("Word.Application")

NomDoc = ThisWorkbook.Path & "\Sign_word.docx" ' définition du chemin et nom du doc au créer

 

Set WordDoc = WordApp.Documents.Open(ThisWorkbook.Path & "\" & Fichier)   'chemin du répertoire ou ce trouve le doc

WordDoc.SaveAs NomDoc ' On l'enregistre ? là le doc est vide


' Wd.Visible = True

With WordDoc
'Teste si le signet existe
If .Bookmarks.Exists("signature") Then
Set Rg = .Bookmarks("signature").Range
'supprimer les images si déjà présentes
'dans le signet
With Rg
While .InlineShapes.Count > 0
.InlineShapes(1).Delete
Wend
Rg.Select
Set Img = .InlineShapes.AddPicture(FichierImage, False, True)

End With
End If
'Si tu veux travailler avec l'image insérée - Dimension, rogner...
With Img
'Pour définir plusieurs caractéristiques de l'image
.PictureFormat.CropRight = x ' X valeur à définir
.PictureFormat.CropTop = Y ' Y valeur à définir
.ScaleHeight = 60
.ScaleWidth = 90
End With
.Bookmarks.Add "signature", Rg
End With

'fermer le document Word avec sauvegarde
WordDoc.Close True

WordApp.Quit

'Libérer la mémoire des objets
Set Rg = Nothing: Set Img = Nothing
Set Dc = Nothing: Set Wd = Nothing

Application.ScreenUpdating = True
End Sub
 

laurent950

XLDnaute Accro
Sinon OUI c'était erreur automation ...serveur non trouvé ..etc ; Excel arrête de fonctionner !!!!!
Oui Hervé c'est cela pour y remédier il faut faire cette instruction juste avant
L'instruction Select sur l'objet Signet (cela évite l'Erreur Automation)
Regarder Mon Poste #10
J'ai corrigé les Erreur, puis il faut bien décharger les variables
Et Aussi Mon Poste #11

Il faudrait essayé d'évité l'action sur l'objet signet de le sectionné avec :
Rg.Select
Juste avant cette ligne de commande
Set Img = .InlineShapes.AddPicture(FichierImage, False, True)

Mais pour l'instant cela fonctionne avec l'objet signet qui est sélectionné juste avant (Objet.select ) cette ligne de commande (set Img = .IlineShapes.Add.............)
En poste (#10 et #11) la solution.
Avec Select sur l'objet signet juste avant cette ligne de commande il n'y a plus d'Erreur qui crée l'Erreur Automation

Nota : si cette ligne n'est pas ajouté Objet.select juste avant il y aura l'Erreur Automation.

Pour votre question @herve62 :
Je vois que tu avais gardé le fichier de départ ??? = OUI (Correction de tous votre code en Poste #10)
Sinon OUI c'était erreur automation = Exactement c'était cela ...serveur non trouvé ..etc ; Excel arrête de fonctionner !!!!!

Laurent
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour herve62, laurent950, le forum,

Dans cette 3ème version on ne se préoccupe que de la signature :
VB:
Sub Word()
Dim fichier$, Wapp As Object, Wdoc As Object, i&
fichier = ThisWorkbook.Path & "\02-fichier word2.docx"
On Error Resume Next
Set Wapp = GetObject(, "Word.Application")
If Wapp Is Nothing Then Set Wapp = CreateObject("Word.Application")
Wapp.Visible = True
Set Wdoc = Wapp.Documents.Open(fichier)
If Wdoc Is Nothing Then MsgBox "Fichier Word introuvable...": Exit Sub
On Error GoTo 0
'---recherche du mot signature---
For i = 1 To Wdoc.Paragraphs.Count
    If Wdoc.Paragraphs(i).Range Like "Signature*" Then
        [Plage].Copy 'copier
        Wdoc.Paragraphs(i).Range.Paste 'coller
        Application.CutCopyMode = 0
        Exit For
    End If
Next i
AppActivate Wapp.Caption 'affiche Word
End Sub
Toujours du copier-coller et pas de signet.

A+
 

Pièces jointes

  • Dossier signature.zip
    92.4 KB · Affichages: 3

herve62

XLDnaute Barbatruc
Supporter XLD
Bonjour tous ; Salut Laurent , JOB
@job75 : j'ai testé ta sub mais je n'ai pas de "Plage" dans le vrai fichier c'est une image d'un répertoire avec X signatures jpg que je dois coller , nom issu de 2 cellules
si ok je garderai aussi ce principe

@laurent950 : OUI NICKEL !!!!! pour débloquer j'ai juste mis le rg.select , après on verra pour tout remettre en ordre
J'espère que cela pourra servir à d'autres car AUCUN sujet trouvé en 2 jours sur le net
Grand merci à toi , surtout que tu as tout corrigé en gardant ma structure d'origine

Merci bien aussi à JOB , je garde tes exemples au cas ou nouveau développement similaire

Bon dimanche
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 391
Messages
2 087 948
Membres
103 682
dernier inscrit
Thomas23