lordofremixes
Goto Top

Excel neuestes Tabellenblatt jeden Montag automatisch drucken

Excel Problem automatisches drucken des aktuellsten Tabellenblatts

Hallo zusammen,

stehe vor folgendem Problem. Ich habe eine Excel Datei, in der jeden Freitag ein neuen Tabellenblatt hinzugefügt (KW 41, dann KW 42 usw..) in der die Aufträge der jeweiligen KW drin steht
Ich brauche eine Batch oder ein Makro, das von dieser Datei jeden Montag morgen das neuste Tabellenblatt automatisch ausdruckt.
Habe die vbs soweit, das Problem ist , ich weiß nicht ob der Ansatz so richtig ist und vorallem wie bekomme ich es hin, das er automatisch immer nur das aktuellste Tabellenblatt druckt : (z.B. nur KW 42)`?
Die vbs würde ich dann in den Taskplaner eintragen (ZB Montag 06.00 Uhr) und wenn ich dann in das Geschäft komme, liegen die Aufträge der aktuellen KW schon bereit im Drucker.

Weiß irgendjemand wie man soetwas umsetzen kann?


so weit bin ich gekommen:

' Datei mit einem normale Editor anlegen
' Dateiendung .VBS
' Excel (versteckt) öffnen
Set appXLS = CreateObject("Excel.Application")

' Workbook (versteckt) und schreibgeschützt öffnen
Set wbkXLS = appXLS.Workbooks.Open("C:\auftragstabelle.xls", , True)

' Tabelle1 ausdrucken
wbkXLS.sheets("Tabelle1").PrintOut
' Workbook schließen
wbkXLS.Close

Set wbkXLS = Nothing
appXLS.Quit
Set appXLS = Nothing

Gruß + Danke
lordofremixes

Content-Key: 175940

Url: https://administrator.de/contentid/175940

Ausgedruckt am: 28.03.2024 um 19:03 Uhr

Mitglied: bastla
bastla 08.11.2011 um 13:13:16 Uhr
Goto Top
Hallo lordofremixes!

Unter der Annahme, dass die Benennung konsequent (also immer mit Leerzeichen vor der Wochennummer) erfolgt, könntest Du das Blatt mit der höchsten Nummer so finden:
...
Aktuell = 0
Pre = "KW "  
For Each Blatt In wbkXLS.Worksheets()
    BN = Blatt.Name
    If Left(BN, Len(Pre)) = Pre Then
        Woche = CInt(Split(BN)(1))
        If Woche > Aktuell Then Aktuell = Woche
    End If
Next

wbkXLS.Worksheets(Pre & Aktuell).PrintOut
...
Grüße
bastla

P.S.: Verwende doch bitte "Code"- ...
Mitglied: Jochem
Jochem 08.11.2011 um 14:48:26 Uhr
Goto Top
Moin,

mal gesetzt den Fall, daß das neue Tabellenblatt immer mit "KW " und der Kalenderwoche benannt ist, dann könnte folgende Vorgehensweise zielführend sein:

- über die Excel-Funktion (Kalenderwoche) die aktuelle Kalenderwoche herausfinden
- über die Excel-Funktion (Wochentag) den aktuellen Wochentag herausfinden
- über die Excel-Funktion (Rechts) die letzten beiden Stellen des Tabellenblattnamens herausfinden
- wenn nun die letzten beiden Stellen des Tabellenblattnamens gleich der Kalenderwoche sind und zusätzlich der Wochentag noch ein Montag, dann soll das Tabellenblatt mit dem Namen "KW xx" gedruckt werden.
- das ganze als Autostart-Makros sollte dann funktionieren.

Gruß J face-smile chem
Mitglied: bastla
bastla 08.11.2011 um 15:35:47 Uhr
Goto Top
@Jochem
Von
Die vbs würde ich dann in den Taskplaner eintragen
hältst Du nix?

Grüße
bastla
Mitglied: Jochem
Jochem 08.11.2011 um 16:03:58 Uhr
Goto Top
Moin,

@bastla

viele Wege führen nach Rom ...

Gruß J face-smile cherm
Mitglied: bastla
bastla 08.11.2011 um 16:51:54 Uhr
Goto Top
Hallo Jochem!
viele Wege führen nach Rom ...
Wenn er aber nach Wanne-Eickel will ... face-wink

Aber im Ernst - wie sollte denn Dein Script gestartet, bzw wie sollte die Excel-Datei automatisch geöffnet werden, damit sich
wenn ich dann in das Geschäft komme, liegen die Aufträge der aktuellen KW schon bereit im Drucker.
realisieren lässt?

Grüße
bastla
Mitglied: Jochem
Jochem 08.11.2011 um 17:04:35 Uhr
Goto Top
Moin bastla,

das sind für mich zwei Paar Schuhe: zum einen den Ausdruck starten und zum anderen das richtige Tabellenblatt finden.

Zu 1) ist sicherlich ein geplanter Task sinnvoll, der das Tabellenblatt druckt
Zu 2) ist m.M.n. das Autostart-Makro sinnvoll (liegt wahrscheinlich daran, daß ich mit vbs nix anfangen kann und daher lieber auf das zurückgreife, von dem ich meine, es zu können).

Gruß J face-smile chem
Mitglied: lordofremixes
lordofremixes 09.11.2011 um 18:07:04 Uhr
Goto Top
Hallo bastla,

danke für die schnelle Antwort.
Ist das dann die komplette vbs Datei, denke mal nicht ?
Und wenn doch, was ist mit meinem Quellcode den ich oben gepostet habe? Muss ich den noch anfügen oder wie genau läuft das`?
Das mit der KW davor lässt sich einrichten? Soll dann jedes Tabellenblatt so benamt sein: KW 43 , rechts daneben dann KW 44 ? Geht au irgendwie KW 44/2011 ? (wenn nicht auch nicht schlimm?

Gruß
lordofremixes
Mitglied: lordofremixes
lordofremixes 09.11.2011 um 18:10:54 Uhr
Goto Top
Hallo jochem,

die Vorgehensweise ist einleuchtend, aber umsetzen könnte ich das nicht. Kein Plan wie man sowas auf die schnelle programmieren kann.

Danke trotzdem für die Antwort

Gruß
lordofremixes
Mitglied: bastla
bastla 09.11.2011 um 18:16:18 Uhr
Goto Top
Hallo lordofremixes!

Mein Stückchen Code soll nur aus allen Tabellenblättern, die mit "KW" + Leerzeichen beginnen, jenes mit der höchsten Wochennummer suchen und den Ausdruck vornehmen - es ersetzt daher nur Deine bisherige Zeile
wbkXLS.sheets("Tabelle1").PrintOut
Geht au irgendwie KW 44/2011
Besser wäre "KW 2012/01"(Woche immer zweistellig) - dann könnte einfach der Teil nach dem Leerzeichen als String verglichen werden - der (ungetestete) Code dazu sähe dann so aus:
...
Aktuell = ""  
Pre = "KW "  
For Each Blatt In wbkXLS.Worksheets()
    BN = Blatt.Name
    If Left(BN, Len(Pre)) = Pre Then
        Woche = Split(BN)(1)
        If Woche > Aktuell Then Aktuell = Woche
    End If
Next

MsgBox "Neuestes Blatt: " & Pre & Altuell 'nur zum Testen  
wbkXLS.Worksheets(Pre & Aktuell).PrintOut
...
Grüße
bastla
Mitglied: lordofremixes
lordofremixes 09.11.2011 um 18:39:47 Uhr
Goto Top
Hallo Bastla,

man kann KW 2012/01 in ein Tabellenblatt reinschreiben, es geht kein / und kein \. Nehme jetzt zum Testen KW 2012-01.

Gruß
LordofRemixes
Mitglied: lordofremixes
lordofremixes 09.11.2011 um 18:49:24 Uhr
Goto Top
Hallo bastla,

nach Ausführung diesen Codes :

'Datei mit einem normale Editor anlegen  
' Dateiendung .VBS  
' Excel (versteckt) öffnen  
Set appXLS = CreateObject("Excel.Application")  
' Workbook (versteckt) und schreibgeschützt öffnen  
Set wbkXLS = appXLS.Workbooks.Open("C:\excel\auftrag.xls", , True)  
'Tabelle1 ausdrucken  
Aktuell = ""  
Pre = "KW "  
For Each Blatt In wbkXLS.Worksheets()
    BN = Blatt.Name
    If Left(BN, Len(Pre)) = Pre Then
        Woche = Split(BN)(1)
        If Woche > Aktuell Then Aktuell = Woche
    End If
Next
MsgBox "Neuestes Blatt: " & Pre & Aktuell   
'nur zum Testen  
wbkXLS.Worksheets(Pre & Aktuell).PrintOut
' Workbook schließen  
wbkXLS.Close
Set wbkXLS = Nothing
appXLS.Quit
Set appXLS = Nothing

kommt Windows Script Host Fehlermeldung
Skript: C:\excel\excel_letzte_KW.vbs in Zeile 10, Zeichen 1, Fehler: Das Objekt unterstützt diese Eigenschaft oder Methode nicht 'wbkXLS.Worksheets' Code 800A01B6 .
Weißt du wieso dieser Fehler kommt?

Gruß
lordofremixes
Mitglied: bastla
bastla 09.11.2011 um 19:57:04 Uhr
Goto Top
Hallo lordofremixes!

VBS mag die Klammern nach "wbkXLS.Worksheets" nicht - lass die mal weg ...

Grüße
bastla
Mitglied: lordofremixes
lordofremixes 09.11.2011 um 20:06:03 Uhr
Goto Top
Hallo bastla,

das läuft einwandfrei, face-smile außer...
Habe "KW 2007-08" und "KW2008-08" , das Jahr wird nicht untersucht und er druckt KW2007-08.
Hast du da noch irgendwie ne Idee?

Gruß
lordofremixes
Mitglied: bastla
bastla 09.11.2011 um 20:11:42 Uhr
Goto Top
Hallo lordofremixes!
Hast du da noch irgendwie ne Idee?
Mach mal vor 2008 ein Leerzeichen ... face-wink

Grüße
bastla
Mitglied: lordofremixes
lordofremixes 09.11.2011 um 20:42:53 Uhr
Goto Top
Hallo bastla,

haha das wars , hab nach KW das Leerzeichen vergessenface-smile
Coole Sache, ist echt ne schöne Sache. ich teste es wenn ich wieder am richtigen pc bei einer excel datei mit ca. 180 mb.

Werde dir dann Bescheid geben und die Frage lösen. Danke schonmal für die Hife.

Gruß
lordofremixes
Mitglied: lordofremixes
lordofremixes 13.12.2011 um 14:39:28 Uhr
Goto Top
Hallo bastla,

ich habe den Code jetzt schon im Einsatz und es läuft wunderbar.
Jetzt habe ich eine Frage um das Programm auszuweiten.

Kann ich oben bei Zeile 6:
Set wbkXLS = appXLS.Workbooks.Open("C:\excel\auftrag.xls", , True)

Auch mehrere Dateien angeben z.B. auftrag.xls, auftrag2.xls usw.. und wie oder wo gebe ich das ein?

Gruß
lordofremixes
Mitglied: bastla
bastla 13.12.2011 um 15:29:51 Uhr
Goto Top
Hallo lordofremixes!

Da musst Du eigentlich nur ein Schleifchen um die Verabeitung der einzelnen Datei wickeln - ungetestet etwa so:
Dateien = Array("C:\excel\auftrag.xls", "C:\excel\auftrag2.xls", "C:\excel\auftrag3.xls") 'zu verarbeitende Dateien  

' Excel (versteckt) öffnen  
Set appXLS = CreateObject("Excel.Application")  

For Each Datei In Dateien
    ' Workbook (versteckt) und schreibgeschützt öffnen  
    Set wbkXLS = appXLS.Workbooks.Open(Datei, , True)
    'Tabelle1 ausdrucken  
    Aktuell = ""  
    Pre = "KW "  
    For Each Blatt In wbkXLS.Worksheets()
        BN = Blatt.Name
        If Left(BN, Len(Pre)) = Pre Then
            Woche = Split(BN)(1)
            If Woche > Aktuell Then Aktuell = Woche
        End If
    Next
    MsgBox "Neuestes Blatt: " & Pre & Aktuell   
    'nur zum Testen  
    wbkXLS.Worksheets(Pre & Aktuell).PrintOut
    ' Workbook schließen  
    wbkXLS.Close
Next

Set wbkXLS = Nothing
appXLS.Quit
Set appXLS = Nothing
Grüße
bastla
Mitglied: lordofremixes
lordofremixes 14.12.2011 um 08:27:10 Uhr
Goto Top
Hallo bastla,

das funktioniert einwandfrei.. Danke !!

Jetzt hat der Mitarbeiter mich aber falsch informiert.
In seiner Exceldateien stehen schon die KW alle drin für das ganze Jahr.
Das heißt er hat schon KW 2012-01 bis KW 2012-55 drin stehn. (Hab eigentlich gedacht er erstellt jede Woche das Excelblatt neu, dem war nicht so).

Gibt es eine Möglichkeit, den Quellcode so zu verändern , das er nicht die letzte KW ausdruckt , sondern die aktuelle?

Gruß
lordofremixes
Mitglied: bastla
bastla 14.12.2011 um 09:42:34 Uhr
Goto Top
Hallo lordofremixes!
Gibt es eine Möglichkeit, den Quellcode so zu verändern , das er nicht die letzte KW ausdruckt , sondern die aktuelle?
Wenn Du "aktuelle" (bzw "Berechnung KW") definieren kannst ...

... genügt es, die Zeilen 12 bis 18 durch etwas in der Art
Aktuell = Berechnung KW
zu ersetzen ...

Grüße
bastla
Mitglied: lordofremixes
lordofremixes 14.12.2011 um 11:35:02 Uhr
Goto Top
Hallo bastla,

was meinst du mit Berechnung KW definieren?
Ich meine damit die KW, die wir dann gerade haben.

Habe es ersetzt, es kommt aber der Fehler Anweisungsende erwartet Code 800A0401 in Zeile 10.

Gruß
lordofremixes
Mitglied: bastla
bastla 14.12.2011 um 11:40:57 Uhr
Goto Top
Hallo lordofremixes!

Soferne das die verwendet Excel-Version kann (Stichwort: Funktion "KALENDERWOCHE()" verfügbar), etwa so:
Aktuell = WorksheetFunction.WeekNum(Date)
Ansonsten findest Du zB hier eine Berechnungsmethode ...

Grüße
bastla
Mitglied: lordofremixes
lordofremixes 14.12.2011 um 12:49:55 Uhr
Goto Top
Hallo bastla,

und das füge ich dann wie oben beschrieben in Zeile 12 bis 18 ein?

werde es gleich mal testen?
Mitglied: lordofremixes
lordofremixes 14.12.2011 um 13:11:56 Uhr
Goto Top
Hallo bastla,

sorry erstmal dass ich so viel frag.

ich habe folgenden code eingegeben:

Dateien = Array("C:\excel\auftrag.xls", "C:\excel\auftrag2.xlsx") 'zu verarbeitende Dateien  
' Excel (versteckt) öffnen  
Set appXLS = CreateObject("Excel.Application")  
For Each Datei In Dateien
    ' Workbook (versteckt) und schreibgeschützt öffnen  
    Set wbkXLS = appXLS.Workbooks.Open(Datei, , True)
    'Tabelle1 ausdrucken  
    Aktuell = ""  
    Pre = "KW "  
Aktuell = WorksheetFunction.WeekNum(Date)
    MsgBox "Neuestes Blatt: " & Pre & Aktuell   
    'nur zum Testen  
    wbkXLS.Worksheets(Pre & Aktuell).PrintOut
    ' Workbook schließen  
    wbkXLS.Close
Next
Set wbkXLS = Nothing
appXLS.Quit
Set appXLS = Nothing

Es kommt dann der Fehler Objekt erforderlich: WorksheetFunction Code 800A01A8.
Ich verstehe die Berechnungsmethode nicht.

Hoff du weißt da noch was.

Gruß
lordofremixes
Mitglied: bastla
bastla 14.12.2011 um 19:29:33 Uhr
Goto Top
Hallo lordofremixes!

Wie ich schon erwähnte: "Soferne das die verwendete Excel-Version kann" ...

... andererseits hatte ich doch einen Link angeboten (und von dort stammt die unten verwendete Berechnungsmethode) ...

Anyhow: So könnte das auch bei Dir klappen:
Dateien = Array("C:\excel\auftrag.xls", "C:\excel\auftrag2.xlsx") 'zu verarbeitende Dateien  
Pre = "KW "  
kw = 4 + Date - Weekday(Date, 2)
Aktuell = (kw - DateSerial(Year(kw), 1, -6)) \ 7

' Excel (versteckt) öffnen  
Set appXLS = CreateObject("Excel.Application")  

For Each Datei In Dateien
    ' Workbook (versteckt) und schreibgeschützt öffnen  
    Set wbkXLS = appXLS.Workbooks.Open(Datei, , True)
    'Tabelle1 ausdrucken  
    MsgBox "Neuestes Blatt: " & Pre & Aktuell   
    'nur zum Testen  
    wbkXLS.Worksheets(Pre & Aktuell).PrintOut
    ' Workbook schließen  
    wbkXLS.Close
Next

Set wbkXLS = Nothing
appXLS.Quit
Set appXLS = Nothing
Grüße
bastla
Mitglied: lordofremixes
lordofremixes 15.12.2011 um 09:54:30 Uhr
Goto Top
Hallo bastla,

cool cool dass du dir noch Zeit nimmst für mein Problem. Find ich wirklich super von dir!!

Wenn ich dieses Script ausführe, kommt als Meldung : Neustes Blatt: KW 50 und wenn ich dann auf OK drücke kommt ein Fehler: Zeile 15, Zeichen 5, Fehler: Index außerhalb des gültigen Bereichs. Code 800A0009 Quelle Laufzeitfehler in Microsoft VBScript und gedruckt wird nichts.

Und welche Vorraussetzungen müssen erfüllt sein, damit das Script funktioniert Muss ich die Tabellenblätter dann trotzdem so benennen? Also KW 2012-06 oder muss ich sie anders benennen?

Gruß
lordofremixes
Mitglied: bastla
bastla 15.12.2011 um 11:25:42 Uhr
Goto Top
Hallo lordofremixes!

Der Tabellenblattname wird (wie ja auch in Zeile 13 ausgegeben wird) aus den Variableninhalten von "Pre" und "Aktuell" zusammengesetzt - daher ggf den Inhalt von "Pre" anpassen ...

... und falls tatsächlich führende Nullen (also "06" anstatt "6") für die Wochennummer gewünscht sind, anstelle von nur "Aktuell"
Right("0" & Aktuell, 2)
verwenden.

Grüße
bastla
Mitglied: lordofremixes
lordofremixes 20.12.2011 um 10:02:03 Uhr
Goto Top
Hallo bastla!

Ich häng immer noch an dem Script fest. Ich habe jetzt in der Exceldatei zum Testen ein Tabellenblatt mit KW 2011-51 eingefügt und darauf groß TEST geschrieben.
Es wird auch richtig erkannt.
Er bringt aber einen Fehler und druckt nichts aus.

Dateien = Array("C:\excel\auftrag.xls") 'zu verarbeitende Dateien  
Pre = "KW "  
kw = 4 + Date - Weekday(Date, 2)
Aktuell = (kw - DateSerial(Year(kw), 1, -6)) \ 7
' Excel (versteckt) öffnen  
Set appXLS = CreateObject("Excel.Application")  
For Each Datei In Dateien
    ' Workbook (versteckt) und schreibgeschützt öffnen  
    Set wbkXLS = appXLS.Workbooks.Open(Datei, , True)
    'Tabelle1 ausdrucken  
    MsgBox "Neuestes Blatt: " & Pre & Aktuell   
    'nur zum Testen  
    wbkXLS.Worksheets(Pre & Aktuell).PrintOut
    ' Workbook schließen  
    wbkXLS.Close
Next
Set wbkXLS = Nothing
appXLS.Quit
Set appXLS = Nothing

Zeile 13, Zeichen 5. Index außerhalb des gültuigen Bereichs Code 800A0009

Verstehe diesen Fehler nicht, aber ich vermute das hier der Druckbefehl nicht richtig umgesetzt wird?

Gruß
lordofremixes
Mitglied: bastla
bastla 20.12.2011 um 13:06:10 Uhr
Goto Top
Hallo lordofremixes!

Wenn Dein Tabellenblatt "KW 2011-51" heißt - woher soll dann in der Zeile 13 die Jahreszahl kommen(in "Pre" ist sie genauso wenig enthalten wie in "Aktuell")? Auch in der Ausgabe der Zeile 11 dürfte ja eigentlich nur
Neuestes Blatt: KW 51
stehen ...

Grüße
bastla
Mitglied: lordofremixes
lordofremixes 21.12.2011 um 09:01:24 Uhr
Goto Top
Hallo bastla!!

ach gott ja. irgendwie stand ich da auf dem schlauch.
So eine ***.
Funktioniert einwandfrei !!

Man sollte sich den Code schon genauer anschauen!!
Was sagt diese Zeile eigentlich genauer aus?
Weekday(Date, 2) UND WARUM eigentlich 4 + date ?

gruß
lordofremixes
Mitglied: bastla
bastla 21.12.2011 um 12:41:16 Uhr
Goto Top
Hallo lordofremixes!
Was sagt diese Zeile eigentlich genauer aus?
Lass Dir die Einzelwerte ausgeben, schlage bei Bedarf die Funktion nach und interpretiere Deine Ergebnisse - zum Ergebnis der Interpretation kannst Du mich dann (falls noch erforderlich face-smile) wieder fragen ...

Grüße
bastla