Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1748to1752
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 Ergebnis in best. Zelle wenn...

Listbox Ergebnis in best. Zelle wenn...
05.04.2020 19:55:23
Christoph
Hallo liebe User,
erstmal möchte ich sagen, dass eure Beiträge hier echt der Wahnsinn sind! So viel hilfreiches Wissen an einem Ort!
Da ich - abgesehen vom Makro-Recorder - relativ ungeübt mit VBA bin hab ich in den letzten Tagen mit Hilfe eures Forums und einiger Tutorials eine Listbox erstellt. Die Datei habe ich auch hochgeladen:
https://www.herber.de/bbs/user/136427.xlsm
Mein Ziel war folgendes: Der User sollte mit der Listbox aus verschiedenen Kostenarten die Summe der Kosten je nach Auswahl berechnen können.
Dazu klickt der User auf "Schaltfläche1" woraufhin sich die ListBox öffnet. Folgender Code schreibt die Auswahl in Tabelle1 (erste leere Zelle der Spalte Z):

Dim last As Integer
last = ActiveSheet.Cells(Rows.Count, 26).End(xlUp).Row + 1
Dim i As Integer
With UserForm1.ListBox1
For i = 0 To .ListCount - 1
If .Selected(i) Then
If Cells(last, 26).Value = "" Then
ActiveSheet.Cells(last, 26).Value = .List(i)
Else
ActiveSheet.Cells(last, 26).Value = ActiveSheet.Cells(last, 26).Value & "/" & . _
List(i)
End If
Else
End If
Next i
UserForm1.Hide
End With
Dabei habe ich leider zwei Dinge nicht beachtet:
1. wenn der User für "das erste Formular" (Tabelle2 A1:L22 nenne ich 1. Formular, und da Button bei "H7") noch mal etwas ändern möchte wird das erneute Ausführen der Listbox das Ergenis in "Z3" in Tabelle1 schreiben. Eigetlich sollte dies aber wieder in "Z2" geschrieben werden.
2. Wenn der User das 1. Formular - aus welchem Grund auch immer - nicht ausfüllt und direkt zum "2. Formular" (Tabelle2 A23:L44, bzw. Buton bei "H29" der noch nicht programmiert ist) übergeht wird das Ausführen der ListBox ein Ergebnis in Tabelle1 in "Z2" schreiben obwohl das Ergebnis in "Z3" geschrieben werden sollte.
Ich denke, dass die Ausgabe des Ergebnisses nicht in die "erste freie Zelle in Spalte Z (26)" - so wie aktuell - erfolgen darf. Es müsste so funktionieren, dass - je nachdem welchen Button ich anwähle ("Formular 1" Button in "H7" oder "Formular 2" Button in "H29", etc.) - das Ergebnis in die jeweilige Datenzeile in Tabelle1 geschrieben wird:
Button bei "H7" --> Ergebnis in Tabelle1 Z2
etc.
Ich befürchte, dass ich zu lange in eine falsche Richtung gegangen bin und mich komplett verlaufen habe. Über die Suche habe ich dutzende Beiträge durchforstet aber leider nichts gefunden was auf mein Problem passt.
Ich hoffe sehr, dass mir ein Profi weiterhelfen kann. Freue mich über jede Rückmeldung.
Danke und LG
Christoph

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Listbox Ergebnis in best. Zelle wenn...
06.04.2020 15:13:06
Matthias
Moin!
Ich habe mir mal deine Datei angeschaut. So ganz ist mir nicht klar, was du genau vorhast. Es sieht so aus, dass du in Tabelle 2 deinen Masken (25 an der Zahl) hast und die Tabelle 1 deine "Datenbank" dazu ist.
Warum brauchst du aber 25 Masken? Willst du die alle parallel betreiben? Wenn ja, dann gib _ jeder deiner Masken eine feste Zeile, in welcher er einträgt. Dies könntest du fest im COde fixieren (bei der Zeile mit last zuweisen). Ist aber aufwendig, weil du da 25 versch. Codes brauchst. Oder du lässt über die eingetragen Werte die Zeile suchen. Alternativ kannst du beim Click auf den Button, die entsprechende Zeile (kann man aus der Position des Buttons errechnen) So Bspw. kannst du so die Zelle unter der linken oberen Ecke des Shapes ermittlen.

