Anzeige
Archiv - Navigation
1100to1104
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
Inhaltsverzeichnis

Listbox steuert Druck von Arbeitsblattbereichen

Listbox steuert Druck von Arbeitsblattbereichen
Arbeitsblattbereichen
Guten Abend zusammen
ich habe noch nie was mit Listboxen gebastelt und möchte folgendes Problem lösen:
In einem Blatt existiert eine Liste mit Lieferantendaten. Die bleiben immer gleich.
Weitere Blätter werden nach Lieferanten benannt - das ändert sich fallweise (Umbenennung zZt noch manuell - der Name wird in eine Hilfszelle geschrieben, die mir schon vielfach gute Dienste geleistet hat).
In den Lief-Blättern gibt es jeweils einen Infobereich, der den Lief zur Verfügung gestellt wird (damit sie sehen, wo sie stehen mit ihrem Angebot). Dieser Bereich soll gedruckt oder per Mail verteilt werden können (Druck für meinen Chef, Mail für die Lieferanten)
Ein anderes Blatt schließlich dient als Arbeitsfläche, dort sind Steuerelemente untergebracht. Klick auf Button soll eine UF hervorzaubern, die eine Multiauswahl-Listbox zeigt, eine weitere, in der die Auswahl zusammengefaßt wird, sowie zwei OptionBtn für die Wahl, ob die ausgewählten Lieferanten gedruckt oder gemailt werden sollen.
Daran soll sich wahlweise der Druck oder eine Serienmail anschließen, zu der die Adressen bei den Kundendaten stehen.
Da ich nun so überhaupt keine Ahnung vom Umgang mit Listboxen habe, fehlt mir dazu völlig der Ansatz, und ich wäre für eine Anschub-Lektion dankbar. Genaugenommen weiß ich nicht einmal, ob Listbox dazu das geeignete Instrument ist.
Vielleicht ist es am einfachsten, mal mit dem Druck zu beginnen. Ich vermute, daß es da einen Punkt gibt, bis zu dem die beiden Wege noch gleich sind, oder?
Beispiel ist hier: https://www.herber.de/bbs/user/64439.xls
Bitte Anregungen usw. auf Kindergarten-Niveau :-)
Viele Grüße - Jörg

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Listbox steuert Druck von Arbeitsblattbereichen
16.09.2009 16:06:00
Arbeitsblattbereichen
Hallo Jörg,
für das Drucken hab ich dir mal das UF und die Auswahlliste aufbereitet.
Für den e-Mail-Versand muss du dir erst einmal überlegen, wie du die Info verschicken willst.
- als Textbody, der aus den Informationen im Infobereich zusammengestelt wird,
- als PDF-Datei. dazu brauchst du dann einen PDF-Drucker der die Datei unter einem im Druckdialog als parameter vorgegebenem Namen speichert.
- als Exceldatei, die nur eintabellenblatt den Informationen enthält.
Die Konfiguration des e-Mailversands ist auch ein wenig vom verwendeten e-Mail-Programm abhängig. Da muss du hier mal im Archiv stöbern. Da findet sich bestimmt was.
Gruß
Franz
https://www.herber.de/bbs/user/64470.xls
Anzeige
PrintTitleColumns: Variable nicht definiert
16.09.2009 16:51:03
Jörg-HH
Hallo Franz
erstmal danke für deine Gedanken! Jetzt sehe ich zum ersten Mal den Zusammenhang zwischen dem Aussehen einer Listbox und den Eintragungen in den Eigenschaften. Ich finde, die VBA-Hilfe ist da nicht wirklich hilfreich.
Für Mailversand wäre wohl Excel mit einem Blatt/nur Werte+Formate am sinnvollsten. Ich hab schon gestöbert und bin auf das Problem "Mailprogramm" gestoßen, und dabei auf viele Hinweise im Archiv und dadurch auf die Seite von Ron de Bruin. Dort gibt es ja auch eine Version, die ganz ohne Mailprogramm auskommt (CDO oder so). - Ich muß gestehen, ich war von den vielen verschiedenen Varianten, eine Mail zu versenden, völlig überfordert :-(
Die zweite Spalte sollte ein voller Name sein (also 1.Sp Kürzel Meier, 2.Sp. Meier Gmh &Co...)
Die Listbox muß gar nicht 3-spaltig sein - man sortiert anhand des Kurznamens. Was statt dessen im Moment fehlt, ist die 2.Listbox, die die ausgewählten Namen hintereinander auflistet - nur zur Übersicht, damit mein Chef nicht den Faden verliert ;-)
Übrigens habe ich - sorry - noch was vergessen: Eine Spalte mit dem Status, dh. ob es sich um Kunde oder Lieferant handelt (es sind alle verfügbaren Adressen in einer Datenbank=Arbeitsblatt zusammengefaßt). Man müßte also in der UF vorher noch nach einem Statuskürzel sortieren.
Im Augenblick meldet mir VBA erstmal bei PrintTitleColumns: Variable nicht definiert. Wie muß ich denn die Deklaration schreiben?
Grüße - Jörg
Anzeige
PS....
16.09.2009 16:58:22
Jörg-HH
..hab grad die 2. listbox "entdeckt" :-) ... aber die is ja leer
AW: PrintTitleColumns: Variable nicht definiert
16.09.2009 18:29:33
fcs
Hallo Jörg,
hier das ganze schon mal ein wenig weiter entwickelt. Für den e-mail-Versand wird jeweils eine Datei erzeugt. Ansonsten solltest du dir erst einmal einen genauen Plan machen, wie die daten für das Userform bereitgestellt werden. Es ist meist einfacher diese vorher aufzubereiten (sortieren, unerwünschte Datensätze eliminieren, als dies beim Einlesen ins Userform zu machen.
Wie bei dir e-mail-Versand funktionieren kann weiß ich nicht. Ich hab mal beispielhaft die einfachste gewählt direkt aus Excel, hab aber keine Ahnung ob es so funktioniert.
Gruß
Franz
https://www.herber.de/bbs/user/64478.xls
Anzeige
sortieren vorab
17.09.2009 01:27:01
Jörg-HH
Hallo Franz
um das sortieren vorab zu erledigen, wie du vorgeschlagen hast, habe ich eine Combobox in die UF eingebaut, die drei Status-Informationen aufnehmen kann. Daran wollte ich dann die Sortierung der Datenbank hängen.
Ich bekomme die Meldung "benanntes Objekt nicht gefunden"
hab die Datei noch etwas umgebaut - jetzt ähnelt sie mehr der "großen Schwester": https://www.herber.de/bbs/user/64488.xls
Ich dachte mir das so schön: Ich klick erst die Combo, sehe dann in der Listbox, was von der Filterung übrig bleibt, und kann dann auswählen...
Grüße - Jörg
Anzeige
AW: sortieren vorab
17.09.2009 12:19:44
fcs
Hallo Jörg,
bei solchen Listboxen/Komboboxen, die einen Auszug der Daten darstellen sollen, kann man die Auswahlliste nicht mehr über einen Datenbereich zuweisen, es müssen dann die List-Items einzeln eingelesen und zur Liste addiert werden. Eine per Autofilter reduzierte Darstellung in einem Tabellenblatt ändert nichts an den in einer Listbox dargestellten Daten. Alternative: die Auswahldaten werden auf einem separaten Tabellenblatt entsprechend aufbereitet für das Userform zur verfügung gestellt.
Ich hab das Userform mal so aufbereitet, dass das UF sich die Daten jeweils aus dem Blatt Datenbank zusammensucht. Zusätzlich werden die Nummern gekennzeichnet, für deren Kürzel in der Datei ein Tabellenblatt angelegt ist. Wegen des geänderten Spaltenaufbaus in "Datenbank" mussten natürlich im Code auch die Spaltennummern an vielen Stellen angepasst werden.
Gruß
Franz
https://www.herber.de/bbs/user/64503.xls
Anzeige
...Spitze!
17.09.2009 17:28:14
Jörg-HH
Hallo Franz
bin begeistert. Und nach etwas brüten und nachschlagen hab ich sogar alles einigermaßen verstanden bei der Druckabwicklung (bei Mailversand hab ich alledings noch Verständnislücken, aber das kann warten).
Paar Fragen dazu:
Was ist Case 9 - hast du dir die Ziffer ausgedacht oder ist das ein allseits (außer für Anfänger) bekannter VBA-Begriff?
If .Cells(Zeile, 3) ... wenn ich irgendwann an der Datenbank mal was ändere und die Spalten liegen anders, läuft der Code nicht mehr richtig. Kann ich statt der 3 sowas ähnliches eingeben wie die xl-funktion Spalte(C:C)?
Das Status-Dropdown füttert sich jetzt etwas eleganter, wie ich sehe :-). Was muß ich denn schreiben, wenn außer den Status-Kürzeln noch die Auswahl "Alle" erscheinen soll?
Was ist der Vorteil der IIF-Funktion (soeben neu gelernt) gegenüber If Then ...?
Querformat hab ich hier hinzugesetzt. Klappt auch, allerdings bleibt das dann so. Weiter unten hab ich wieder Hochformat eingestellt, aber das ist offenbar der falsche Ort...?
With wks.PageSetup
'Druck-Einstellungen merken
strPrintTitleRows = .PrintTitleRows
strPrintTitleColumns = .PrintTitleColumns
strPrintArea = .PrintArea
'Druckbereich setzen für Infobereich
.PrintArea = strDruckbereich
.PrintTitleRows = ""
.PrintTitleColumns = ""
.Orientation = xlLandscape
End With
wks.PrintPreview 'Seitenvorschau
' wks.PrintOut 'Drucken
With wks.PageSetup
'Druck-Einstellungen zurücksetzen
.PrintArea = strPrintArea
.PrintTitleRows = strPrintTitleRows
.PrintTitleColumns = PrintTitleColumns
.Orientation = xlPortrait
End With
Ränder... - der Originalbereich paßt so grade eben auf A4 quer. Ich hab mal den Rekorder bemüht, aber der erschlägt mich mit Zahlen. Ich kann da nicht erkennen, was ich schreiben muß, um die Seitenränder kleiner zu machen...
Grüße - Jörg
Anzeige
AW: ...Spitze!
17.09.2009 18:52:02
fcs
Hallo Jörg,
Case 9
Dieser Wert bezieht sich auf die Variable, die hinter Select Case angegeben ist.
In diesem Fall auf Fehler-Nummer, die bei Fehlermeldungen im VBA-Ablauf von Excel generiert werden.
9 ist die Fehlernummer wenn Excel das vorgegebene Element in einer Liste nicht findne kann.
Alle Anzeigen in Liste:
Ergänze Alle in deiner Liste für Status und passe die folgende Prozedur in der If-Anweisung an:
Private Sub cboxStatus_Change()
Dim wks As Worksheet, Zeile As Long
'Listbox1 aktualisieren
Set wks = Worksheets("Datenbank")
Me.ListBox1.Clear
With wks
For Zeile = 2 To .Cells(1, 1).End(xlDown).Row
     If .Cells(Zeile, 3) = Me.cboxStatus Or Me.cboxStatus = "Alle" Then
         With Me.ListBox1
