Résolu Variable de Excel à Word

CelineCam91

Nouveau membre
Bonjour à tous,

Je voudrai lancer une macro Word à partir d'Excel en lui passant des arguments mais je n'y arrive pas.

Dans Excel je note :

Code:
 objApplication.Run "INSERTION_PHOTOS_ACTUALISATION", strChemin_Photos, strNom_Photo1, strNom_Photo2

et dans mon Word
Code:
Sub INSERTION_PHOTOS_ACTUALISATION(strChemin_Photos As String, strNom_Photo1 As String, strNom_Photo2 As String)

mais mes variables strChemin_Photos As String, strNom_Photo1 As string et strNom_Photo2 As string ne passe pas de Excel à Word j'ai une erreur :
"Nombre d'arguments incorrect ou affectation de propriété incorrecte"
j'ai essayé avec cette écriture dans l'Excel :
Code:
 objApplication.Run "INSERTION_PHOTOS_ACTUALISATION", "strChemin_Photos", "strNom_Photo1", "strNom_Photo2"
mais ça ne fonctionne pas non plus

Quelqu'un peut-il m'aider (je suis sur Office 2010 mais le code doit aussi fonctionner sur Office 2013)

Merci de m'aider
Céline

 

CelineCam91

Nouveau membre
ben pour Excel je peux t'envoyer le programme qui intègre cette commande ainsi que le module de déclaration de variable car en fait un long programme qui comporte plusieurs modules !!
Variables
Code:
Option Explicit

Public strClasseurExcelSource As String 'Classeur Excel Source

Public objRechercheFichiers As Scripting.FileSystemObject 'Recherche des fichiers d'un dossier
Public objRechercheFichiersListe As Object 'Liste des fichiers issus de de la recherche
Public objFichier As Object 'Chaque fichier de la liste

Public objApplication As Word.Application 'Logiciel Word
Public strDossier_Fichiers As String 'Dossier des fichiers
Public strDocumentWord As String 'Document Word

Public strChemin_Photos As String
Public strNom_Photo1 As String
Public strNom_Photo2 As String

Public bytChamps As Byte 'Nombre de champs
Public bytI As Byte 'Compteur de champs

Public ErrExcDonnees As Boolean 'Repère si erreur dans feuille Excel

Programme Excel :
Code:
Sub WORD_MAJ()
'Copier les données et les graphiques Excel dans le document Word

Application.ScreenUpdating = False
Application.DisplayAlerts = False

'On Error GoTo message:

  '01) Déclaration de variable(s)
  
  Dim strClasseurExcelTraitement As String
  'Word
  Dim strSignet As String 'Signet dans le document Word
  
  'Excel
  Dim bytGraphiques As Byte 'Nombre de graphiques
  Dim strFeuilleGraphique As String 'Feuille Excel contenant les graphiques
  Dim strGaphique As String 'Chaque graphique Excel
  
        strClasseurExcelTraitement = ActiveWorkbook.Name

  '02) Initialisation de variable(s)
  'Word
  Set objApplication = New Word.Application
  strDossier_Fichiers = Range("Dossier_Fichiers").Value
  strChemin_Photos = Range("Chemin_Photos").Value
  strNom_Photo1 = Range("Nom_Photo1").Value
  strNom_Photo2 = Range("Nom_Photo2").Value
  
  'Excel
  bytChamps = 15
  bytGraphiques = Range("Nombre_Graphiques").Value

  '03) Utilisation de variable(s)
  'Word
  With objApplication
    '03-1) Ouvrir Word
    .Visible = True
    
    '03-2) Sélectionner le dossier Word
    .ChangeFileOpenDirectory strDossier_Fichiers
    
    '03-3) Ouvrir le document Word
    .Documents.Open Filename:=strDocumentWord
  End With
 
  '03-4) Boucle des données
  For bytI = 1 To bytChamps
    'INITIALISATION
    Windows(strClasseurExcelTraitement).Activate
    Sheets("Données").Select 'Sélectionner la feuille "Données"
    Application.CutCopyMode = False
    
    'Word
    strSignet = Application.Index(Range("table_donnees"), 3, bytI)
    
    '****************************************************************
    
    'UTILISATION
    'Excel
    Range(Cells(5, bytI), Cells(5, bytI)).Select
    Selection.Copy
    
    'Word
    With objApplication
      '1) Activer Word
      .Activate
      
      '2) Atteindre le signet
      .Selection.Goto what:=wdGoToBookmark, Name:=strSignet
    
      '3) Effacer la donnée à droite du signet
      .Selection.MoveRight Unit:=wdCell
      .Selection.Delete Unit:=wdCharacter, Count:=1
      
      '4) Inscrire la donnée en "Collage spécial Texte mis en forme"
      .Selection.PasteExcelTable False, False, False
