XL 2019 Objet sheet dans feuille WORD 2019

Gilles4681

XLDnaute Nouveau
Bonjour à toutes et à tous :)
je suis tout nouveau sur ce forum (mais pas en VBA :p !)
Je souhaite pouvoir extraire depuis word les données contenues dans une feuille de calcul excel insérée dans la page WORD (voir PJ).

J'arrive à le faire pour un objet tableau mais pas pour un objet Feuille de calcul excel et je n'ai rien trouvé sur les différents forums VBA...

En espérant que quelqu'un puisse me débloquer pour pouvoir pointer sur la feuille contenue dans le WORD 🙏

Bonne fin de journée à vous toutes et à vous tous 🧑‍🎄


PS : comme mon sujet est à cheval entre word et excel je n'ai pas trop su où le ranger dans le forum...
 

Pièces jointes

  • Doc1.docx
    22.9 KB · Affichages: 20

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

J'ai commencé à titiller la bête
VB:
Sub Test_OLEObject()
Dim xlApp As Object
ActiveDocument.InlineShapes(1).OLEFormat.DoVerb
Set xlApp = GetObject(, "Excel.Application")
xlApp.Workbooks(1).Sheets(1).Range("A1") = "Ceci est un test"
xlApp.Workbooks(1).Sheets(1).Range("A1").Copy
ActiveDocument.InlineShapes(1).OLEFormat.Object.Application.Quit
ActiveDocument.Range(1, 1).PasteAndFormat (wdPasteDefault)
End Sub
Et comme ca virait à la complication, je suis parti acheter des chocolats.
;)
 

Gilles4681

XLDnaute Nouveau
Bonsoir le fil

J'ai commencé à titiller la bête
VB:
Sub Test_OLEObject()
Dim xlApp As Object
ActiveDocument.InlineShapes(1).OLEFormat.DoVerb
Set xlApp = GetObject(, "Excel.Application")
xlApp.Workbooks(1).Sheets(1).Range("A1") = "Ceci est un test"
xlApp.Workbooks(1).Sheets(1).Range("A1").Copy
ActiveDocument.InlineShapes(1).OLEFormat.Object.Application.Quit
ActiveDocument.Range(1, 1).PasteAndFormat (wdPasteDefault)
End Sub
Et comme ca virait à la complication, je suis parti acheter des chocolats.
;)
Bonsoir Staple 👍
MERCI 🙏c'est exactement cela que je voulais!!
Cependant j'ai un soucis à la fermeture de l'application excel...
En mode pas à pas elle se ferme mais en continue elle reste ouverte et ne rebascule pas sur l'application word.
J'ai essayé (sans grande conviction...) de rajouter des DoEvents mais c'est pareil...

VB:
Dim xlApp As Object
    With ActiveDocument.InlineShapes(1).OLEFormat
        '.Edit
        '.Activate
        .DoVerb
        Set xlApp = GetObject(, "Excel.Application")
        xlApp.Workbooks(1).Sheets(1).Range("A1") = "TEST2"
        test = xlApp.Workbooks(1).Sheets(1).Cells(1, 2)
        Debug.Print test
        .Object.Application.Quit
    End With

Une autre idée géniale ?!

Bonne soirée
 

Staple1600

XLDnaute Barbatruc
Re

C'est bien pour cela qu'après avoir acheté du chocolat, je suis passé à la bière ;)
Etant adepte (dès que je le peux) du principe K.I.S.S, et si j'étais moi
1) Je titille Excel dans Excel (pas chez son cousin Word)
2) En lieu et place d'un objet ExcelSheet, j'utiliserai un tableau dans Word (puisqu'on peut y faire des calculs sommaires)

Et si j'étais moi, je te poserai la question suivante
Quel est le contexte?
Quel est le but de la manoeuvre?
 

Gilles4681

XLDnaute Nouveau
Le contexte c'est la gestion devis.
Je remplis ma trame de devis au format word et après j'alimente une base de données de gestion/suivi des devis (d'où le besoin de récupérer les données), génération pdf, envoie mail au client automatique, ...etc.

Tout fonctionne parfaitement maintenant sauf la fermeture de l'appli excel...
 

Gilles4681

XLDnaute Nouveau
Bonjour à tous,
les vacances sont terminées et j'ai pu terminer mon code qui depuis Word envoie un mail avec Outlook et alimente un fichier Excel.
Il faut:
- placer le code ci-dessous sous "Normal" dans le VBA de Word
- Placer le fichier joint "SUIVI_DEVIS.xlsx" dans C:\temp
- Avoir Outlook d'ouvert
- Exécuter le code depuis le fichier Word joint "JD_0001 - Ind A.docx"

Attention :
- la modification des signets dans la page word est capricieuse! Bien afficher les "[ ]" pour ne pas supprimer les signets à la modification!

Je suis évidement ouvert à toutes questions ou améliorations ;-)
En mode exécution normale (sans "pas à pas") l'objet feuille excel dans word reste ouvert ..... HELP ?!

Bonne journée ( et bonne année !)