.AddItem IIf(chkSheet(wb:=ActiveWorkbook, strBlattName:=wks.Cells(Zeile, 2)) = True, _
"x", "") _
& wks.Cells(Zeile, 1).Value 'ggf. X wenn Blatt in Mappe vorhanden + Nr
.List(.ListCount - 1, 1) = wks.Cells(Zeile, 2) 'Kürzel
.List(.ListCount - 1, 2) = wks.Cells(Zeile, 3) 'Status
.List(.ListCount - 1, 3) = wks.Cells(Zeile, 4) 'Name
.List(.ListCount - 1, 4) = wks.Cells(Zeile, 5) 'e-Mail
End With
End If
Next
End With
End Sub

Ändern des Spaltenaufbaus in der Datenbank ist immer problematisch wen du auf die Daten zugreifts, wenn die Spaltentitel immer glechblaiben, dann könnte man die Spalten-Nummer an and des Titels ermitteln.
Seitenränder:
Dies sind die Wert TopMargin, LeftMargin, RightMargin, BottomMargin, FooterMargin und HeaderMargin.
Die Werte sind im aufgezeichneten Code in den Klammern in Inch angegeben
.TopMargin = Application.InchesToPoints(0.590551181102362)
mit Angaben in cm sieht es so aus für 1,5 cm:
.TopMargin = Application.InchesToPoints(1.5 / 2.54)
Beim Einrichten der Seiten immer erst das Format wechseln und danach die Randeinstellungen.
Für das Ändern der Seiteneinstellungen im Makro benötigt Excel halbe Ewigkeiten, da ja das gesamte Blatt immer neu berechent werden muss.
IIf-Funktion
Die IIf-Funktion wird zum berechnen von Werten verwendet, ähnlich wie die WENN-Funktion in Formeln.
If .. Else.. End If dient zur Programmierung von bedingten Abläufen in Prozeduren, wobei man die IIf-Funktion auch durch eine entsprechende If-Konstruktion ersetzen kann.
A = IIf(B=C,"X","Y")
entspricht
If B = C then
A="X"
Else
A="Y"
End If