Tabelle2.Shapes(1).TopLeftCell.Address
Im ersten Fall D9. Mit der split Funktion kannst du die 9 ermitteln. Wenn du dann plus 13 und die Summe durch 22 rechnest, hast du deine lfd. Nummer. Die Boxen sollten dabei aber immer gleich positioniert sein. Die Zahl kannst du dann auch in eine bestimmte Zelle schreiben (bspw. M1) und die UF holt sich dort die Zeile raus.
Falls du nicht mehrere Formulare parallel betreiben willst, wäre auch mein Vorschlag - nutze nur eine. Wenn du jetzt was änderst, musst du das in 25 Formularen machen. Du könntest bei einer Maske einen Button zum Laden der Daten, Ändern oder Anlegen erstellen. Beim Laden kannst du aus der Tabelle1 was auswählen (dargestellt bspw. in einer Listbox). Beim erstellen werden die Daten in dem Formular in die Tabelle 1 übertragen (ans Ende angehängt). Beim Ändern wird der geänderte Datensatz (alles oder nur geänderte Spalten) in der Tabelle1 aktualsisiert. Damit entfällt auch die Zeilenzuordnung, die dir grad Probleme macht, da du immer nur in einem Datensatz = Zeile bist.
Ansonsten noch ein Hinweis. Die lette Zeile liest nur WErte aus. Formeln werden nicht mitgezählt. Und zum Eintragen etc. musst du das Blatt nicht aktivieren. Du könntest da in Tabelle 2 bleiben.
VG
Anzeige
AW: Listbox Ergebnis in best. Zelle wenn...
06.04.2020 16:44:11
Christoph
Hi Matthias,
erstmal vielen Dank, dass du dir die Zeit genommen hast und meine Datei angesehen und mir geantwortet hast!
Zu deiner Frage:

Ich habe mir mal deine Datei angeschaut. So ganz ist mir nicht klar, was du genau vorhast. Es   _
_
sieht so aus, dass du in Tabelle 2 deinen Masken (25 an der Zahl) hast und die Tabelle 1 deine " _
Datenbank" dazu ist.
Warum brauchst du aber 25 Masken? Willst du die alle parallel betreiben?

Das hast du ganz genau richtig verstanden! Und ja, das würde ich gerne so belassen. Die Datei ist nur für die "End-User" bestimmt. Die sollen nur mehr die fertigen Masken sehen und bearbeiten können. Ob das eine Maske oder 25 sind kann sich täglich ändern. Die Tabelle1 (Datenbank) wird vorab von mir befüllt. Das Ganze sollte für den User so einfach und selbsterklärend wie möglich sein, da würde ich lieber vorab 25 Codes schreiben...
Leider kann ich deinen Lösungsvorschlägen nicht ganz folgen.
Wenn ja, dann gib _ jeder deiner Masken eine feste Zeile, in welcher er einträgt. Dies könntest du fest im COde fixieren (bei der Zeile mit last zuweisen).

Das wäre mein Ziel gewesen. Wenn ich bspw. in Maske 1 (A1:L22) den Button (aktuell ca. in Zelle "H7") betätige soll das Ergebnis der ListBox immer in Tabelle1 Zelle "Z2" eingetragen werden. Aus "Z2" kann ich dann in Tabelle2 Zelle "G7" die Nebenkosten einfach berechnen.
Genauso einen Button bräuchte ich dann für Maske 2 (A23:L44). Aktuell noch ohne Code in "H29". Das Ergebnis der ListBox sollte dann immer in Tabelle1 in Zelle "Z3" eingetragen werden.
Usw. für alle Masken, je nachdem wieviele ich dem User zur Verfügung gestellt habe.
Ich mache mir gerne die Arbeit 25 Buttons zu erstellen und 25 Codes anzupassen. Allerdings weiß ich nicht wie ich meinen ursprünglichen Code (der nach der ersten freien Zelle in Spalte Z sucht) umschreiben muss...
Die anderen beiden Ansätze verstehe ich leider nicht ganz:
Oder du lässt über die eingetragen Werte die Zeile suchen. Alternativ kannst du beim Click auf   _
_
den Button, die entsprechende Zeile (kann man aus der Position des Buttons errechnen) So Bspw.  _
kannst du so die Zelle unter der linken oberen Ecke des Shapes ermittlen.
Tabelle2.Shapes(1).TopLeftCell.Address
Im ersten Fall D9. Mit der split Funktion kannst du die 9 ermitteln. Wenn du dann plus 13 und die Summe durch 22 rechnest, hast du deine lfd. Nummer. Die Boxen sollten dabei aber immer gleich positioniert sein. Die Zahl kannst du dann auch in eine bestimmte Zelle schreiben (bspw. M1) und die UF holt sich dort die Zeile raus. 