'      .Selection.Font.Color = RGB(51, 104, 90)

      .Selection.TypeBackspace 'retour arrière car crée une seconde ligne après avoir copié
    Application.CutCopyMode = False
    End With
  Application.CutCopyMode = False
  Next bytI

  '03-5) Boucle des graphiques
  For bytI = 1 To bytGraphiques
    'INITIALISATION
    Sheets("Graphiques").Select 'Sélectionner la feuille "Graphiques"
    
    'Excel
    strFeuilleGraphique = Application.Index(Range("table_graphiques"), bytI, 1)
    strGaphique = Application.Index(Range("table_graphiques"), bytI, 2)
    
    'Word
    strSignet = Application.Index(Range("table_graphiques"), bytI, 3)
    
    '****************************************************************
    
    'UTILISATION
    'Excel
    Sheets(strFeuilleGraphique).Select 'Sélectionner la feuille du graphique
    ActiveSheet.ChartObjects(strGaphique).Select 'Sélectionner le graphique
    ActiveSheet.ChartObjects(strGaphique).Copy 'Copier le graphique
    
    'Word
    With objApplication
      '1) Activer Word
      .Activate
       
      '2) Sélectionner le signet
      .Selection.Goto what:=wdGoToBookmark, Name:=strSignet

      '3) Effacer le graphique à droite du signet
      .Selection.MoveRight Unit:=wdCell
      .Selection.Delete Unit:=wdCharacter, Count:=1
      
      '4) Inscrire le graphique
      .Selection.Paste
    Application.CutCopyMode = False
    End With
  Application.CutCopyMode = False
  Next bytI
  
    '*********************************************************************
  
  '03-6 Insère les photos
  
  
  
 objApplication.Run "INSERTION_PHOTOS_ACTUALISATION", strChemin_Photos, strNom_Photo1, strNom_Photo2
  
  '03-7) Enregistrer le document Word
  'Aller au début du document
  objApplication.Selection.HomeKey Unit:=wdStory
  objApplication.ActiveDocument.Save

  '04) Fin du traitement
  'Libérer la mémoire vive avec la variable objet
  Set objApplication = Nothing
  
  Exit Sub
  
Application.ScreenUpdating = True
Application.DisplayAlerts = True

message: MsgBox "Erreur Word Mise à jour"
End Sub

Programme Word
Code:
Sub INSERTION_PHOTOS_ACTUALISATION(strChemin_Photos As String, strNom_Photo1 As String, strNom_Photo2 As String) 'Insère une image, la positionne et met une bordure, programme OK

'l'objet InlineShape est une image alignée sur le texte, cet objet permet des bordures mais pas un positionnement devant ou derrière le texte puisqu'il est aligné
'l'objet Shape est une image dans le document, l'image ne permet pas de bordure mais permet un positionnement selon le texte
'dans notre cas nous avons besoin des deux, du coup on insère une image alignée sur le texte pour lui mettre une bordure
'puis nous la convertissons en image shape afin de la position par rapport au texte

Dim objShape As InlineShape 'image en alignée texte
Dim image As Shape 'image
Dim PhotoUne As String
Dim PhotoDeux As String


'Photo 1
' on recherche le signet dans Word pour se positionner
Selection.GoTo What:=wdGoToBookmark, Name:="Sgn_P_Photo1"