Gruß
Franz
Anzeige
"alle"...
17.09.2009 20:46:57
Jörg-HH
Hallo Franz
ich hab in Spalte Status das Wort Alle unten in der Liste angehängt (hoffe, das meintest du mit "ergänzen" und den Code mit der geänderten Zeile versehen - aber im Status-Dropdown taucht das Wort Alle nicht auf.
Wo hab ich da was mißverstanden?
Gruß Jörg
Fielmann...
17.09.2009 23:55:34
Jörg-HH
Hallo Franz
konnte vorhin wohl nich richtich gucken - hab jetzt erst gesehen, welchen Bereich "Spalte" du meintest und wo der steht. War bei mir außerhalb des Fensters und namensgleich mit dem Feld in der Liste...
Hab da "Alle" reingeschrieben und Bereich angepaßt, und jetzt klappts auch...
Kann man auch diese Markierung x mit in das Dropdown aufnehmen (also: "zeige nur die Lief, die in Blattnamen auftauchen"? Wenn mein Chef aus 17 Blättern zB 8 Lief auswählen will und dazu 50-100 mögliche Lief durchblättern muß, ist das bissl mühsam...
Gute Nacht - Jörg
Anzeige
AW: Fielmann...
18.09.2009 10:32:34
fcs
Hallo Jörg,
wenn Daten auswertbar sind, dann geht in Excel vieles.
Ergänze x in der Auswahlliste für Status - hast ja jetzt Übung ;-) -
und passe die folgende Prozedur für das Aktualisieren der Listbox-Liste an.
Gruß
Franz
Private Sub cboxStatus_Change()
Dim wks As Worksheet, Zeile As Long, bolListe As Boolean
'Listbox1 aktualisieren
Set wks = Worksheets("Datenbank")
Me.ListBox1.Clear
With wks
For Zeile = 2 To .Cells(1, 1).End(xlDown).Row
Select Case Me.cboxStatus
Case "Alle", .Cells(Zeile, 3)
bolListe = True
Case "x"  'Listet die Kürzel, für die ein Blatt angelegt ist
bolListe = chkSheet(wb:=ActiveWorkbook, strBlattName:=wks.Cells(Zeile, 2))
Case Else
bolListe = False
End Select
If bolListe = True Then
With Me.ListBox1
.AddItem IIf(chkSheet(wb:=ActiveWorkbook, strBlattName:=wks.Cells(Zeile, 2)) _
= True, "x", "") & wks.Cells(Zeile, 1).Value 'ggf. X wenn Blatt in Mappe _
vorhanden + Nr
.List(.ListCount - 1, 1) = wks.Cells(Zeile, 2) 'Kürzel
.List(.ListCount - 1, 2) = wks.Cells(Zeile, 3) 'Status
.List(.ListCount - 1, 3) = wks.Cells(Zeile, 4) 'Name
.List(.ListCount - 1, 4) = wks.Cells(Zeile, 5) 'e-Mail
End With
End If
Next
End With
End Sub

Anzeige
Querformat
19.09.2009 15:19:58
Jörg-HH
Hallo Franz
das klappt alles, wie gewünscht. Das ist ja fast ein Privatkurs in VBA :-)) Das mit dem Senden stell ich mal ein paar Tage zurück, weil ich da noch zu wenig durchblicke. Werde jetzt erstmal den Code auf die "richtige" Datei anpassen.
Hab mal versucht, über die Hilfe mehr zu erfahren zu dem Themenbereich "Item", aber nicht so viel verstanden :-( vielleicht finde ich mal irgendwo einen Text, der mir mehr sagt.)
Eine Sache ist noch unklar:
Die Umstellung auf Querformat klappt auch, aber das zurückstellen nicht. Ich dachte, daß es nach deinem Kommentar "Druck-Einstellungen zurücksetzen" am besten aufgehoben sei, aber das ist offenbar nicht richtig. Es bleibt dauerhaft quer. Wo muß es denn statt dessen stehen?
 Private Sub Drucken()