Die Masken, Boxen, Buttons kann ich immer 1:1 gleich positionieren. Eine laufende Nummer habe ich schon in Spalte A (1, 23, etc.) integriert. Aber wie und wozu du die "D9" in meinem Beispiel ermittelst verstehe ich leider nicht ganz.
Ich verstehe aber, wenn dir das Ganze zu mühsam ist. Falls du aber noch einen Tipp bezüglich der oberen Variante hättest (eventuell eine Anleitung für den nötigen Code) wäre ich wirklich dankbar!
LG und schönen Tag noch
Anzeige
AW: Listbox Ergebnis in best. Zelle wenn...
06.04.2020 19:58:10
Matthias
Moin!
Du wegen der 25 Formulare habe ich da kein Problem. Wenn das so für euch besser ist, auch gut. Wollte es nur anmerken.
Also hier mal deine Datei zurück. Ich habe mal eine Variante reingemacht.
https://www.herber.de/bbs/user/136472.xlsm
Du musst deinen Schaltflächen nur das Makro "meineSChaltflächen" zuweisen. Und die Button immer an die selber Stelle packen (also die selbe Stelle innerhalb des Formulars). Ansonsten wird es nicht richtig berechnet. Damit brauchst du nicht 25 Makros machen. Alternativ (ist im Code als Kommentar angezeigt) kannst du dort auch 25 Codes erstellen und die alternative nutzen. Dort je nach Button bei der Stelle 'range("M1") = zeile für Zeile immer die Zeile für das Formular einsetzen. Geht aber auch an die Tag Eigenschaft der Userform.
In der Userform wird der Wert aus dem Tag ausgelesen (alternativ aus Zelle M1 , auch als Kommentar dabei) und dann verwendet. Kannst ja mal schauen, was dir besser passt.
VG
Anzeige
AW: Listbox Ergebnis in best. Zelle wenn...
06.04.2020 23:45:01
Christoph
Hi Matthias,
das funktioniert und er schreibt es immer in die richtige Zelle - klasse! Wäre ich nie drauf gekommen...
Bin mittlerweile aber doch am Verzweifeln... Es gibt ein letztes Problem:
Dim i As Integer
With UserForm1.ListBox1
For i = 0 To .ListCount - 1
If .Selected(i) Then
If Cells(last, 26).Value = "" Then
ActiveSheet.Cells(last, 26).Value = .List(i)
Else
ActiveSheet.Cells(last, 26).Value = ActiveSheet.Cells(last, 26).Value & "/" & . _
List(i)
End If
Else
End If
Next i
Dieser Code schreibt mir jetzt die Werte in die richtige Zelle. Beim erneuten Ausführen fügt er die "erneute" Auswahl an die "vorherige" Auswahl hinten durch "/" getrennt an. Das könnte ich jetzt unendlich fortsetzen. Das ist aber eigentlich Blödsinn. Wenn mein User den Button noch einmal klickt und über das Listfeld andere Kosten wählen möchte sollte er doch nicht die "erneute" Auswahl an die "vorherige" anfügen sondern diese einfach ersetzen und überschreiben.
Könntest du mir noch ein letztes Mal weiterhelfen und einen Tipp hierfür geben? Ich komme nicht auf die Lösung...
Ziel: erste Auswahl: Kostenart 1 + KA 2 + KA 3. --> Wird so in "Z2" geschrieben. User bermerkt Fehler und möchte stattdessen: KA 1 + KA 3 + KA 4 --> Soll die erste Auswahl überschreiben und so stehen bleiben (in dem konkreten Bsp. quasi KA 2 überschreiben und KA4 stattdessen hinzufügen).
Sorry für die Umstände. Das Erste, was ich nach diesem Thread machen werde ist, meinen VBA-Status auf "blutiger Anfänger" setzen und noch mal ganz zurück auf Start zu den Anänger-Tutorials gehen :D
Anzeige
AW: Listbox Ergebnis in best. Zelle wenn...
07.04.2020 14:27:41
Matthias
Moin!
Du, kein Problem - dafür gibt es ja das Forum.
Also das einfachste wäre wohl, wenn du die Zelle vorher löschst. Es wird ja immer nur die aktuelle Auswahl gespeichert, egal was vorher drin stand. So verstehe ich es zumindes. Deshalb hier mal der Code für den Button 5. Da wird am Anfang die Zelle geleert (ist also eine Zeile Code mehr - da ist ein Kommentar dahinter).
Private Sub CommandButton5_Click()
' das Worksheet aktiveren, in dem später die Werte eingefügt werden:
Worksheets("Tabelle1").Activate
' "Dim" wird zum Deklarieren einer Variable verwendet
' "As XY" legt den Datentyp fest (Integer ist Ganzzahl von -32000 bis +32000)
Dim last As Integer
' last Variable legt fest wo die erste freie Zeile ist und wo die Einträge eingetragen werden
last = Me.Tag 'ActiveSheet.Cells(Rows.Count, 26).End(xlUp).Row + 1
'alternativ
'last = tabelle2.range("M1").value
'Das Listfeld braucht einen speziellen Code bei Mehrfachnennungen
Dim i As Integer
With UserForm1.ListBox1
ActiveSheet.Cells(last, 26).Value = ""  'das ist neu
For i = 0 To .ListCount - 1
If .Selected(i) Then
If Cells(last, 26).Value = "" Then
ActiveSheet.Cells(last, 26).Value = .List(i)
Else
ActiveSheet.Cells(last, 26).Value = ActiveSheet.Cells(last, 26).Value & "/" & . _
List(i)
End If
Else
End If
Next i
UserForm1.Hide
End With
End Sub

