Ich versuche eine Seriennummer in Excel zu generieren, die sich bei jedem Ausdruck automatisch um 1 erhöht!
Es muß wohl ein Makro sein, das bei jeder Aktion „Drucken“ eine Variable eins hochzählt.
Weiß vielleicht jemand wie das geht, oder hat vielleicht so was ähnliches mal gemacht?
Du hast schon eine richtige Vermutung. Makro aber auch noch etwas mehr… (ich hab’s unter Office XP probiert)
Damit Du dir die Standard-Vorlagen nicht schrottest, empfehle ich Makros (Punkt 2) und Menüanpassung (Punkt 3) nur für die aktuelle Arbeitsmappe zu speichern!
Eine Dokumenteneigenschaft festlegen
Datei->Eigenschaften->Anpassen
Name: Dokumentnummer
Typ: Zahl
Wert 0
->hinzufügen
->OK
ein Makro
Sub zaehleUndDrucke()
Dim d As Integer
d = ActiveWorkbook.CustomDocumentProperties(„Dokumentnummer“)
ActiveWorkbook.CustomDocumentProperties(„Dokumentnummer“) = d + 1
Jetzt klicke mit der rechten Maustaste auf das Druckersymbol und wähle „Makro zuweisen…“
Nur noch das zaehleUndDrucke Makro von oben finden und zuweisen, das war’s.
Achtung: das Hochzählen und drucken funzt nach diesem Beispiel nur:
auf dem Standarddrucker
mit den aktuellen Druckereinstellungen
Aber nicht, wenn man über Datei->Drucken… geht.
Ein anderer Nachteil ist, das „versierte“ Anwender die Dokumenteneigenschaft auch manipulieren können.
Dein Problem ist nicht neu - das kam schon öfters hier in den vergangenen knapp sieben Jahren Aber ich habe erst jetzt mal geguckt, was man da machen kann und bin auf eine einfache Lösung gestossen, wenngleich auch nicht ohne Makro. Der Vorteil ist, dass man als Nutzer nichts davon merkt und drucken kann, wie man will:
Private Sub Workbook\_BeforePrint(Cancel As Boolean)
Cells(2, 3).Value = Cells(2, 3).Value + 1
End Sub 'Workbook\_BeforePrint
Das ist schon alles. Um das ein bissl zu demonstrieren, habe ich mal noch ein paar Zeilen drumherum gestrickt:
Private Sub Workbook\_BeforePrint\_(Cancel As Boolean)
Dim Meldung As String
Dim Counter As Integer
Const x As Byte = 2
Const y As Byte = 2
Cells(y + 0, x).Value = "Gedruckt:"
Cells(y + 1, x).Value = "Abgebrochen:"
Meldung = "Soll das Arbeitsblatt """ & ActiveSheet.Name & """ wirklich gedruckt werden?"
If (MsgBox(Meldung, vbYesNo, "Sicherheitsabfrage") = vbYes) Then
Cancel = False
Counter = Cells(y + 0, x + 1).Value
Cells(y + 0, x + 1).Value = Counter + 1
Else
Cancel = True
Counter = Cells(y + 1, x + 1).Value
Cells(y + 1, x + 1).Value = Counter + 1
End If 'MsgBox
Cancel = True 'Nur zum Testen, damit nicht immer gleich gedruckt wird.
End Sub 'Workbook\_BeforePrint
Das sollte eine Lösung sein. Leider eben nur mit Makro - das heisst, dass es nicht funktioniert, wenn man diese beim Öffnen der Datei deaktiviert.
Die Lösung von Hawky hab ich heute mal ausprobiert, allerdings bekam ich ne Fehlermeldung „Objekt erforderlich“.
Da ich vorher noch nicht mit Makros gearbeitet habe und auch kein VB programmieren kann, bekam ich den Fehler leider nicht weg.
Morgen werd ich dann Kristians Lösung mal ausprobieren!
Die Mischung macht´s
Mir ist gerade aufgefallen, dass ich vergessen hatte, die Lösung von Hawky mit ins Spiel zu bringen. Die ist nämlich unter Umständen viel eleganter, weil man den Counter nicht irgendwo in eine Tabelle schreiben muss, sondern dezent und sicher in die Dokument-Eigenschaften schreibt.
Statt
Private Sub Workbook\_BeforePrint(Cancel As Boolean)
Cells(2, 3).Value = Cells(2, 3).Value + 1
End Sub 'Workbook\_BeforePrint
(was zum Demonstrieren geeigneter war) kann man also genauso gut
Private Sub Workbook\_BeforePrint(Cancel As Boolean)
ActiveWorkbook.CustomDocumentProperties("Dokumentnummer") = \_
ActiveWorkbook.CustomDocumentProperties("Dokumentnummer") + 1
End Sub 'Workbook\_BeforePrint
schreiben. Eine schöne Sache, die ich noch gar nicht kannte
Und eines hatte ich noch vergessen: Diese Prozedur muss natürlich, wie der Name schon sagt, im VBA-Blatt für die Arbeitsmappe stehen, nicht in dem von einer Tabelle oder in einem Modul.
Was es sonst noch für Ereignis-Handler gibt, sieht man, wenn man im VBA-Editor die Auswahlboxen über dem Quelltext ausprobiert. Dazu links von „(Allgemein)“ z.B. auf „Workbook“ umstellen und dann rechts den Handler auswählen.
Kristian
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo!
Also das Makro funktioniert. Ich habs mit folgendem gemacht:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cells(2, 3).Value = Cells(2, 3).Value + 1
End Sub 'Workbook_BeforePrint
Allerdings muß ich die Tabelle jetzt in Word einfügen. Und in Word zählt er vor dem Drucken die Zahl nicht hoch!! Alle anderen Makros laufen!
Habt ihr ne Idee??
zwar habe ich es geschafft, den Wert in dem Excel-Blatt
zu editieren (probieren geht über studieren), aber nun,
da ich das „nur noch schnell fertig machen“ wollte, muss
ich leider feststellen, dass es bei Word offenbar keinen
Druck-Handler gibt, so wie bei Excel. Dort heisst er ja
„'Workbook_BeforePrint()“.
Wenn also das Druck-Ereignis bei Word nicht abgefangen
werden kann, nützen die folgenden Zeilen recht wenig:
Sub VorDemDrucken()
Dim T As Object
With ActiveDocument.InlineShapes(1).OLEFormat
.ActivateAs "Excel.Sheet"
.Activate
Set T = .Object.Sheets("Tabelle1")
T.Cells(2, 3).Value = T.Cells(2, 3).Value + 1
Set T = Nothing
End With
End Sub
Kristian
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]