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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
| Public Sub WordErstellen()
'table des relations
'les signets Word portent les mêmes noms que les Nom définis dans Excel
Dim rngSource() As Excel.Range
Dim rngQuelleName As Excel.Range
Dim inbQuelle As Integer
Dim wksProv As Worksheet
Dim strSheet As String
Dim strRange As String
Dim strDatei As String
Dim strTyp() As String
Dim bytLoop As Byte
Dim strBookmark As String
Dim wdRg As Word.Range
Dim appwd As Word.Application
Dim doc As Word.Document
Dim i As Integer
Dim lngPosExcl As Long
On Error GoTo WordErstellen_Error
dlgwait.Show vbModeless
dlgwait.controlBar.Caption = "ù"
Application.Cursor = xlWait
'routine à désactiver après construction du UserForm
If wkbRoot Is Nothing Then
Call InitializeWKB
End If
dlgwait.lblAction.Caption = "Read parameters"
'objets internes (préalablement publics)
Set wksRoot_Diagramme = wkbRoot.Worksheets("Diagramme")
Set wksRoot_Tabelle = wkbRoot.Worksheets("Tabellen")
strVorlagePfad = ReadConfigWert("Vorlage", 1)
strVorlage = ReadConfigWert("Vorlage", 2)
Set rngQuelleName = wksRoot_Hilfsregister.Range("Verknüpfungsobjekte")
inbQuelle = rngQuelleName.Rows.Count
ReDim rngSource(1 To inbQuelle)
ReDim strTyp(1 To inbQuelle)
For i = 1 To inbQuelle
'lit la valeur de la feuille et de la plage
strSheet = rngQuelleName.Cells(i, 2).Value
strRange = rngQuelleName.Cells(i, 1).Value
strTyp(i) = rngQuelleName.Cells(i, 3).Value
'affecte la valeur de la plage à l'objet
Set rngSource(i) = Worksheets(strSheet).Range(strRange)
Next i
Set rngQuelleName = Nothing
dlgwait.lblAction.Caption = "Start MS Word"
'démarre Word et crée un document depuis le modèle
Set appwd = CreateObject("Word.Application")
appwd.Visible = False
dlgwait.lblAction.Caption = "Open MS Word Template"
Set doc = appwd.Documents.Add(Template:=strVorlagePfad & strVorlage, NewTemplate:=False, DocumentType:=0)
'Application.ScreenUpdating = False
'parcourt la collection des objets à copier
For i = 1 To inbQuelle
'réinitialisation du compteur
bytLoop = 0
RepriseCopie:
dlgwait.lblAction.Caption = rngSource(i).Name.NameLocal & " copy/paste, loop: " & bytLoop
rngSource(i).Parent.Select
'sélectionne la cellule A1 de la feuille (ainsi sort du mode graphique)
rngSource(i).Parent.Range("A1").Select
Call ClearClipboard
'copie la source dans le presse-papier
rngSource(i).Copy
'définit le nom du signet
strBookmark = rngSource(i).Name.NameLocal
'remplace le nom du registre, si le signet est défini au niveau du registre et pas au niveau du classeur
lngPosExcl = InStr(1, strBookmark, "!")
strBookmark = Mid(strBookmark, lngPosExcl + 1)
'atteint le signet (l'utilisateur voit le déroulement) dans Word et colle
doc.Bookmarks(strBookmark).Select 'cette opération peut sans autre être mise en commentaire
Set wdRg = doc.Bookmarks(strBookmark).Range
'selon le type d'objet, colle un RTF ou un objet Excel. Permet de réduire la taille du Word et la rapidité des collages
Select Case strTyp(i)
Case "Object"
wdRg.PasteSpecial Link:=False, DataType:=wdPasteOLEObject, Placement:=wdInLine, DisplayAsIcon:=False
Case "Text"
wdRg.PasteSpecial Link:=False, DataType:=wdPasteRTF, Placement:=wdInLine, DisplayAsIcon:=False
End Select
dlgwait.controlBar.Caption = "w" & dlgwait.controlBar.Caption
Next i
'redimensionne et ferme les variables
ReDim rngSource(0)
Set wdRg = Nothing
Call ClearClipboard
'sauvegarde du document
'construction du nom de fichier et sauvegarde
dlgwait.lblAction.Caption = "Save Word document"
strDatei = ReadConfigWert("VorschauPfad", 1) & wksRoot_Hilfsregister.Range("NR_RevDatumVortag").Value & ReadConfigWert("VorschauPfad", 2)
doc.SaveAs2 strDatei
'fermeture de Word
doc.Close False
dlgwait.controlBar.Caption = "w" & dlgwait.controlBar.Caption
appwd.Quit
dlgwait.Hide
'Fehlerlog abfüllen (Zeitpunkt der Worddatei Erstellung, Dateiname)
wksRoot_Fehlerlog.Range("NR_LetztesWordDoc").Value = strDatei
wksRoot_Fehlerlog.Range("NR_LetztesWordDocSendDatum").Value = Format(Date, "dd.mm.yyyy")
wksRoot_Fehlerlog.Range("NR_LetztesWordDocSendDatumZeit").Value = Format(VBA.Time, "hh:mm:ss")
wksRoot_Fehlerlog.Range("NR_Status").Value = 2
'Status Update des Textfeldes txtStatus auf Userform
Call Status(wksRoot_Fehlerlog.Range("NR_Status").Value)
Application.Cursor = xlDefault
Exit Sub
WordErstellen_Error:
If Err.Number = 4605 Or Err.Number = 0 Then
If bytLoop < 3 Then
bytLoop = bytLoop + 1
GoTo RepriseCopie
End If
Else
On Error Resume Next
dlgwait.Hide
doc.Close False
appwd.Quit
Application.Cursor = xlDefault
MsgBox "Fehler Nummer: " & Err.Number & vbCrLf & "Fehlerbeschreibung: " & Err.Description _
& vbCrLf & vbCrLf & _
"Module WordInterface, WordErstellen()" _
& vbCrLf & vbCrLf & _
"Bitte Fehlermeldung als Printscreen an red@sbb.ch senden.", 16, "Unbekannter Fehler"
End If
End Sub |
Partager