VG
Anzeige
AW: Listbox Ergebnis in best. Zelle wenn...
07.04.2020 22:47:58
Christoph
Hi Matthias,
perfekt, funktioniert! Vielen Dank :-) Jetzt setze ich diesen Beitrag auch auf gelöst.
Falls es noch einfach zu lösen ist hätte ich noch eine allerletzte Frage:
Nur beim ersten Ausführen des Makros aktiviert der Code "Tabelle1". Das steht auch so im Code und hattest du auch in deiner ersten Antwort erwähnt, dass es nicht unbedingt nötig ist. Für die Handabung stört es mich jetzt aber auch aus Kosmetikgründen. Habe versucht das weg zu bekommen, natürlich nicht geschafft... Meine Ansätze:
Worksheets("Tabelle1").Activate rausgenommen und im Code "ActiveSheet" durch Worksheets("Tabelle1") ersetzt:
With UserForm1.ListBox1
ActiveSheet.Cells(last, 26).Value = ""
For i = 0 To .ListCount - 1
If .Selected(i) Then
If Cells(last, 26).Value = "" Then
ActiveSheet.Cells(last, 26).Value = .List(i)
Else
ActiveSheet.Cells(last, 26).Value = ActiveSheet.Cells(last, 26). _
Value & "/" & .List(i)
End If
Else
End If
Next i
Hat nicht geklappt. Wäre auch zu einfach gewesen...
Zweiter Versuch: Application.ScreenUpdating.False ...hat leider auch nicht funktioniert.
Andere Forum-Beiträge haben dann nicht mehr wirklich zu dem Problem, was wahrscheinlich kein großes ist, gepasst.
Was mich wundert ist, dass das Makro nur beim allerersten Aufruf die ListBox in Tabelle1 anzeigt. Sobald man das Makro ein 2./3./etc. Mal aufruft wird die ListBox perfekt am Formular in Tabelle2 angezeigt. Woran liegt das?
Hättest du vielleicht noch einen Tipp für mich wie ich auch den ersten Aufruf so hinbekomme, dass die ListBox nicht in Tabelle1, sondern bei den Formularen in Tabelle2, erscheint?
Vielen Dank im Voraus für deine Hilfe.
Anzeige
AW: Listbox Ergebnis in best. Zelle wenn...
08.04.2020 12:48:44
Matthias
Moin!
Also die Erklärung ist, dass du im Initialize der UF das Blatt nochmal öffnest. Das muss auch weg. Die Seite ist beim 2. , 3. usw. Versuch dann auf dem richtigen Blatt, weil das Initialize nicht nochmal aufgerufen wird. Du beendest die UF beim Eintragen nicht (das wäre unload) sondern du blendest sie nur aus (hide). Deshalb passt das dann. Ich habe mal die activate rausgenommen und vor jedes cells usw. das Tabellenblatt geschrieben. Dsa musst du auch bei der Zuweisung der RowSource machen (nur als Hinweis, ist geschehen). Du musst nur den Code bei der UF austauschen. DAs hier wäre der neue:
Private Sub CommandButton5_Click()
' das Worksheet aktiveren, in dem später die Werte eingefügt werden:
'Worksheets("Tabelle1").Activate
' "Dim" wird zum Deklarieren einer Variable verwendet
' "As XY" legt den Datentyp fest (Integer ist Ganzzahl von -32000 bis +32000)
Dim last As Integer
' last Variable legt fest wo die erste freie Zeile ist und wo die Einträge eingetragen werden
last = Me.Tag 'ActiveSheet.Cells(Rows.Count, 26).End(xlUp).Row + 1
'alternativ
'last = tabelle2.range("M1").value
'Das Listfeld braucht einen speziellen Code bei Mehrfachnennungen
Dim i As Integer
Worksheets("Tabelle1").Cells(last, 26).Value = ""
With UserForm1.ListBox1
For i = 0 To .ListCount - 1
If .Selected(i) Then
If Worksheets("Tabelle1").Cells(last, 26).Value = "" Then
Worksheets("Tabelle1").Cells(last, 26).Value = .List(i)
Else
Worksheets("Tabelle1").Cells(last, 26).Value = Worksheets("Tabelle1").Cells( _
last, 26).Value & "/" & .List(i)
End If
Else
End If
Next i
UserForm1.Hide
End With
End Sub
Private Sub CommandButton6_Click()
UserForm1.Hide
End Sub
Private Sub CommandButton7_Click()
For i = 0 To ListBox1.ListCount - 1
Me.ListBox1.Selected(i) = False
Next i
End Sub
Private Sub UserForm_Initialize()
' 1. Möglichkeit ListBox zu befülen
'With UserForm1.ListBox1
'    .AddItem "Komödie"
'    .AddItem "Fantasy"
'    .AddItem "Drama"
'    .AddItem "Action"
'End With
'2. Möglichkeit ListBox zu befüllen
'Worksheets("Tabelle1").Activate
UserForm1.ListBox1.RowSource = "Tabelle1!AE2:AE6"
'Style der ListBox ändern
ListBox1.ListStyle = fmListStyleOption
'Mehrere Elemente der ListBox auswählen:
ListBox1.MultiSelect = fmMultiSelectMulti
End Sub

VG
Anzeige
AW: Listbox Ergebnis in best. Zelle wenn...
08.04.2020 20:47:13
Christoph
Hi Matthias,
obwohl die Lösung "relativ logisch" war bin ich nicht drauf gekommen! Da fehlt mir anscheinend noch der Blick für's Große und Ganze.
Zum Glück hatte ich deine Hilfe! Noch mal vielen Dank, habe jetzt eine Freude mit dem Makro :-)
LG und alles Gute

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige