Discussion:
Word-Seriendruck aus C# starten
(zu alt für eine Antwort)
Veronika Neufeind
2005-10-06 06:45:04 UTC
Permalink
Hallo allerseits,

ich setze das allseits bekannte Standard-Makro für einen Seriendruck ein.
Die Vorlage mit diesem Makro funktioniert prima, d.h. pro Datensatz wird ein
Dokument gedruckt. Wenn ich aber den nachfolgenden Code für den Aufruf nutze,
dann werden zwei Druckaufträge erstellt. Es kommen also zwei Dokumente pro
Datensatz heraus. Hat jemand einen Tip für mich, wo der Fehler liegt? Vielen
Dank für die Hilfe.

Ich weiß natürlich, dass es kein typisches C#-Thema ist. Aber hier kennen
sich einige Jungs sehr gut damit aus ;-) Deshalb mein Versuch.

Gruß Veronika
-----------------------------------

private void btn_AlleDrucken_Click(object sender, System.EventArgs e)
{
Word.ApplicationClass wordapp = new Word.ApplicationClass();
// Object für Missing (oder optional) Argumente.
object oMissing = System.Reflection.Missing.Value;
object oFile = Application.StartupPath + "..\\Test.doc"; //Datei liegt im
Debug

// Erstellen einer Instanz von Word, sichtbar machen und Dokument öffnen.
wordapp.Visible = true;
Word.Documents oDocs = wordapp.Documents;

//WORD10:
Word._Document oDoc = oDocs.Open(ref oFile, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing);

// Makro im Word-Dokument starten.
RunMacro(wordapp, new Object[]{"Test_Druck"});

}

private void RunMacro(object oApp, object[] oRunArgs)
{
oApp.GetType().InvokeMember("Run",
System.Reflection.BindingFlags.Default |
System.Reflection.BindingFlags.InvokeMethod,
null, oApp, oRunArgs);
}
Frank Dzaebel
2005-10-06 08:31:23 UTC
Permalink
Hallo Veronika,
Post by Veronika Neufeind
ich setze das allseits bekannte Standard-Makro für einen Seriendruck ein.
Die Vorlage mit diesem Makro funktioniert prima, d.h. pro Datensatz wird ein
Dokument gedruckt. Wenn ich aber den nachfolgenden Code für den Aufruf nutze,
dann werden zwei Druckaufträge erstellt. Es kommen also zwei Dokumente pro
Datensatz heraus. Hat jemand einen Tip für mich, wo der Fehler liegt? Vielen
Dank für die Hilfe.
Wie sieht der Code Deines "TestDruck" Makros aus ? [VBA]
Ich schätze, Du musst nur da etwas anpassen.
Wieviele Datensätze soll "TestDruck" denn ausdrucken - alle ?

Für die NG, Deine Frage bezieht sich auf :