Set objShape = Selection.InlineShapes.AddPicture(FileName:=strChemin_Photos & "\" & strNom_Photo1)
    With objShape 'créé des bordures
        With .Borders(wdBorderTop)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth150pt
            .Color = wdColorAutomatic
            .Color = -570359809
        End With
    End With
 
Set image = objShape.ConvertToShape 'converti l'image
With image
.RelativeHorizontalPosition = 1 'Position de départ du décompte de centimètres 1 = début de page
.RelativeVerticalPosition = 0 'Position de départ du décompte de centimètres 0 = début de marge
'2 début colonne, 4 marge gauche, 5 marge droite

.LockAspectRatio = msoTrue
    If .Width > .Height Then 'condition pour redimmensionner différemment les photo paysage ou portrait
        .Width = 170
        .Left = CentimetersToPoints(12) '12 centimètres à partir de la page utiliser InchesToPoints pour les pouces
        .Top = CentimetersToPoints(2.1) '2 centimètres à partir de la marge utiliser InchesToPoints pour les pouces
    Else
        .Height = 130
        .Left = CentimetersToPoints(13.3)
        .Top = CentimetersToPoints(2.1)
    End If
    
.ZOrder msoBringInFrontOfText 'met au premier plan devant le texte
'.ZOrder msoSendBehindText 'option pour image en arrière plan derrière le texte

End With



'Photo 2
' on recherche le signet dans Word pour se positionner
Selection.GoTo What:=wdGoToBookmark, Name:="Sgn_P_Photo2"

Set objShape = Selection.InlineShapes.AddPicture(FileName:=strChemin_Photos & "\")
    With objShape 'créé des bordures
        With .Borders(wdBorderTop)
            .LineStyle = wdLineStyleDouble
            .LineWidth = wdLineWidth150pt
            .Color = wdColorAutomatic
            .Color = -570359809
        End With
    End With
 
Set image = objShape.ConvertToShape 'converti l'image
With image
.RelativeHorizontalPosition = 1 'Position de départ du décompte de centimètres 1 = début de page
.RelativeVerticalPosition = 0 'Position de départ du décompte de centimètres 0 = début de marge
'2 début colonne, 4 marge gauche, 5 marge droite

.LockAspectRatio = msoTrue
    If .Width > .Height Then 'condition pour redimmensionner différemment les photo paysage ou portrait
        .Width = 170
        .Left = CentimetersToPoints(12) '12 centimètres à partir de la page utiliser InchesToPoints pour les pouces
        .Top = CentimetersToPoints(8.1) '2 centimètres à partir de la marge utiliser InchesToPoints pour les pouces
    Else
        .Height = 130
        .Left = CentimetersToPoints(13.3)
        .Top = CentimetersToPoints(8.1)
    End If
    
.ZOrder msoBringInFrontOfText 'met au premier plan devant le texte
'.ZOrder msoSendBehindText 'option pour image en arrière plan derrière le texte

End With

End Sub

J'avais pas noté précédemment mais si je rentre en "dur" le chemin et nom de la photo dans le word et que j'enlève les variable dans Excel quand j'appelle le programme word tout fonctionne très bien !

Merci à toi
 

drul

Obscur pro du hardware
Staff
Meilleure réponse
Ok, ça me prendra un peu de temps pour répondre ...
 

CelineCam91

Nouveau membre
Hello Drul

Je te remercie beaucoup, mais je viens de trouver, en fait le code fonctionne très bien, mais j'avail lu qu'il fallait que je mette la programme Word dans Normal.dot, en fait il fallait le laisser dans le document word, je te confirme mais pour l'instant attends avant de te prendre la tête sur mes programmes !!!

je finalise mes tests et reviens
 

CelineCam91

Nouveau membre
Oui c'est bien ça ça fonctionne nickel, donc le programme word doit se trouver dans le document word et non pas dans l'application word, c'est trop top ça faisait longtemps que je cherchais !!!
Merci de ton aide Drul, j'espère que tu ne m'en veux pas trop de t'avoir fait travailler pour rien, mais c'est pourtant ce que j'avais sur le net de mettre le programme à cet endroit.

Merci
Céline
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 000
Membres
1 586 387
Dernier membre
ouistititouille
Partager cette page
Haut