PDA

Vollständige Version anzeigen : Problem mit Word Textmarke ersetzen


Didus
17.02.2003, 20:47
Hallo,

Ich habe eine Code, der eine Dokumentenvorlage (.dot) öffnet, nach eine Textmarke sucht und dort was einfügt.

Nun bekomme ich folgende Fehlermeldung.
462: Der Remote-Server-Computer existiert nicht oder ist nicht verfügbar.

Das komische daran ist, dass wenn ich die DB neu starte, dann funktioniert der Code genau einmal.

Ich habe folgende Code:

Private Sub Dotvorlage_Click()
On Error GoTo Err_Dotvorlage_Click

Dim wdApp As Word.Application

'Vorlage auswählen
sMergeDoc = Left(CurrentDb.Name, _
InStrRev(StringCheck:=CurrentDb.Name, _
StringMatch:="\")) & "Vorlagen\Briefvorlage.dot"

' Erstellen einer neuen, ausgeblendeten Instanz von Word.
Set wdApp = New Word.Application
' Anzeigen dieser Instanz von Word.
wdApp.Visible = True

With wdApp
' Hier Codeanweisungen für die Automatisierung von Word.
.Documents.Add Template:=sMergeDoc, NewTemplate:=False

End With
InsertTextExample
Set wdApp = Nothing

Exit_Dotvorlage_Click:
Exit Sub

Err_Dotvorlage_Click:
MsgBox Err.Description
Resume Exit_Dotvorlage_Click

End Sub

Public Sub InsertTextExample()
' Diese Prozedur zeigt die verschiedenen Möglichkeiten zum Einfügen von
' Text in eine Textmarke und die Ergebnisse der jeweiligen Methode.

Dim rngText As Range
Dim rngBkMark As Range
Dim fndFind As Find
Dim strBkMarkName As String

Const ERR_BKMARK_NOT_EXIST As Long = 5101

On Error GoTo InsertText_Err

strBkMarkName = "Nachname"


' :( beim nachstehenden Set springt er in die Error
Set rngBkMark = ActiveDocument.Content.GoTo(What:=wdGoToBookmark, _
Name:=strBkMarkName)
With rngBkMark

.InsertAfter "...Text After"

End With
'Stop

Set rngBkMark = Nothing

InsertText_End:
Exit Sub
InsertText_Err:
Select Case Err
Case ERR_BKMARK_NOT_EXIST
Case Else
End Select
MsgBox Err.Number & ": " & Err.Description
Resume InsertText_End
End Sub

Nouba
17.02.2003, 22:26
Hallo Didus,

zumindest müßte Word mit einem Quit beendet werden ansonsten läuftst Du vermutlich beim zweiten Start in dieselbe Instanz von Word. Mehr solltest Du im Word Objekt-Katalog finden. F2 im VBA Editor.

Didus
17.02.2003, 22:53
Ja, aber ich möchte das Dokument zuvor noch bearbeiten.
Wenn ich wdApp.Quit einfügen, dann es mir das Dokument.

Gibt es eine Möglichkeit dies anders zu lösen

Besten Dank.

jmc
17.02.2003, 23:29
Hallo Dieter

also ich mach das so (ausschnittsweise, da relativ grosse Function mit vielen If..else... etc. etc.)
Im Module-Header:
Private g_WW As Word.Application


Public Function fncPrintWordDoc(pTemplate As Integer, pFileName As String, pLesson_id As Long, pPerson_Id As Long) As Boolean
.
.
Set g_WW = GetObject(, "Word.Application") ' Ref. auf Instanz von Word, falls
' noch nicht aktiv, Error 429
.
.
.

g_WW.ActiveDocument.SaveAs (pFileName)
fncPrintWordDoc = True

ExitHere:
g_WW.Visible = True
Set g_WW = Nothing
Exit Function


HandleErr:
Select Case Err.Number
Case 429 ' Word noch nicht geladen
Set g_WW = CreateObject("Word.Application")
Resume Next
Case Else
MsgBox "Error " & Err.Number & ": " & Err.description, vbCritical, "modDocuments.fncPrintWordDoc" 'ErrorHandler:$$N=modDocuments.fncPrintWordDoc
End Select
' End Error handling block.
Resume Next 'ExitHere
End Function

Die Funktion beendet, das Formular, aus dem ich sie aufrufe geht zu aber Word und das Dokument sind sichtbar.
Hoffe du kommst weiter.

Alexander Jan Peters
18.02.2003, 01:24
Original geschrieben von Didus
./. ' beim nachstehenden Set springt er in die Error
Set rngBkMark = ActiveDocument.Content.GoTo(What:=wdGoToBookmark, _
Name:=strBkMarkName)
./.
<p>Hallo,

das ist auch nicht verwunderlich, da er keinen Bezug mehr zum Application-Objekt von Word hat, versuch es mal so:</p>
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Sub</span> Dotvorlage_Click()
<span class="TOKEN">On Error GoTo</span> Err_Dotvorlage_Click
&nbsp;
<span class="TOKEN">Dim</span> wdApp <span class="TOKEN">As</span> Word.Application
&nbsp;
<span class="REM">'Vorlage ausw&auml;hlen </span>
sMergeDoc = Left( CurrentDb.Name, _
InStrRev(StringCheck:=CurrentDb.Name, _
StringMatch:=&quot;\&quot;)) &amp; &quot;Vorlagen\Briefvorlage.dot&quot;
&nbsp;
<span class="REM">' Erstellen einer neuen, ausgeblendeten Instanz von Word. </span>
<span class="TOKEN">Set</span> wdApp = <span class="TOKEN">New</span> Word.Application
<span class="TOKEN">With</span> wdApp
.Visible = False <span class="REM">'// Wenn die Instanz </span>
<span class="REM"> '// wirklich ausgeblendet sein soll</span>
.Documents.Add Template:=sMergeDoc, _
NewTemplate:=False
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
&nbsp;
<strong>InsertTextExample wdApp</strong>
&nbsp;
wdApp.Visible = True <span class="REM">'// Wenn die Instanz </span>
<span class="REM"> '// eingeblendet werden soll</span>
<span class="TOKEN">Set</span> wdApp = <span class="TOKEN">Nothing</span>
&nbsp;
Exit_Dotvorlage_Click:
<span class="TOKEN">Exit Sub</span>
&nbsp;
Err_Dotvorlage_Click:
MsgBox Err.Description
<span class="TOKEN">Resume</span> Exit_Dotvorlage_Click
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;
<span class="TOKEN">Public Sub</span> InsertTextExample(<strong>wdApp <span class="TOKEN">As</span> Word.Application</strong>)
<span class="REM">'// Hier fehlte der Bezug zu Word</span>
<span class="REM">'Diese Prozedur zeigt die verschiedenen M&ouml;glichkeiten zum Einf&uuml;gen von </span>
<span class="REM">'Text in eine Textmarke und die Ergebnisse der jeweiligen Methode. </span>
&nbsp;
<span class="TOKEN">Dim</span> rngText <span class="TOKEN">As</span> Range
<span class="TOKEN">Dim</span> rngBkMark <span class="TOKEN">As</span> Range
<span class="TOKEN">Dim</span> fndFind <span class="TOKEN">As</span> Find
<span class="TOKEN">Dim</span> strBkMarkName <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Const</span> ERR_BKMARK_NOT_EXIST <span class="TOKEN">As</span> <span class="TOKEN">Long</span> = 5101
&nbsp;
<span class="TOKEN">On Error GoTo</span> InsertText_Err
&nbsp;
strBkMarkName = &quot;Nachname&quot;
&nbsp;
<span class="REM">'beim nachstehenden Set springt er in die Error </span>
<span class="TOKEN">Set</span> rngBkMark = <strong>wdApp.</strong>ActiveDocument.Content.GoTo( _
What:=wdGoToBookmark, Name:=strBkMarkName)
&nbsp;
<span class="TOKEN">With</span> rngBkMark
.InsertAfter &quot;...Text After&quot;
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
&nbsp;
<span class="REM">'Stop </span>
<span class="TOKEN">Set</span> rngBkMark = <span class="TOKEN">Nothing</span>
&nbsp;
InsertText_End:
<span class="TOKEN">Exit Sub</span>
&nbsp;
InsertText_Err:
Select Case Err
&nbsp;
Case ERR_BKMARK_NOT_EXIST
<span class="TOKEN">Case Else</span>
<span class="TOKEN">End</span> Select
&nbsp;
MsgBox Err.Number &amp; &quot;: &quot; &amp; Err.Description
<span class="TOKEN">Resume</span> InsertText_End
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
<p>
Gruß

Alex</p>

jmc
18.02.2003, 07:43
@Alex

Mann - Augen hast du noch zu so nachtschlafener Zeit !

du gestattest, dass ich noch eine Erklärung und Ergänzung anfüge:

@didus

du deklarierst die Objekt-Variable in der Sub im Form (Button-Click-Ereignis), also lokal, nur innerhalb dieser Sub gültig.
Wenn du nun in eine andere Sub springst, dann kennt diese die Variable nicht.

Du könntest das auch so lösen, indem du die Objekt-Variable in einem globalen Module als Public definierst, dann ist sie immer und überall verfügbar. ;)