VBAment votre



VB:
Sub GESTION_DEVIS()
Dim s_date As Date

'----- Récupération des signets du WORD -----
s_Num_devis = ActiveDocument.Bookmarks("Num_devis").Range.Text
s_date = ActiveDocument.Bookmarks("Date").Range.Text
s_prénom_nom = ActiveDocument.Bookmarks("prénom_nom").Range.Text
s_client = ActiveDocument.Bookmarks("Client").Range.Text
s_adresse_mail = ActiveDocument.Bookmarks("adresse_mail").Range.Text
s_Intitulé = ActiveDocument.Bookmarks("Intitulé").Range.Text
'--------------------------------------------

'----- Vérification de l'indice -----
nett_s_Num_devis = nettoyage(s_Num_devis)
str_indice = "-IND"

If InStr(1, nett_s_Num_devis, str_indice, vbTextCompare) = 0 Then
    MsgBox ("Il manque l'indice sur le nom du devis: ex JD_0001 - Ind A !")
    End
End If
'------------------------------------

'----- Sauvegarde du fichier WORD -----
temp_ = Split(nett_s_Num_devis, str_indice)
Num_devis = temp_(0)
Ind_devis = temp_(1)

Application.DisplayAlerts = False

If ActiveDocument.Path = "" Then

    With Application.FileDialog(msoFileDialogFolderPicker)
        .AllowMultiSelect = False
        .InitialFileName = "C:\temp"
        .Show
        If .SelectedItems.Count > 0 Then
            Dossier = .SelectedItems(1) & "\"
        Else
            MsgBox ("Merci de choisir un dossier! -> FIN")
            End
        End If
    End With
    
    ActiveDocument.SaveAs filename:=Dossier & s_Num_devis & ".docx"
    
    If ActiveDocument.Path = "" Then End

Else
    ActiveDocument.SaveAs filename:=ActiveDocument.Path & "\" & s_Num_devis & ".docx"
End If

Application.DisplayAlerts = True

DoEvents
'--------------------------------------



'----- Génération du fichier PDF -----
Dim chemin_nom As String
chemin = ActiveDocument.Path
nom = Split(ActiveDocument.Name, ".")(0) & ".pdf"
chemin_nom = chemin & "/" & nom

Select Case IsFileOpen(chemin_nom)
    Case True
        temp_10 = MsgBox("Merci de fermer le fichier :" & Chr(10) & Chr(10) & chemin_nom & Chr(10) & Chr(10) & " avant le l'enregistrer à nouveau !", vbCritical)
        End
    Case False
        ActiveDocument.ExportAsFixedFormat OutputFileName:=chemin_nom, ExportFormat:=wdExportFormatPDF, OpenAfterExport:=True
End Select
DoEvents
'-------------------------------------



'-------- Génération du mail ---------
Dim appOutlook As Outlook.Application
Set appOutlook = Outlook.Application
Dim MESSAGE As Outlook.MailItem
Dim objRecipient As Outlook.Recipient
Set MESSAGE = appOutlook.CreateItem(olMailItem)
With MESSAGE
    .Display
    .Subject = "MGI : devis N°" & s_Num_devis & " (" & s_Intitulé & ")"

    'on ajoute un Corps en TEXTE HTML
    texte_mail = "<html><body><p>"
    texte_mail = texte_mail & "Bonjour " & s_prénom_nom & "," & "</p>"
    texte_mail = texte_mail & "<p>En réponse à votre consultation intitulée : <em><strong><u>" & s_Intitulé & "</em></strong></u>"
    texte_mail = texte_mail & ", veuillez trouver ci-joint notre devis n°<em><strong><u>" & s_Num_devis & "</em></strong></u></p>"
    texte_mail = texte_mail & "<p></p>"
    texte_mail = texte_mail & "<p>En espérant un retour favorable de votre part sur cette offre.</p>"
    texte_mail = texte_mail & .HTMLBody & "</body></html>" ' Ne pas oublier le .HTMLBody pour conserver la signature ;-)
    
    .HTMLBody = texte_mail

    'Ajout d'un destinataire principal
    Set objRecipient = .Recipients.Add(s_adresse_mail)
    objRecipient.Type = olTo    'olBCC, olCC, olOriginator ou olTo.
    objRecipient.Resolve

    'Ajout d 'une PJ si elle existe.
    If Dir(chemin_nom) <> "" Then
        .Attachments.Add chemin_nom
    End If
    
End With
DoEvents
'-------------------------------------



'----- Sauvegarde dans la Base De Données -----
test_excel:
'lecture du tableau excel dans word pour trouver le TOTAL HT
Dim xlApp As Object
With ActiveDocument.InlineShapes(1).OLEFormat
    '.Edit
    .Activate
    '.DoVerb
    Set xlApp = GetObject(, "Excel.Application")
    i = 2
    While Not UCase(xlApp.Workbooks(1).Sheets(1).Cells(i, 4)) Like "*TOTAL*HT*"
        i = i + 1
        If i > 50 Then
            MsgBox ("|Total HT| non trouvé!")
            End
        End If
    Wend
    
    Total_HT_devis = xlApp.Workbooks(1).Sheets(1).Cells(i, 5).Value
    xlApp.Quit
    '.Object.Application.Quit