Dim strDruckbereich As String, wks As Worksheet
Dim intI As Integer, strPrintTitleRows$, strPrintTitleColumns$, strPrintArea$
Dim PrintTitleColumns
On Error GoTo Fehler
strDruckbereich = "$B$4:$F$12" 'Informationsbereich in den Blättern
'Listbox auswerten
With Me.ListBox1
For intI = 0 To .ListCount - 1
'Prüfen ob Listbox-Item gewählt ist, dabei Kunden überspringen
If .Selected(intI) = True Then
'Worksheet-Name eines ausgewählten Lieferanten aus der 2. Spalte der Listbox auslesen
Set wks = Worksheets(.List(intI, 1))
With wks.PageSetup
'Druck-Einstellungen merken
strPrintTitleRows = .PrintTitleRows
strPrintTitleColumns = .PrintTitleColumns
strPrintArea = .PrintArea
'Druckbereich setzen für Infobereich
.PrintArea = strDruckbereich
.PrintTitleRows = ""
.PrintTitleColumns = ""
.Orientation = xlLandscape
End With
wks.PrintPreview 'Seitenvorschau
'        wks.PrintOut 'Drucken
With wks.PageSetup
'Druck-Einstellungen zurücksetzen
.PrintArea = strPrintArea
.PrintTitleRows = strPrintTitleRows
.PrintTitleColumns = PrintTitleColumns
.Orientation = xlPortrait
End With
End If
NextName:
Next
End With
MsgBox "Gewählte Blätter gedruckt"
Err.Clear
'Fehlerauswertung
Fehler:
With Err
If .Number  0 Then
Select Case .Number
Case 9 'Index-Fehler bei Objekt
MsgBox "Fehler-Nr. " & .Number & vbLf & .Description & vbLf & vbLf _
& "Blatt """ & Me.ListBox1.List(intI, 1) & """ nicht gefunden!"
Resume NextName
Case Else
MsgBox "Fehler-Nr. " & .Number & vbLf & .Description
End Select
End If
End With
End Sub

###########
Übrigens hab ich mal wegen einer anderen Sache, die mir durch unsere Korrespondenz aufgefallen ist, einen neuen Thread aufgemacht. Schau doch mal hier https://www.herber.de/forum/messages/1104087.html
Danke für deine Hilfe und schönes Wochenende
Jörg
Fielmann reicht nich...
19.09.2009 16:45:31
Jörg-HH
mannoo... ich bin so doof... midde Einstellungen is alles in Ordnung, und das Umschalten auf Hochformat steht auch an der richtigen Stelle. Aber wenn man die Datei in den Grundeinstellungen auf Querformat stellt, muß man sich eben nich wundern, daß man auch Querformat angezeicht kricht...
also - neue Brille allein bringst wohl nich...
tschüß, Franz ;-))
Jörg
Verständisfrage wg UCase
20.09.2009 11:15:53
Jörg-HH
Moin Franz
an einer Stelle hattest du geschrieben If UCase(objSheet.Name) = UCase(strBlattName) Then - ich hab mich schlau gemacht und gelesen: UCase macht Buchstaben groß. Warum ist das hier denn nötig? Ich dachte immer, VBA unterscheidet nicht groß und klein?
Schönen Sonnensonntag!
Jörg
AW: Verständisfrage wg UCase
20.09.2009 15:47:05
fcs
Hallo Jörg,
bei Text-Vergleichen unterscheidet Excel sehr wohl zwischen Groß- und Kleinschreibung. Teste einfach mal
  Sub aatest()
Dim A
A = "aa"
Check:
Select Case A
Case "aa"
MsgBox "Kleinschreibung  " & A
Case "AA"
MsgBox "Großschreibung  " & A
Exit Sub
Case Else
End Select
A = "AA"
GoTo Check
End Sub

Bei der Angabe von Objektnamen spielt die Schreibweise jedoch keine Rolle.
Worksheets("TabelleXYZ") und Worksheets("tabellexyz") sprechen das gleiche tabellenblatt an.
Gruß
Franz
"behelfsweise" dekl und noch Anmerkg
16.09.2009 17:15:55
Jörg-HH
Franz, ich hab grad mal einfach Dim PrintTitleColumns geschrieben, und dann gings (allerdings hab ich grad vor ein paar Tagen Schimpfe gekriegt, ich solle exakt deklarieren - und wenn ich richtig verstanden habe, ist so im Moment Dim PrintTitleColumns zu Variant geworden, oder?)
Also der Code lief, und dabei ist mir ein Denkfehler aufgefallen:
Die Listbox holt sich die Namen aus der Datenbank. Aber es sind nicht immer alle Lieferanten beteiligt. Von X Namen sind nur Y Lieferanten (die anderen Kunden, Partner oder sonstwas - schrieb ich in dem anderen Text ja). Und von den möglichen Lieferanten sind nur einige beteiligt.
Genaugenommen ist das also komplizierter: Beim Versenden von Ausschreibungen müssen alle in der DB erfaßten Lief in der Listbox angeboten werden. Bei der Versendung der Infoblätter, von denen wir hier ja sprechen, muß der Code erst schauen, wer von den Lief in den Arbeitsblättern auftaucht. Das hab ich heute Nacht, als ich den Post setzte, gar nicht so überblicken können :-((
Grüße Jörg

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige