Zählwerk nach Druck im eins erhöhen?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Hallo Thommy,

mithilfe des folgenden Makros solltest du dein Problem lösen können. Allerdings müssen vorher noch einige Vorbereitungen getroffen werden.

1. Vorbereitungen
  1. Lösche in deiner Kassenbonvorlage alle Seiten bis auf eine sowie die Seitenzahl. Die brauchst du jetzt nicht mehr, da du sie ja nur verwendet hast, um eine fortlaufende Nummer zu erhalten.
  2. Füge an der Stelle der Seitenzahl in der Fußzeile(!) des Dokuments ein Rich-Text-Inhaltssteuerelement ein (zu finden in der Registerkarte Entwicklertools in der Gruppe Steuerelemente). Dieses muss sich wirklich zwingend in der Fußzeile des Dokuments befinden, da das Makro ebenfalls auf die Fußzeile zugreift.
  3. Markiere das eingefügte Steuerelement und klicke im Register Entwicklertools auf Eigenschaften. Gib hier ins Feld Titel zwingend Zähler ein und aktiviere unten unter Sperren das Kontrollkästchen Das Inhaltssteuerelement kann nicht gelöscht werden.
  4. Speichere das Dokument zunächst unter einem beliebigen Namen allerdings zwingend als Dokument mit Makros ab und verlasse zunächst das Dokument.
2. Eine Logdatei für die Zählernummer erstellen
  1. Erstelle im selben (!!) Verzeichnis, in dem auch dein Kassenbon-Dokument liegt, ein neues, normales Word-Dokument (ohne Makros, Format: .docx) mit dem Namen LogZähler. Das Dokument muss genau so heißen!
  2. In diesem Dokument legst du ebenfalls ein Rich-Text-Inhaltssteuerelement an, und gibst diesem Element in seinen Eigenschaften ebenfalls zwingend den Titel Zähler und aktivierst dort ebenfalls das Kontrollkästchen Das Inhaltssteuerelement kann nicht gelöscht werden. Jedoch darf dieses Steuerelement hier nicht in der Kopf- oder Fußzeile stehen! Lege es einfach im normalen Dokumenttext an. Das Dokument soll und muss sonst nichts weiter enthalten!
  3. In das Steuerelement namens Zähler schreibst du noch deinen aktuellen Zählerstand, also die letzte Zählernummer, die bereits mit dem letzten Druck vergeben wurde!
  4. Diese Logdatei namens LogZähler kannst du im Windows-Explorer verstecken bzw. ausblenden (Dokument im Windows-Explorer markieren, dann dort im Register Ansicht auf Ausgewählte Elemente ausblenden klicken), so dass sie von niemandem gesehen und manipuliert werden kann!
3. Das Makro implementieren
  1. Öffne nun wieder dein Kassenbon-Dokument und wechsle hier in der Registerkarte Entwicklertools in den VB-Editor (Schaltfläche Visual Basic oder Druck auf Alt + F11).
  2. Aktiviere hier zunächst das Eigenschaftenfenster über Ansicht Eigenschaftenfenster oder Druck auf F4, falls es bei dir nicht geöffnet sein sollte.
  3. Klicke dann zunächst im Projekt-Explorer dein Projekt doppelt an, damit du dich auch sicher im richtigen Dokument befindest. Das Projekt hat hier den Namen Project (DeinDokumentname).
  4. Erstelle dann über Einfügen Klassenmodul ein Klassenmodul.
  5. Das Klassenmodul wird mit dem Namen Klasse1 erstellt und angewählt. Gib diesem im Eigenschaftenfenster im Feld (Name) zunächst den neuen Namen ThisApplication.

Bild zum Beitrag

6. Füge dann den folgenden Makrocode komplett in das Klassenmodul ThisApplication ein:

Option Explicit

Public WithEvents oApp As Word.Application

Private Sub oApp_DocumentBeforePrint(ByVal Doc As Document, Cancel As Boolean)

    'Hier auszuführenden Code einfügen
    'Der folgende Code erhöht den Zählwert um 1 und kopiert ihn
    Dim docLogZaehler As Document
    Dim intZaehler As Integer
    Dim strZaehler As String
    
    strZaehler = "Zähler"
    
    With ActiveDocument
        Set docLogZaehler = Documents.Open(.Path & "\LogZähler.docx") 'Anpassen
    
        'Wechsel ins Log-Dokument, Zähler aktualisieren und Speichern
        intZaehler = docLogZaehler.SelectContentControlsByTitle(strZaehler).Item(1).Range.Text
        intZaehler = intZaehler + 1 'Zähler um eins erhöhen
        docLogZaehler.SelectContentControlsByTitle(strZaehler).Item(1).Range.Text = intZaehler
        docLogZaehler.Save
        docLogZaehler.Close
        
        'Wechsel ins Ausgangsdokument, Kopieren und Speichern
        ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
        .SelectContentControlsByTitle(strZaehler).Item(1).Range.Text = intZaehler
        ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
        .Save
    End With
    
    Set docLogZaehler = Nothing
    Cancel = False 'Wenn Cancel = True gesetzt wird, wird der Druckbefehl abgebrochen.

End Sub

8. Füge dann noch über Einfügen Modul zusätzlich ein normales Modul ein. Der Name dieses Moduls ist egal, du kannst es umbenennen oder den Namen Modul1 lassen.

9. In dieses Modul fügst du den folgenden Code ein:

Option Explicit

Dim oAppClass As New ThisApplication
'
Public Sub AutoOpen()

    Set oAppClass.oApp = Word.Application
    
End Sub

10. Speichere deine Makros im VB-Editor über einen Klick auf Datei DeinDokumentname speichern.

11. Verlasse danach den VB-Editor und schließe das Dokument. Bevor das Makro funktioniert, muss das Dokument erst einmal neu gestartet werden.

4. Wie das Makro arbeitet

Das Makro fängt den Druckbefehl in deinem Kassenbon-Dokument ab. Sobald dein Kassenbon-Dokument neu geöffnet wird, geschieht das automatisch.

Sobald du dann also den Druckbefehl in dem Dokument auslöst, öffnet das Makro die LogZähler-Datei mit dem aktuellen Zählerstand, erhöht diesen um 1 und schreibt ihn neu in die Logdatei, um beim nächsten Druck den aktuellen Zählerstand parat zu haben. Dann wird die Log-Datei gespeichert und geschlossen. Das geschieht alles völlig automatisch.

Danach wird der um 1 erhöhte Zählerstand an der entsprechenden Stelle in dein Kassenbon-Dokument geschrieben und das Kassenbon-Dokument wird mit dem neuen Zählerstand gespeichert. Das alles geschieht technisch gesehen noch vor dem Drucken, d. h. erst danach wird der eigentliche Druckbefehl ausgelöst, das alles allerdings auch völlig automatisch.

5. Vor- und Nachteile des Makros a) Vorteile (besonders der Logdatei)

Ich habe mich dazu entschieden, mit dem Makro eine separate Logdatei anzulegen und das Makro ausschließlich mit dem Zählerstand aus der Logdatei arbeiten zu lassen. Das wäre nicht nötig gewesen, aber ich hielt es für sinnvoll.

Für dich hat das den Vorteil, dass dein Zählerstand konstant und völlig automatisch mit jedem Druck um 1 erhöht wird, ganz egal, was jemand im Kassenbon-Dokument macht. Und wenn du diese Logdatei im Windows-Explorer ausblendest/versteckst, pfuscht dir da auch keiner drin rum, und nur du weißt, dass sie da ist, denn beim Ausführen des Makros bekommt man nur sehr dezent mit, dass dabei eine andere Datei geöffnet wird (aber man bekommt es kurz mit).

Zudem haben wir die Zähler-Inhaltssteuerlemente in beiden Dateien gegen das Löschen geschützt, so dass man diese auch nicht einfach entfernen kann.

Das heißt: Selbst wenn dir jemand in der Kassenbon-Datei eine willkürliche Zahl oder einen Text in den Zählerstand schreibt, wird dieser Text vor dem nächsten Druck automatisch mit dem richtigen Zählerstand aus der separaten Logdatei überschrieben.

b) Nachteile

