PDA

Vollständige Version anzeigen : Word soll trotz IF Abfrage im Vordergrund bleiben


IT-Fuzzi
08.05.2004, 00:45
Hallo,
mit folgendem Code öffne ich aus einem Access Formular ein WORD Dokument (.dot)


Dim oApp As Object
Set oApp = CreateObject("Word.Application")
oApp.Visible = True
With oApp
'Sichtbar machen
.Visible = True
'Dokument öffnen
.Documents.Add ("D:\Hotel\Hotelrechnung.dot")
.ActiveDocument.Bookmarks("Adresse").Select
.Selection.Text = (CStr(Forms!Hotelrechnung!Adresse))
.ActiveDocument.Bookmarks("Nr").Select
.Selection.Text = (CStr(Forms!Hotelrechnung!Nr))
.ActiveDocument.Bookmarks("Datum").Select
.Selection.Text = (CStr(Forms!Hotelrechnung!Datum))
.ActiveDocument.Bookmarks("Kundennummer").Select
.Selection.Text = (CStr(Forms!Hotelrechnung!Kundennummer))
End With

If MsgBox("Möchten Sie die Rechnung als gedruckt markieren?", vbYesNo, "Frage") = vbYes Then
CurrentDb.Execute "Update Rechnung SET Gedruckt = true Where id = " & Me!id
DoCmd.OpenForm "Offene_Posten_Hotelrechnung"
Else
CurrentDb.Execute "Delete from Rechnung Where id = " & Me!id
Forms!Hotelrechnung.Requery
MsgBox "Die Rechnung wurde aus der Rechnungstabelle gelöscht!"
End If


Mein Problem besteht jedoch darin, dass ich die IF Abfrage drin haben muss (rot) um -wenn das Dokument gedruckt wurde- in meiner Access Tabelle den DS als GEDRUCKT zu markieren.

Leider ist es jetzt so, dass sobald WORD geöffnet und die Daten an das WORD Dok übergeben wurden, sich die IF Abfrage meldet und sich dabei natürlich in den Vordergrund schiebt, so dass mein WORD Dokument über die Taskleiste "hervorgeholt" werden muss um erst einmal ausgefüllt zu werden. Die Bestätigung ob gedruckt wurde oder nicht kann ja erst NACH dem Ausfüllen und Speichern/Drucken des WORD Dokumentes erfolgen.

Wie also schaffe ich es, dass die MSGBOX zwar erscheint, jedoch WORD dennoch im Vordergrund geöffnet bleibt???

ODER: gibt es ne Möglichkeit dass sobald das WORD Dokument (aus WORD raus) gedruckt wurde dies in der Access Tabelle bestätigt wird (z.B. mit dem UPDATE Befehl)?

Hat jemand ne Idee?

Nouba
08.05.2004, 05:45
Hallo IT-Fuzzi,

Eine MsgBox wird sich immer in den Vordergrund vor alle atktive Programme setzen.

Ich verstehe den Arbeitsfluß nicht? Warum sollte jemand ein Dokument als gedruckt markieren, das noch nicht zu Papier gebracht wurde? Warum stellst Du die Frage nicht eindeutig: "Wollen Sie die Rechnungsdaten löschen?". Wie sollte es danach an dieser Stelle weitergehen, wenn Dein Wunsch erfüllbar wäre?