End With

'sauvegarde dans la BDD
PathName = "C:\temp\"
filename = "SUIVI_DEVIS.xlsx"
sheetname = "SUIVI"

Dim appXl As Excel.Application
Dim ficXl As Excel.Workbook

'crée un nouvelle instance Excel
Set appXl = New Excel.Application
'ouvre le fichier
Set ficXl = appXl.Workbooks.Open(PathName & filename)

'lecture écriture dans la BDD
With appXl.Worksheets(sheetname)
    i = 2
next_i:
    cell_excel = nettoyage(.Cells(i, 3))

    If cell_excel <> "" Then
        temp_ = Split(cell_excel, str_indice)
        cell_excel_Num_devis = temp_(0)
        cell_excel_Ind_devis = temp_(1)
        Select Case cell_excel_Num_devis
            Case Is = Num_devis
                'c'est le même numéro de devis
                If Ind_devis = cell_excel_Ind_devis Then
                    'c'est le même indice de devis => on écrase les données précédentes
                Else
                    'ce n'est pas le même indice de devis => on continue de chercher
                    i = i + 1
                    GoTo next_i
                End If
            Case Empty
                'fin du fichier => on ajoute le nouveau devis
            Case Else
                ' c'est un autre devis => on continue de chercher
                i = i + 1
                GoTo next_i
        End Select
    End If
    
    'écriture des données sur la bonne ligne
    .Cells(i, 1) = s_client
    .Cells(i, 2) = s_prénom_nom
    .Hyperlinks.Add Anchor:=.Cells(i, 3), Address:=ActiveDocument.Path & "\" & ActiveDocument.Name, ScreenTip:="Ouvrir devis", TextToDisplay:=s_Num_devis 'lien hypertexte permettant d'ouvrir le devis
    .Cells(i, 4) = s_date
    .Cells(i, 5) = NoSem(s_date)
    .Cells(i, 6) = convert_month(Month(s_date))
    .Cells(i, 7) = Year(s_date)
    .Cells(i, 8) = s_Intitulé
    .Cells(i, 9) = Total_HT_devis

End With

'sauve et ferme le fichier et quitte excel
appXl.DisplayAlerts = False
ficXl.SaveAs filename:=PathName & filename
appXl.DisplayAlerts = True
ficXl.Close
appXl.Quit
'----------------------------------------------

End Sub

Function IsFileOpen(filename As String) As Boolean

Dim filenum As Integer, Errnum As Integer

On Error Resume Next

filenum = FreeFile()

Open filename For Input Lock Read As #filenum
Close filenum

Errnum = Err

On Error GoTo 0

Select Case Errnum
    Case 0
        IsFileOpen = False
    Case 70
        IsFileOpen = True
End Select

End Function

Function nettoyage(texte)

nettoyage = Replace(texte, " ", "")
nettoyage = UCase(nettoyage)

End Function

Function convert_month(texte)

    Select Case texte
        Case 1
            convert_month = "Janvier"
        Case 2
            convert_month = "Février"
        Case 3
            convert_month = "Mars"
        Case 4
            convert_month = "Avril"
        Case 5
            convert_month = "Mai"
        Case 6
            convert_month = "Juin"
        Case 7
            convert_month = "Juillet"
        Case 8
            convert_month = "Août"
        Case 9
            convert_month = "Septembre"
        Case 10
            convert_month = "Octobre"
        Case 11
            convert_month = "Novembre"
        Case 12
            convert_month = "Décembre"
        Case Else
            MsgBox ("erreur mois")
            End
    End Select

End Function

Function NoSem(d As Date) As Long
   d = Int(d)
   NoSem = DateSerial(Year(d + (8 - Weekday(d)) Mod 7 - 3), 1, 1)
   NoSem = ((d - NoSem - 3 + (Weekday(NoSem) + 1) Mod 7)) \ 7 + 1
End Function
 

Pièces jointes

  • JD_0001 - Ind A.docx
    32.5 KB · Affichages: 6
  • SUIVI_DEVIS.xlsx
    11.5 KB · Affichages: 5

Staple1600

XLDnaute Barbatruc
Bonjour le fil, Gilles4681

Merci pour ton feedback
Puisque je passe dans ton fil, je me suis permis de mettre ta fonction convert_month au régime ;)
VB:
Function convert_month(texte)
convert_month = Application.Proper(MonthName(CLng(texte), False))
End Function
Sub test()
Dim mois$
mois = "7"
MsgBox convert_month(3)
MsgBox convert_month(Month(Date))
MsgBox convert_month(mois)
End Sub
 

Discussions similaires

Réponses
15
Affichages
855
Compte Supprimé 979
C

Statistiques des forums

Discussions
312 505
Messages
2 089 101
Membres
104 031
dernier inscrit
RimeF