Falls jemand versehentlich fälschlicherweise ein Kassenbon-Dokument mit einem erhöhten Zählwert leer ausdruckt, das heißt, der Ausdruck bliebe unbenutzt, ist dieser neue Zählwert bereits vergeben und es wird beim nächsten Druck trotzdem automatisch weiter gezählt. Verhindern kann man das nur, indem man vorher in die Logdatei geht und dort den Zählerstand manuell zurücksetzt und speichert, da das Makro ja automatisch und ausschließlich mit dem Zählerstand aus der Logdatei weiterarbeitet.

Außerdem ist es nicht möglich, über die Einstellung Exemplare im Druckmenü die Anzahl der Ausdrucke mit jeweils neuem Zähler zu erhöhen, um sich so eventuell Zeit zu sparen. Man muss jeden Druckauftrag für jeden Zählwert (bis jetzt) einzeln erteilen und jedes Blatt einzeln ausdrucken.

Ich hoffe, das ist das, was du gesucht hast! Eine Rückmeldung wäre nett (falls sich das Problem noch nicht erledigt hat) und melde dich bitte bei Fragen!

Gruß, BerchGerch

Woher ich das weiß:eigene Erfahrung – Ich arbeite seit 25 Jahren nahezu täglich mit Word.
 - (Microsoft Word, Word 2010, Word 2007)
BerchGerch  01.06.2018, 14:20
Nachtrag: Logdatei im Hintergrund öffnen

Ich hatte ja geschrieben:

(...) [B]eim Ausführen des Makros bekommt man nur sehr dezent mit, dass dabei eine andere Datei geöffnet wird (aber man bekommt es kurz mit).

Es würde ja prinzipiell Sinn machen, wenn der Benutzer eben nicht mitbekommt, dass eine andere Datei geöffnet wird, und alle Prozesse an der Logdatei im Hintergrund ausgeführt würden.

Dies kann man erreichen, indem man im obigen Code die Zeile

Set docLogZaehler = Documents.Open(.Path & "\LogZähler.docx")

ersetzt durch

Set docLogZaehler = Documents.Open(.Path & "\LogZähler.docx", Visible:=False)

Gruß, BerchGerch

0
BerchGerch  01.06.2018, 14:39
Nachtrag 2

Die Zeilen

ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter

und

ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument

kann man im obigen Code ersatzlos löschen. Die werden nicht gebraucht und Word schaltet dann nicht dauernd in die Fußzeile und wieder zurück. Das Makro funktioniert auch so.

Gruß, BerchGerch

0
Hopfenflieger 
Fragesteller
 04.06.2018, 16:30
@BerchGerch

Hallo BerchGerch,

hatte gestern Deinen Vorschlag ausprobiert. Und: hat funktioniert!!!

Ich danke Dir sooo sehr! Vielleicht kann ich mich mal revanchieren.

Bleib gesund und beste Grüße

Thommy

1
BerchGerch  04.06.2018, 18:10
@Hopfenflieger

Sehr gerne. Freut mich, dass ich dir helfen konnte :-)

Vielen Dank für den Stern!

0

VBA in Word ist leider aus Programmierersicht eine einzige Katastrophe.
Was mir dazu einfällt wäre das Event für den Druck abzufangen, eine entsprechende Variable im Dokument zu erhöhen und das Dokument dann zu speichern.

Hopfenflieger 
Fragesteller
 24.02.2018, 14:11

Hallo telematiker86,

ehrlich? Wie macht man das, was Du da beschrieben hast?

Viele Grüße

Thommy

0

Hallo,

falls du zu diesem Problem noch Hilfe benötigst:

  1. Soll das mit dem Ausdrucken eine einmalige Sache werden? Also du hast bereits die vorgefertigten Belege und willst da jetzt einfach nur noch fortlaufende Drucknummern draufbekommen?
  2. Oder willst du eine Dokumentvorlage erstellen, die das permanent kann und immer weiter hochzählt?

Im ersten Fall brauchst du kein VBA und keine Makros, dafür reicht die Serienbrieffunktion von Word.

Im zweiten Fall musst du – wie hier schon geschrieben wurde – den Druckbefehl per VBA abfangen und eine Variable hochzählen lassen.

