Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1624to1628
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
VBA Drucklayout und UserForm
31.05.2018 02:45:18
Michael
Hallo ich brauche eure Hilfe bei meinem Projekt "Lieferscheine erstellen"
In einem Reiter "Verteilung" befindet sich üblicherweise eine Tabelle in der ich nur Zahlen eintrage welche Filiale wieviel von einem Artikel bekommt.
In einem Reiter "Warenliste" befindet sich eine Tabelle, in der alle Artikel mit den dazu gehörenden Details ist.
In den Reitern "xxx_LS" ist dann der jeweilige Lieferschein für einen Kunden.
Das ausdrucken dieser Lieferscheine ist mein Problem.
1) Das Seitenlayout in abhängigkeit von der Anzahl der aufzuführenden Ware (Genaue Beschreibung in den roten Reitern)
2) Das erstellen einer passenden Userform oä.
3) Das generieren von Lieferschein/Rechnungs Nummern, die natürlich auf Jahre hinaus fortgeführt werden sollen
(Üblicherweise erstelle ich von dieser Mappe wöchentlich eine Kopie, lösche die einträge in Verteilung und beginne von neuem)
Ich hoffe das mir einer von euch Helfen kann
Vielen Dank in Voraus
Eine Beispielmappe findet ihr hier:
https://www.herber.de/bbs/user/121898.xlsx

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Drucklayout und UserForm
31.05.2018 06:47:49
Hajo_Zi
das geht nicht, da eine XLSX Datei kein Makro enthalten kann.
Ich sehe keinen Grund eine Datei 2x zu speichern. Ich führe keine Liste unter welchem Dateinamen ich die Datei gespeichert habe.
Keine Beschreibung warum dort Seitenumbruch. Die Tabellen werden nicht aus Warenliste erstellte, Tabelle Warenliste leer. Rote Tabelle sind also fest also mache Seitenumbruch von Hand.