Steffen0815
08.05.2004, 10:31
Hallo IT-Fuzzi,
nur mal so 'ne Idee.
Wenn du wirklich nur Word "vorholen" willst, geht's auf brutale Art, dass du Access einfach in den Hintergrund schickst.

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Option</span> <span class="TOKEN">Compare</span> <span class="TOKEN">Database</span>
<span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
<span class="TOKEN">Const</span> SW_HIDE = 0 <span class="REM">' Fenster ausblenden</span>
<span class="TOKEN">Const</span> SW_NORMAL = 1 <span class="REM">' Fenster wiederherstellen bzw. einblenden</span>
<span class="TOKEN">Private</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> ShowWindow <span class="TOKEN">Lib</span> &quot;user32&quot; _
(<span class="TOKEN">ByVal</span> hwnd <span class="TOKEN">As</span> Long, <span class="TOKEN">ByVal</span> nCmdShow <span class="TOKEN">As</span> <span class="TOKEN">Long</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">Private Sub</span> Befehl0_Click()
<span class="TOKEN">Dim</span> nResult <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> nCmdShow <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> hwindow
&nbsp;
<span class="REM"> ' Access in Hintergrund schicken</span>
hwindow = Application.hWndAccessApp
nCmdShow = SW_HIDE
nResult = ShowWindow(<span class="TOKEN">ByVal</span> hwindow, <span class="TOKEN">ByVal</span> nCmdShow)
<span class="TOKEN">Call</span> ShowWindow(Me.hwnd, SW_NORMAL)
&nbsp;
&nbsp;
Application.FollowHyperlink &quot;MeineWorddatei.doc&quot;, , <span class="TOKEN">True</span>
&nbsp;
MsgBox (&quot;Wieder zur&uuml;ckmelden&quot;)
&nbsp;
<span class="REM"> ' Access wieder vorholen</span>
hwindow = Application.hWndAccessApp
nCmdShow = SW_NORMAL
nResult = ShowWindow(<span class="TOKEN">ByVal</span> hwindow, <span class="TOKEN">ByVal</span> nCmdShow)
<span class="TOKEN">Call</span> ShowWindow(Me.hwnd, SW_NORMAL)
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Vorher liess aber erst dies Klick mich (http://support.microsoft.com/default.aspx?scid=kb;de;510049)

Gruß Steffen

Hondo
08.05.2004, 12:25
Hallo,
klasse, dieser Thread merk ich mir, sowas hab ich schon immer mal gesucht. Das kann man immer mal brauchen.
Dafür gibts von mir 5 Sterne.

Gruß Andreas

IT-Fuzzi
08.05.2004, 19:29
Hallo @ll

@Nouba:
Also das Problem ist ja eigentlich so, daß sobald der User mit dem "Übergabe-Button" das WORD Dokument öffnet noch nicht feststeht, ob die Rechnung die er dort schreibt letztlich auch gedruckt wird (zumindest besteht die Möglichkeit, dass er dies nicht tut, wenn auch unwahrscheinlich, denn wozu sonst sollte er dann das Word Dokument öffnen wenn nicht zum drucken, aber ich kenne meinen User - der muss alles "ausprobieren" :( )

Wenn der User nun also das Dokument nicht ausdruckt, darf es in Access ja auch nicht als gedruckt markiert werden, sondern dann muss der angefangene DS ja gelöscht werden. Im Umkehrfall soll der DS aber als gedruckt gekennzeichnet werden.

Ich hab jetzt mal folgende "Zwischenlösung" gefunden:
Die MSG Box ist weg (wird also nicht mehr aufgerufen) - WORD wird geöffnet, der User entscheidet ob er druckt oder nicht - schließt Word wieder - ist wieder in Access und muss dann dort bestätigen ob er gedruckt hat oder nicht !

Mir schmeckt es aber nicht dem User zu überlassen ob gedruckt wurde oder nicht, denn wenn er vergißt den Button "Gedruckt" zu klicken verschwindet der DS im Nirvana...und ich kann den Müll dann wieder "rausfummeln"

Den Lösungsvorschlag von Steffen muss ich heute Nacht mal testen.

Erst mal vielen Dank für Eure Stellungnahmen zu dem "Problem"
(Naja - ich geh halt immer davon aus dem User so wenig wie möglich Entscheidungsfreiheit zu lassen, denn wenn er was entscheiden soll wird`s garantiert falsch gemacht ;) )

Nouba
08.05.2004, 19:35
Warum druckst Du das Word Dokument nicht aus Access-VBA heraus nach Userbestätigung und warum bringst Du das Dolument überhaupt zur Ansicht?

IT-Fuzzi
08.05.2004, 19:51
Ich würde es zu gerne direkt als Access Bericht (wie die anderen Rechnungen und Lieferscheine auch) gestalten, jedoch handelt es sich hierbei um eine Hotelrechnung, die der User unbedingt in WORD schreiben muss (Freitext, ohne Artikelzuweisung aus Access ect.) Es geht dabei hauptsächlich darum dass die Rechnungsnummern aus den Access Daten auch auf die (externe) Hotelrechnung übernommen werden (was ich ja soweit geschafft habe mit meiner jetzigen Version)

Wenn ich aus VBA ausdrucke ist dem User nicht geholfen, da er ja die Rechnung noch nicht "gestalten" konnte.

Also - es MUSS über die externe Word Datei laufen...und ich bin am verzweifeln wie ich das Prinzip so sicher wie möglich machen kann damit ich nicht alle 3 Tage irgendwelche verlustigen Rechnungen in der Access Tabelle suchen kann.

Möglichkeit wäre auch, wenn der User das Access Formular schließt eine MSGBox mit der Abfrage ob Speichern (und als gedruckt markieren) oder löschen (einfache Ja/Nein Sache)


So muss er eine Entscheidung treffen bevor er das Formular in Access verläßt

Nun gut - es gibt Dinge die einfach nicht machbar sind (wie die Anweisung aus Word an Access) da muss ich halt dann improvisieren - auch wenn`s weh tut :)
Ausserdem muss ich ja erst noch Steffens Vorschlag ausprobieren und da komm ich jetzt nicht zu, mach ich heut Nacht - da is mehr Ruhe ;)

Nouba
09.05.2004, 03:58
Ich verstehe es immer nocht nicht. Soll der User im Word-Dokument rumtippen und dieses "fertigstellen"?

IT-Fuzzi
09.05.2004, 04:03
Hiho...so spät noch wach ? ;)

Ja es handelt sich um eine Rechnungsvorlage die lediglich den Adreßblock enthält. Der Rest soll Freitext reingeschrieben werden können (das ist ne Art Sonderrechnung die von den Rechnungen im Access abweichen soll und nur für Artikel, die nicht im Access gelistet sind (in dem fall dreht es sich um Hotelrechnungen)

Hab jetzt aber ein paar Buttons eingebaut (in Access) mit denen der User eben speichern, löschen und (beim speichern) auch als gedruckt markieren kann.

Aus Word kann ich ja den Befehl nicht an Access weitergeben (z.B.beim Ausdruck sollte der Befehl Update tblRechnung SET Gedruckt = true o.ä kommen)

Nouba
09.05.2004, 06:06
Hallo IT-Fuzzi,

fast richtig - ich bin so früh schon auf. :)

Ich würde es zumindest andenken, die noch notwendigen Zusatzangaben (Freitext[e]) vom User in einem Formular in entsprechende Textfelder vornehmen zu lassen. Dann könnte der Ablauf ~ so sein: Word-Dokument von Vorlage erstellen -> Felder ausfüllen -> Dokument drucken -> Abfrage ob Druck erfolgreich war -> Datenmanipulation durchführen -> Dokument bei Bedarf speichern -> Word schließen. Dabei würde Word nicht angezeigt werden. Außerdem würde ich statt Textmarken auszuwählen (da geht der Cursor dann immer hin und das kostet Zeit), mit Range(Bereich)-Objekten arbeiten, was die Ausführung beschleunigt. Mehr dazu kannst Du unter VBA-technischer Umgang mit Textmarken (http://mypage.bluewin.ch/reprobst/WordFAQ/TM.htm) nachlesen.

IT-Fuzzi
09.05.2004, 20:40
Hi Nouba,
danke erstmal für Deine Hilfe,
ich werde dieses Model mal genauer checken und mit dem Kunden besprechen (allerdings ist der Mensch sehr "Word-verliebt" was diesbezüglich ne Überzeugungsarbeit werden müsste :( wenn er auf sein geliebtes WORD verzichten muss ;)


Jedenfalls Danke für Deine Hilfe