Welche Variante benötigst du?

Gruß, BerchGerch

Woher ich das weiß:eigene Erfahrung – Ich arbeite seit 25 Jahren nahezu täglich mit Word.
Hopfenflieger 
Fragesteller
 15.03.2018, 18:23

Hallo BerchGerch,

Zuerst einmal vielen Dank für Deine Antwort.

Ja, ich benötige die Variante 2.

Wie kann ich den Druckbefehl abfangen? Und dann eine Variable hochzählen?

Beste Grüße

Thommy

1
BerchGerch  15.03.2018, 18:27
@Hopfenflieger

Weißt du was, ich würde es doch ohne VBA, einfach über die Serienbrieffunktion von Word machen, ist glaube ich einfacher. Allerdings kann ich dir im Moment keine Antwort schreiben, weil ich im Moment viel zu tun habe und das ein wenig erklärt werden muss.

Ich hoffe, das reicht dir bis zum Wochenende. Du hörst dann wieder von mir.

Bis dahin, BerchGerch

0
Hopfenflieger 
Fragesteller
 15.03.2018, 19:39
@BerchGerch

Hallo BerchGerch,

sicher reicht das aus. Ich möchte das für unseren Sportverein nutzen. Es eilt also nicht ganz so sehr.

Noch einmal ganz herzlichen Dank und erfolgreiches Schaffen!

Thommy

0
BerchGerch  17.03.2018, 06:56
@Hopfenflieger

Hallo,

ich hätte da noch zwei Fragen:

  1. Gibt es ein bestimmtes Zahlenformat, das für dich vorteilhaft wäre? Eventuell kann man das ja umsetzen.
  2. Gibt es einen Punkt, ab dem die Zählung wieder bei 1 beginnen soll, oder willst du eine permanente Sequenz, die nur hochzählt und nie mehr bei 1 beginnt?

Es wäre nett, wenn du mir die Fragen beantworten könntest. Dann kann ich mir überlegen, wie man das zielführend umsetzt. Danke.

Gruß, BerchGerch

0
Hopfenflieger 
Fragesteller
 17.03.2018, 20:35
@BerchGerch

Guten Abend BerchGerch,

derzeit verwende ich ein leeres Blatt (zum Aufkleben der Kassenbons) mit einer Fußzeile. Diese beinhaltet den Vereinsnamen, ein Feld mit automat. Datum sowie der Seitenzahl. Nach jedem Drucken erhöhe ich die Seitenzahl. Ich wechsele in die Fußzeile ändere die Seitenzahl um eins höher. Somit habe ich beim erneuten öffnen stets die aktuelle Seitenzahl. Nun werde ich gelegentlich vertreten. Und die Personen weichen von meinem System ab. Somit fehlt gelegentlich eine fortlaufende Nummer oder eine Seite ist doppelt (z.B. nach Seite 12 kommt Seite 14 oder wir haben zweimal die Seite 15 usw.). Unser Kassierer ist dann natürlich mürrisch. Also war mein Gedanke: nach jedem Drucken einfach die Seitenzahl um 1 erhöhen und schon ist immer die richtige Seitennummer parat.

Viele Grüße und noch einen schönen Abend bzw. Sonntag

Thommy

0
BerchGerch  01.06.2018, 08:16
@Hopfenflieger

Hallo Thommy,

wie du sicherlich bemerkt hast, ist dein Anliegen bei mir irgendwann in Vergessenheit geraten, daher habe ich mich lange nicht mehr gemeldet.

Gestern abend bin ich dann wieder auf die Frage gestoßen und habe mittlerweile das Makro programmiert, das den Druckbefehl abfangen würde und den Zählerwert immer um 1 erhöht.

Jetzt aber meine Frage: Brauchst du die Lösung des Problems überhaupt noch?

Gruß, BerchGerch

0

Hallo BerchGerch,

Zuerst einmal vielen Dank für Deine Antwort.

Ja, ich benötige die Variante 2.

Wie kann ich den Druckbefehl abfangen? Und dann eine Variable hochzählen?

Beste Grüße

Thommy