[Ausführen von Office-Makros unter Verwendung der Automatisierung von Visual
C# .NET]
http://support.microsoft.com/default.aspx?scid=kb;de;306683


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP C#]
http://Dzaebel.NET
Veronika Neufeind
2005-10-06 13:58:20 UTC
Permalink
Hallo Frank,

das Makro sieht so aus und es sollen alle Datensätze gedruckt werden:

--------------------------------
Sub Test_Druck()
'
' Test_Druck Makro
'
With ActiveDocument.MailMerge
.Destination = wdSendToPrinter
.SuppressBlankLines = True

With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With

.Execute Pause:=False

End With
End Sub
-----------------------------

Gruß Veronika
Frank Dzaebel
2005-10-06 19:50:44 UTC
Permalink
Hallo Veronika,
Post by Veronika Neufeind
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
Hmm, das ist der Standard (korrekt), wenn man Makro
aufzeichnen ausführt und müsste *alle* Seiten ausdrucken.
Evtl. schaue ich morgen noch mal rein.


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP C#]
http://Dzaebel.NET
Frank Dzaebel
2005-10-07 06:35:36 UTC
Permalink
Hallo Veronika,
Post by Frank Dzaebel
Hmm, das ist der Standard (korrekt), wenn man Makro
aufzeichnen ausführt und müsste *alle* Seiten ausdrucken.
Evtl. schaue ich morgen noch mal rein.
Du könntest auch einmal explizit folgendes versuchen:

Public Sub Test_Druck()
Dim doc As Word.Document: Set doc = ActiveDocument
Dim myMerge As Word.MailMerge: Set myMerge = doc.MailMerge
myMerge.OpenDataSource Name:= _
"C:\Dokumente und Einstellungen\Frank\Eigene Dateien\Visual
Studio\Projects\WordSerien\WordSerien\Test.mdb", LinkToSource:=True,
AddToRecentFiles:=False, _
Connection:="TABLE Office_Address_List"
myMerge.Destination = wdSendToPrinter
myMerge.SuppressBlankLines = True
myMerge.DataSource.FirstRecord = wdDefaultFirstRecord
myMerge.DataSource.FirstRecord = wdDefaultLastRecord
If myMerge.State = wdMainAndDataSource Then myMerge.Execute Pause:=False
End Sub

Natülich die Pfade anpassen .... bei mir funktioniert es
und es werden *alle* ausgedruckt.


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP C#]
http://Dzaebel.NET
Frank Dzaebel
2005-10-07 06:40:44 UTC
Permalink
Korrektur ...

Public Sub Test_Druck()
Dim doc As Word.Document
Set doc = ActiveDocument
Dim myMerge As Word.MailMerge
Set myMerge = doc.MailMerge
myMerge.OpenDataSource Name:= _
"C:\Dokumente und Einstellungen\Frank\Eigene Dateien\Visual
Studio\Projects\WordSerien\WordSerien\Test.mdb", LinkToSource:=True,
AddToRecentFiles:=False, _
Connection:="TABLE Office_Address_List"
myMerge.Destination = wdSendToPrinter
myMerge.SuppressBlankLines = True
myMerge.DataSource.FirstRecord = wdDefaultFirstRecord
myMerge.DataSource.LastRecord = wdDefaultLastRecord
If myMerge.State = wdMainAndDataSource Then myMerge.Execute Pause:=False
End Sub


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP C#]
http://Dzaebel.NET
Veronika Neufeind
2005-10-07 13:02:02 UTC
Permalink
Hallo Frank,

vielen Dank für deine Mühe und das Erstellen des neuen Makros. Jetzt habe
ich damit aber ein kleines Problem. Es gibt bei mir keine Datenbank als
Quelle, sondern ein TextFile. Die Daten sollen nicht dauerhaft gespeichert
sondern nur temporär für den Druck generiert werden. Danach werden sie gleich
wieder gelöscht. Wie kann ich denn das TextFile in dein Makro einbinden?

Das TextFile sieht so aus:

Filiale;Auswahl1;Auswahl2;Auswahl3;Auswahl4;Auswahl5;Auswahl6;Auswahl7;Auswahl8
Fil_1; Rundschreiben;Personalbogen;;;;;
Fil_2; Rundschreiben;;;;;;;
Fil_3; Rundschreiben;Übersicht;;;;;
usw.
-----------------
Das kuriose ist aber, dass das Drucken korrekt abläuft. Starte ich "mein"
Makro direkt im WordForm, werden alle je einmal gedruckt. Starte ich das
Makro aus der Anwendung heraus, dann wird der Druckjob sofort zweimal
hintereinander generiert und somit werden alle zweimal gedruckt. Ich sehe
einfach diesen Fehler nicht.

Gruß Veronika
Frank Dzaebel
2005-10-07 22:15:53 UTC
Permalink
Hallo Veronika,
Post by Veronika Neufeind
Wie kann ich denn das TextFile in dein Makro einbinden?
Filiale;Auswahl1;Auswahl2;Auswahl3;Auswahl4;Auswahl5;Auswahl6;Auswahl7;Auswahl8
Fil_1; Rundschreiben;Personalbogen;;;;;
Fil_2; Rundschreiben;;;;;;;
Fil_3; Rundschreiben;Übersicht;;;;;
Ok, sagen wir, das wäre die Datei "Daten.txt".
Das ginge dann etwa so :

Public Sub Test_Druck()
Dim doc As Word.Document
Set doc = ActiveDocument
Dim myMerge As Word.MailMerge
Set myMerge = doc.MailMerge
myMerge.OpenDataSource Name:= _
"C:\Dokumente und Einstellungen\Frank\Eigene Dateien\Visual " _
"Studio\Projects\WordSerien\WordSerien\Daten.txt", _
LinkToSource:=True, AddToRecentFiles:=False, _
Connection:="Provider=MSDASQL.1;", SQLStatement:= _
"SELECT * FROM `Daten.txt`"

myMerge.Destination = wdSendToPrinter
myMerge.SuppressBlankLines = True
myMerge.DataSource.FirstRecord = wdDefaultFirstRecord
myMerge.DataSource.LastRecord = wdDefaultLastRecord
If myMerge.State = wdMainAndDataSource Then myMerge.Execute Pause:=False
End Sub
Post by Veronika Neufeind
Das kuriose ist aber, dass das Drucken korrekt abläuft. Starte ich "mein"
Makro direkt im WordForm, werden alle je einmal gedruckt. Starte ich das
Makro aus der Anwendung heraus, dann wird der Druckjob sofort zweimal
hintereinander generiert und somit werden alle zweimal gedruckt. Ich sehe
einfach diesen Fehler nicht.
Ja, ok, ich muss dazu sagen,
ich nutze bei meinem Test Word2003/SP2 nebst Visual Studio 2005/RC1.
Da funktioniert mein Makro so, wie Du wünscht.


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Veronika Neufeind
2005-10-11 16:12:02 UTC
Permalink
Hallo Frank,

leider war ich gestern und heute unterwegs und kann deshalb erst jetzt
antworten. Vielen Dank für den geänderte Makro-Code. Er funktioniert bei mir
leider nicht. Deshalb werde ich nun mein Anwendung doch mit einer Datenbank
versehen und dann deinen ersten Code-Vorschlag einsetzen. Das wird der
sicherste Weg sein.

Also nochmals vielen Dank für deine Hilfe.

Gruß Veronika
Frank Dzaebel
2005-10-11 16:52:51 UTC
Permalink
Hallo Veronika,
Post by Veronika Neufeind
Deshalb werde ich nun mein Anwendung doch mit einer Datenbank
versehen und dann deinen ersten Code-Vorschlag einsetzen. Das wird der
sicherste Weg sein.
Also nochmals vielen Dank für deine Hilfe.
Tja, aber bei mir funktionieren beide Wege.
Deshalb denke ich ist es nicht sicher, dass es
jetzt mit der MDB funktioniert. Mal schauen,
ob ich das noch mal auf Office XP nachtesten
kann, um zu verifizieren, dass es kein Office-Bug ist.


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
Loading...