Beiträge von Werner, Luc, robert, J.O.Maximo und folgende lese ich nicht.
AW: VBA Drucklayout und UserForm
31.05.2018 08:43:11
Michael
Hallo Hajo
Zitat: "das geht nicht, da eine XLSX Datei kein Makro enthalten kann."
Das weiß ich auch. Es sollte ja auch nur ein Beispiel sein in der ich die Probleme erklärt habe.
Zitat:"Ich sehe keinen Grund eine Datei 2x zu speichern"
Diese Datei ändert sich jede Woche. Niemand Bestellt jede Woche das Selbe. Also wird jede Woche ('Pro Woche 1 Bestellvorgang pro Filiale') gespeichert, um sie gegebenenfalls nachzuvollziehen.
Zitat: "Die Tabellen werden nicht aus Warenliste erstellte, Tabelle Warenliste leer"
Warum sollte ich Firmen- Internas veröffentlichen, wenn sie völlig unwichtig für die Fragen/Probleme sind, die ich habe.Bis zum Seitenlayout/Drucken der Lieferscheine und dem erstellen einer UserForm, ist meine .xlsm fertig. Es ist also unerheblich wie die Reiter Verteilung und Warenliste aussehen, weil kein Code darauf zugreifen muss.
Zitat:"Rote Tabelle sind also fest also mache Seitenumbruch von Hand."
Genau das möchte ich ja "vereinfachen". Ohne eienem automatischen Seitenlayout, muss ich jede Woche all diese Einstellungen 17x einzeln vornehmen und das ist dann doch ziehmlich aufwendig und leider auch sehr Fehlerlastig.
Auch wenn mir deine Antwort nicht geholfen hat, trotzdem Danke
Gruß Michael
Anzeige
AW: VBA Drucklayout und UserForm
31.05.2018 10:08:38
Werner
Hallo Michael,
Hajo hat eine ganz spezielle Excel-Version. Mit der kann man aus einer .xlsx keine .xlsm machen, zumindest nicht ohne sie mehrfach speichern zu müssen. *Ironie aus
Weitere Kommentare dazu spare ich mir lieber.
Viel kann ich im Moment nicht für dich machen, da ich im Moment von hier aus nichts hochladen kann.
Nur mal ein Vorschlag zum "Setzen der Haken" ausgehend von deiner Mustertabelle.
Im Blatt Verteilung die Zellen E16 und E18 bis E34 formatieren: Schriftart: Symbol und fett
Folgendes Makro ins Codemodul vom Blatt Verteilung
-Rechtsklick auf den Blattreiter - Code anzeigen - Code rechts ins Codefenster kopieren
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("E16,E18:E34")) Is Nothing Then
Cancel = True
Target = IIf(Target = "Ö", " ", "Ö")
End If
End Sub
Doppelklick in Zelle E16 bzw. E18 bis E34 setzt in der jeweiligen Zelle einen Haken bzw. entfernt diesen.
Für mehr habe ich im Moment leider keine Zeit.
Gruß Werner
Anzeige
AW: VBA Drucklayout und UserForm
31.05.2018 10:45:13
Werner
Hallo Michael,
der Haken bei "Alle Blätter" muß ja raus, sobald mindestens ein spezifisches Blatt ausgewählt wurde.
Genauso müssen die Haken bei den einzelnen Blättern raus, sobald "Alle Blätter" angehakt wurde.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address(0, 0) = "E16" Then
Cancel = True
Target = IIf(Target = "Ö", "", "Ö")
If Target = "Ö" Then Range("E18:E34").ClearContents
End If
If Not Intersect(Target, Range("E18:E34")) Is Nothing Then
Cancel = True
Target = IIf(Target = "Ö", "", "Ö")
If Target = "Ö" Then Range("E16").ClearContents
End If
End Sub
Gruß Werner
Anzeige
AW: VBA Drucklayout und UserForm
31.05.2018 18:40:17
Michael
Hallo Werner
Ich hoffe dir reicht virtuelle Schokolade ☺ ✿✿✿ ☆☆☆
Deine Antwort hat mir schon sehr viel weitergeholfen. Nicht direkt der Code für die "Häkchen" als solches, sondern mehr der Hinweis darauf das man den Code direkt in den Reiter schreiben kann. Habe bereits 2 dutzend CommandButtons gekillt und durch Klickbare Zellen ersetzt. Wenn eine ähnliche Lösung auch für das Problem mit dem Seitenlayout möglich wäre, bräuchte ich keine UserForm. "Häkchen" setzen könnte ich ja nun schon Mal.
Vielen Dank und Gruß
Michael
AW: VBA Drucklayout und UserForm
01.06.2018 04:52:39
Werner
Hallo Michael,
teste mal:
Code in ein allgemeines Modul - Schaltfläche auf dein Blatt und der Schaltfläche den Code zuweisen.
Option Explicit
Public Sub Drucken()
Dim loLetzte As Long, i As Long, k As Long, loAnzahl As Long
Dim ws As Worksheet, raZelle As Range, arrBlatt()
Dim strPrinterName As String, varAuswahl As Variant
strPrinterName = Application.ActivePrinter
If Range("E16") = "Ö" Then
varAuswahl = Application.Dialogs(xlDialogPrinterSetup).Show
If varAuswahl = "Falsch" Then Exit Sub
For Each ws In ThisWorkbook.Worksheets
If Right(ws.Name, 2) = "LS" Then
With ws
loLetzte = .Cells(.Rows.Count, 1).End(xlUp).Row
.ResetAllPageBreaks
loLetzte = .Cells(.Rows.Count, 1).End(xlUp).Row
.PageSetup.PrintArea = ""
.PageSetup.PrintArea = "A1:H" & loLetzte
For i = 48 To loLetzte Step 48
.HPageBreaks.Add Before:=.Cells(i + 1, 1)
Next i
'nur zum Testen, kann gelöscht werden
MsgBox ws.Name
'Ändern in .PrintOut
.PrintPreview
End With
End If
Next
ElseIf WorksheetFunction.CountIf(Range("E18:E34"), "Ö") > 0 Then
varAuswahl = Application.Dialogs(xlDialogPrinterSetup).Show
If varAuswahl = "Falsch" Then Exit Sub
loAnzahl = WorksheetFunction.CountIf(Range("E18:E34"), "Ö")
ReDim Preserve arrBlatt(loAnzahl - 1)
For Each raZelle In Worksheets("Verteilung").Range("E18:E34")
If raZelle.Value = "Ö" Then
arrBlatt(k) = raZelle.Offset(, -3).Value
k = k + 1
End If
Next raZelle
For k = LBound(arrBlatt) To UBound(arrBlatt)
With Worksheets(arrBlatt(k))
loLetzte = .Cells(.Rows.Count, 1).End(xlUp).Row
.ResetAllPageBreaks
loLetzte = .Cells(.Rows.Count, 1).End(xlUp).Row
.PageSetup.PrintArea = ""
.PageSetup.PrintArea = "A1:H" & loLetzte
For i = 48 To loLetzte Step 48
.HPageBreaks.Add Before:=.Cells(i + 1, 1)
Next i
'nur zum Testen, kann gelöscht werden
MsgBox arrBlatt(k)
'Ändern in PrintOut
.PrintPreview
End With
Next k
Else
MsgBox "Es sollte schon mindestens ein Blatt" & vbLf & _
"zum Drucken ausgewählt werden."
End If
Application.ActivePrinter = strPrinterName
End Sub
Gruß Werner
Anzeige
AW: VBA Drucklayout und UserForm
01.06.2018 11:36:10
michael
Hallo Werner
Habe deinen Code nach Anweisungen einfach in meine Beispielmappe eingefügt.
Wenn ich den Haken bei "Alle Arbeitsblätter Drucken" setze, dann klappt auch alles.
Wenn ich nur Haken bei einer und/oder mehreren Filialen als Auswahl setze dann kommt ein Requester mit der Mitteilung:
Laufzeitfehler '9'
Index außerhalb des gültigen Bereichs
Beim Debuggen markiert er in dem Abschnitt "Next raZelle" den nachfolgenden Text gelb.
"With Worksheets(arrBlatt(k))"
Frage: Kann man den Druckvorgang in irgendeiner Form zusammenfassen? So das nicht jede Filiale einzeln in der Seitenansicht eingeleitet wird. Ich weiß nicht genau wie ich es ausdrücken soll, aber wenn man mit Hilfe der 'STRG' Taste, 2 oder mehr Reiter zusammen Auswählt, dann auf Datei Drucken Klickt, reiht Excel die Seiten in einem Vorgang hintereinander auf und man muss nur einmal auf Drucken Klicken.
Vielen, vielen Dank für deine Hilfe
Gruß Michael
Anzeige
AW: VBA Drucklayout und UserForm
01.06.2018 12:21:44
Werner
Hallo Michael,
dann stimmen die Blattnamen, so wie du sie im Blatt "Verteilung" erfasst hast nicht mit den tatsächlichen Namen der Blättern überein.
In deiner Musterdatei stand dort immer "Drucken Blatt ....". Dort darf nur der tatsächliche Name der entsprechenden Blätter erfasst sein. Lösch bitte alles bis auf den tatsächlichen Blattnamen raus (habe ich vergessen zu erwähnen).
Gruß Werner
AW: VBA Drucklayout und UserForm
01.06.2018 16:29:22
michael
Hallo Werner
Habe in meiner Beispieltabelle 'Verteilung' "Drucken NOM_LS" zu "NOM_LS" gekürzt. (Die Anderen natürlich auch)
Hat danach sofort geklappt. Super!!!
Warum ist mir aber Schleierhaft. Die Anweisung: "If Right(ws.Name, 2) = "LS" Then" Bezieht sich doch auf die letzten 2 Buchstaben im Blattnamen und der ist doch Korrekt gewesen. Einen Bezug auf die Zellen B18:B34 erkenne ich nicht. Hhmmm, scheine da wohl etwas zu übersehen.
Wenn ich das jetzt in meine Originalmappe übertrage, habe ich natürlich nicht die Möglichkeit alles genauso zu Platzieren wie in der Beispielmappe. Dort ist natürlich die 'Tabelle' Verteilung. Reicht es dann die Zellbezüge wie "E16" und "E18:E34" in die neuen Zellbezüge zu ändern, oder muss ich auf mehr achten? Evtl. auf das was ich übersehe.
Viele Dank
Gruß Michael
Anzeige
AW: VBA Drucklayout und UserForm
01.06.2018 18:56:00
Werner
Hallo Michael,
Die Anweisung: "If Right(ws.Name, 2) = "LS" Then" Bezieht sich doch auf die letzten 2 Buchstaben im Blattnamen
Dieser Teil des Codes wird aber nur dann abgearbeitet, wenn der Haken bei "Alle LS Blätter" gesetzt ist. Da konnte ich über das LS im Blattnamen gehen, da du ja alle LS Blätter drucken willst.
Bei einzelnen Blättern bringt mir das ja nichts. Da muss ich über die konkreten einzelnen Blattnamen gehen. Wenn ich da wieder mit Left LS arbeiten würde, dann würden ja immer alle Blätter gedruckt.
Einen Bezug auf die Zellen B18:B34 erkenne ich nicht
Der Bezug wird über den offset im Code hergestellt. Der Code läuft ja über E18 bis E34 und prüft, ob dort ein "Ö" (Haken) vorhanden ist. Wenn ja, dann wird mit offset(0, -3) die Zelle B der gleichen Zeile angesprochen, dort der Blattname geholt und ins Array geschrieben.
Ausgangspunkt ist dabei die Zelle z.B. E18. Der erste Wert beim Offset (Versatz) in der Klammer ist der Wert für die Zeile 0=kein Versatz also gleiche Zeile. Der zweite Wert ist der Spaltenversatz. Negative Werte = Versatz nach links, positive Werte=Versatz nach rechts.
Für E18 bedeutet Offset(0, -3) also gleiche Zeile (18) drei Spalten nach links also B
Gruß Werner
Anzeige
AW: VBA Drucklayout und UserForm
02.06.2018 09:26:21
Michael
Hallo Werner
Wusste doch das ich da was übersehe. Aber mit deiner genauen Beschreibung, bekomme ich das bestimmt, selber neu angepasst.
Hast du noch irgendeine Idee zu meiner Frage weiter oben, ob man die einzelnen Druckaufträge, die in der Seitenvorschau auch einzeln bestätigt werden müssen, zu einem Druckauftrag zusammenfassen kann.
Und weil ich schon mal am Fragen bin: Kann man bei einer msgbox ja/nein Abfrage bei beiden Antworten eine Aktion hinterlegen außer Abbruch und Weitermachen? Stelle mir das so vor:
If MsgBox("Wirklich Löschen", Buttons:=vbYesNo)
= vbNo Then Range("S3").Select und Exit Sub
= vbYes Then Sub run
Habe schon jede Menge Beiträge hier und auf anderen Seiten gelesen aber keine befriedigende Antwort gefunden.
Viele Grüße
Michael
Anzeige
AW: VBA Drucklayout und UserForm
02.06.2018 10:21:59
Werner
Hallo Michael,
wieso einzeln bestätigen. Ich habe dir den Code doch kommentiert. Du brauchst doch nur im Code die Messageboxen raus zu schmeißen (die waren nur zum Testen für dich drin) und das .PrintPreview durch .PrintOut zu ersetzen.
Zu deiner Messagebox Frage:
Public Sub aaa()
If MsgBox("Sollen die Daten gelöscht werden?", vbYesNo, "Löschbestätigung") = vbYes Then
Call bbb
Else
Range("A1").Interior.Color = vbYellow
End If
End Sub
Public Sub bbb()
MsgBox "Hallo Michael"
End Sub
Gruß Werner
AW: VBA Drucklayout und UserForm
03.06.2018 23:42:33
Michael
Hallo Werner
Sorry das ich mich jetzt erst zurückmelde. Wir waren das WE zu einer Silberhochzeit eingeladen.
Vielen Dank für das MsgBox Beispiel. Manchmal erkennt man den Wald vor lauter Bäumen nicht. Noch schlimmer ist es wenn man gar keine Bäume kennt. Aber nun zum Thema.
Ich habe deinen "Drucker" Code in eine Kopie vom Original eingebunden und auch mein gemaltes Bild so wie es war mit übernommen, allerdings am Tabellenende. Die neuen Zellbezüge und Offset (jetzt 4, statt vorher 3 Spalten weiter links)habe ich auch geändert. Nur PrintPreview habe ich vorerst dringelassen, weil ich zu Hause nicht sinnlos Papier verschwenden wollte. Bei eienem ersten Test hat sich gezeigt das das ganz gut war. Das Programm wollte auch alle leeren Seiten mit ausdrucken.
Gibt es noch eine Einstellung die ich änder muß. Damit du siehst was ich geändert habe:
Option Explicit
Public Sub Drucken()
Dim loLetzte As Long, i As Long, k As Long, loAnzahl As Long
Dim ws As Worksheet, raZelle As Range, arrBlatt()
Dim strPrinterName As String, varAuswahl As Variant
strPrinterName = Application.ActivePrinter
If Range("K569") = "Ö" Then
varAuswahl = Application.Dialogs(xlDialogPrinterSetup).Show
If varAuswahl = "Falsch" Then Exit Sub
For Each ws In ThisWorkbook.Worksheets
If Right(ws.Name, 2) = "LS" Then
With ws
loLetzte = .Cells(.Rows.Count, 1).End(xlUp).Row
.ResetAllPageBreaks
loLetzte = .Cells(.Rows.Count, 1).End(xlUp).Row
.PageSetup.PrintArea = ""
.PageSetup.PrintArea = "A1:H" & loLetzte
For i = 48 To loLetzte Step 48
.HPageBreaks.Add Before:=.Cells(i + 1, 1)
Next i
.PrintPreview
End With
End If
Next
ElseIf WorksheetFunction.CountIf(Range("K571:K587"), "Ö") > 0 Then
varAuswahl = Application.Dialogs(xlDialogPrinterSetup).Show
If varAuswahl = "Falsch" Then Exit Sub
loAnzahl = WorksheetFunction.CountIf(Range("K571:K587"), "Ö")
ReDim Preserve arrBlatt(loAnzahl - 1)
For Each raZelle In Worksheets("Verteilung").Range("K571:K587")
If raZelle.Value = "Ö" Then
arrBlatt(k) = raZelle.Offset(, -4).Value
k = k + 1
End If
Next raZelle
For k = LBound(arrBlatt) To UBound(arrBlatt)
With Worksheets(arrBlatt(k))
loLetzte = .Cells(.Rows.Count, 1).End(xlUp).Row
.ResetAllPageBreaks
loLetzte = .Cells(.Rows.Count, 1).End(xlUp).Row
.PageSetup.PrintArea = ""
.PageSetup.PrintArea = "A1:H" & loLetzte
For i = 48 To loLetzte Step 48
.HPageBreaks.Add Before:=.Cells(i + 1, 1)
Next i
.PrintPreview
End With
Next k
Else
MsgBox "Es sollte schon mindestens ein Blatt" & vbLf & _
"zum Drucken ausgewählt werden."
End If
Application.ActivePrinter = strPrinterName
End Sub
Und im Tabellenblatt habe ich es folgendermaßen geändert:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address(0, 0) = "K569" Then
Cancel = True
Target = IIf(Target = "Ö", "", "Ö")
If Target = "Ö" Then Range("K571:K587").ClearContents
End If
If Not Intersect(Target, Range("K571:K587")) Is Nothing Then
Cancel = True
Target = IIf(Target = "Ö", "", "Ö")
If Target = "Ö" Then Range("K569").ClearContents
End If
If Target.Address(0, 0) = "K589" Then
Drucken
Range("K569:K587").ClearContents
Den Befehl Drucken habe ich auch einer Zelle zugewiesen statt einem CommandButton und ich habe  _
noch den Befehl ClearContens angefügt weil sonst nach dem Drucken die Häkchen dringeblieben wären.
Was mir an dem Code nicht so ganz gefällt, ist das ich keine Kontrolle mehr habe wenn ich  _
PrintPreview in Printout ändere. Könnte man den Code nicht dahingehend abändern das die ausgewählten Filialen (Alle oder einzeln) zu einen Sheets(Array() zusammengefasst werden und mit der Application STRG+P beendet wird. PrintPreview erfüllt zwar auch den Zweck, ist aber aufwendiger weil jede Filiale einzeln aufgerufen wird und man müsste somit 17x Drucken bestätigen.
Wieder mal viele Fragen. Danke für deine Geduld
Viele Grüße
Michael

Anzeige
AW: VBA Drucklayout und UserForm
04.06.2018 12:58:29
Werner
Hallo Michael,
was soll ich dazu sagen, ohne deine Datei zu kennen?
Anonymisier mal die Daten und lade die Datei hier hoch (3 oder 4 LS- Blätter reichen). Natürlich sollte das Blatt mit dem du den Druckvorgang steuerst dabei sein.
Aber bitte als normale .xlsx Datei ohne Makros.
Gruß Werner
AW: VBA Drucklayout und UserForm
04.06.2018 22:20:17
Michael
Hallo Werner
Hier der Link:
https://www.herber.de/bbs/user/121959.zip
Bitte lach nicht zu laut über meine dilletantischen und umständlichen Versuche, etwas auf die Füße zu stellen. Für verbesserungsvorschläge bin ich natürlich jederzeit offen.
Viele Grüße
Michael
AW: VBA Drucklayout und UserForm
05.06.2018 09:25:14
Werner
Hallo Michael,
mir stellt sich die Frage, wo die Daten aus den einzelnen LS-Blättern her kommen. Ist das ein Import aus einer anderen Datei/anderem Programm.
Tatsache ist, dass dort unterhalb deiner eigentlichen Daten bis in Zeile 493 (jede Spalte in der auch Daten erfasst sind) wohl irgendwelche versteckten Steuerzeichen oder ähnliches vorhanden sind (habe jetzt nicht genauer nachgeschaut).
Dadurch wird im Makro die falsche "letzte Zeile" ermittelt und somit auch der Druckbereich falsch gesetzt.
Geh mal in irendeinem LS-Blatt in irgendeiner Spalte in die letzte Zeile in der ein Wert eingetragen ist. Jetzt drück die Tasten STRG und Pfeil nach unten. Du landest in Zeile 493. Diese Zeile erkennt Excel als letzte gefüllte Zeile.
Ich habe jetzt die Ermittlung der letzten belegten Zeile auf die Find-Methode mit dem Parameter Wert (xlValue) umgestellt. Somit wird die tatsächlich auch mit einem Wert versehene Zelle in Spalte A ermittelt und der Druckbereich richtig gesetzt.
Die Druckvorschau wurde auch umgestellt.
Option Explicit
Public Sub Drucken()
Dim raLetzte As Range, i As Long, k As Long, loAnzahl As Long
Dim ws As Worksheet, raZelle As Range, arrBlatt()
Dim strPrinterName As String, varAuswahl As Variant
strPrinterName = Application.ActivePrinter
If Range("K569") = "Ö" Then
varAuswahl = Application.Dialogs(xlDialogPrinterSetup).Show
If varAuswahl = "Falsch" Then Exit Sub
For Each ws In ThisWorkbook.Worksheets
If Right(ws.Name, 2) = "LS" And ws.Name  "ÖLS" Then
With ws
loAnzahl = loAnzahl + 1
ReDim Preserve arrBlatt(loAnzahl - 1)
arrBlatt(k) = ws.Name
k = k + 1
Set raLetzte = .Columns(1).Find(What:="*", LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, _
MatchCase:=False, SearchFormat:=False)
If Not raLetzte Is Nothing Then
.ResetAllPageBreaks
.PageSetup.PrintArea = ""
.PageSetup.PrintArea = "A1:H" & raLetzte.Row
For i = 48 To raLetzte.Row Step 48
.HPageBreaks.Add Before:=.Cells(i + 1, 1)
Next i
End If
End With
End If
Next ws
Worksheets(arrBlatt).PrintPreview
ElseIf WorksheetFunction.CountIf(Range("K571:K587"), "Ö") > 0 Then
varAuswahl = Application.Dialogs(xlDialogPrinterSetup).Show
If varAuswahl = "Falsch" Then Exit Sub
loAnzahl = WorksheetFunction.CountIf(Range("K571:K587"), "Ö")
ReDim Preserve arrBlatt(loAnzahl - 1)
For Each raZelle In Worksheets("Verteilung").Range("K571:K587")
If raZelle.Value = "Ö" Then
arrBlatt(k) = raZelle.Offset(, -4).Value
k = k + 1
End If
Next raZelle
For k = LBound(arrBlatt) To UBound(arrBlatt)
With Worksheets(arrBlatt(k))
Set raLetzte = .Columns(1).Find(What:="*", LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, _
MatchCase:=False, SearchFormat:=False)
If Not raLetzte Is Nothing Then
.ResetAllPageBreaks
.PageSetup.PrintArea = ""
.PageSetup.PrintArea = "A1:H" & raLetzte.Row
For i = 48 To raLetzte.Row Step 48
.HPageBreaks.Add Before:=.Cells(i + 1, 1)
Next i
End If
End With
Next k
Worksheets(arrBlatt).PrintPreview
Else
MsgBox "Es sollte schon mindestens ein Blatt" & vbLf & _
"zum Drucken ausgewählt werden."
End If
Set raLetzte = Nothing
Application.ActivePrinter = strPrinterName
End Sub
Übrigens hast du in deiner Datei ein Blatt "ÖLS". Beim alten Makro wäre das Blatt bei Auswahl von "alle Blätter" auch mit ausgedruckt worden. Das sieht mir aber nicht so aus, als ob das auch mit ausgedruckt werden sollte. Im jetzigen Code habe ich das Blatt ausgeschlossen.
Gruß Werner
AW: VBA Drucklayout und UserForm
05.06.2018 21:43:57
Michael
Hallo Werner
Es gibt von jeder Filiale je 1 Seite "(NAME?)_LS" und nur "(NAME?)"
Das hängt mit meinem Unvermögen zusammen Code zu generieren. Ich habe 2 Zwischenschritte mit einfachen Formeln gemacht. Im ersten Schritt wird aus der "Verteilung" der Reiter "Liste2" erstellt. Ist im Endeffekt nur eine Kopie von "Verteilung" ohne die ganzen 'Schnörkel' usw.
Im zweiten Schritt werden dann aus "Liste2" mit WENN() und VERWEIS() Formeln die Rohdaten von Liste2 mit den Wareninformationen aus dem Reiter EXVOOR, für jede Filiale (nur NAME) zusammengesetzt. In diesen Reitern sind alle Daten drin, nur eben auch je Filiale, ca. 5000 Formeln
Mit Hilfe eines Makros 'Sub RE_LS_Anordnen()' wird dann aus den Rohlingen in den Filialreitern (NAME?) die (NAME_LS) Reiter erstellt, Rechnungskopf und Endsummen aus den Reitern "Köpfe" und "Summen" eingefügt, nach Warengruppen sortiert und leere Zeilen nach unten gesetzt.
Ab hier wusste ich dann gar nicht mehr weiter, und du kamst ins Spiel.
Wenn ich einen Weg wüsste wie ich nur aus den beiden Reitern, Verteilung und EXVOOR, und vielleicht einem zusätzlichen Reiter mit den Briefköpfen, gleich zu den LS Reitern kommen könnte. Wären 18x ca.5000 Formeln auf den nur(NAME) Reitern überflüssig.
Im Moment ist meine Mappe ca. 1,7MB groß.
Werde Morgen in der Firma deine Änderungen eingeben, ausprobieren und mich dann nochmals melden.
Vielen Dank und Grüße
Michael
AW: VBA Drucklayout und UserForm
06.06.2018 22:58:26
Michael
Hallo Werner
Der Fehler mit den Steuerzeichen wird wohl im "Sub RE_LS_Anordnen" zu finden sein. In dieser Sub wird zuerst auf den "LS" Seiten der passende Rechnungskopf eingefügt, dann die Ergebniszeilen "Summen" (Betrag und VK Wert).
Dann kommt wahrscheinlich der Teil mit den Steuerzeichen. Es werden auf den Zwischenblättern (z.B. NOM, ÖLS usw.) die Ergebnisse der dortigen Formeln kopiert und in die "LS" Seiten unter den Ergebniszeilen eingefügt. Nach dem einfügen werden die kopierten Daten nach einer Benutzerdefinierten Liste und Reihenfolge sortiert. Bei dieser Sortierung werden Zellen in denen keine Formelergebnisse waren, nach unten sortiert. In diesen Leerzeilen werden wohl die versteckten Steuerzeichen sein. Vielleicht hast du ja eine Idee wie es ginge diese Steuerzeichen in den Leerzellen zu verhindern. Hier der Sub für eine Filiale:
Sub RE_LS_Anordnen()
'
' RE_LS_Anordnen Makro
'
'
'NOM
Application.ScreenUpdating = False
Sheets("Köpfe").Select
Rows("4:5").Select
Selection.Copy
Sheets("NOM_LS").Select
Rows("1:1").Select
Selection.Insert Shift:=xlDown
Sheets("NOM_LS").Range("A1:A8").PasteSpecial Paste:=8
Sheets("Summen").Select
Range("A1:H8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("NOM_LS").Select
Range("A38").Select
ActiveSheet.Paste
Sheets("NOM").Select
Range("A1:H442").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("NOM_LS").Select
Range("A46").Select
ActiveSheet.Paste
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Sheets("NOM").Select
Range("H1:L442").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("NOM_LS").Select
Range("I46").Select
ActiveSheet.Paste
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("A46:M493").Select
Application.CutCopyMode = False
Application.DeleteCustomList ListNum:=16
Application.AddCustomList ListArray:=Array("E", "D", "B", "A", "C", "N", "J", """""" _
)
ActiveWorkbook.Worksheets("NOM_LS").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("NOM_LS").Sort.SortFields.Add Key:=Range("L46:L493" _
), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
"E,D,B,A,C,N,J,""""", DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("NOM_LS").Sort.SortFields.Add Key:=Range("M46:M493" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("NOM_LS").Sort
.SetRange Range("A46:M493")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Habe deinen abgeänderten "Drucker" Code installiert, läuft jetzt einwandfrei. Echt Super. Warum du aber die Ausnahme mit ÖLS geschrieben hast, ist mir unklar. Es gibt doch auch für alle anderen LS- Seiten, eine gleichnamige Seite nur ohne _LS hinten. Die anderen hat er auch nicht versucht auszudrucken.
Solltest du eine Idee haben wie ich das ganze ohne diese eigentlich überflüssigen Zwischenseiten hinbekommen könnte, wäre das sehr schön. Es muss ja nicht gleich der komplette Lösungsweg sein, aber wenn du mir die Schritte aufzeigen könntest, wie ich vorgehen kann, das wäre schon super als Ansatz.
Vielen Dank für deine großartige Hilfe
Michael

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige