6.2k Aufrufe
Gefragt in Tabellenkalkulation von florian1010 Mitglied (754 Punkte)
Hallo zusammen,

ich würde wieder eure Hilfe benötigen.

In einem Excelsheet habe ich eine Userform mit vielen TextBoxen. Unter anderem möchte ich m², sprich Länge x Breite errechnen lassen. Für die korrekte Anzeige habe ich auch noch die Höhe mit eingebaut

Dabei habe ich mehrere TextBoxen zur Verfügung (Textbox 101 - 103 (jeweils immer LxBxH), Textbox 201 - 203 usw. bis Textbox 1301 - 1303)

Wie ist es möglich, die TextBoxen aus der UserForm zu multiplizeren und als Summe in einer Zelle (Spalte "K") der aktiven Zeile wiederzugeben? Dabei wäre es wichtig, dass beim aufrufen der Userform die einzelnen Zahlen in den Textboxen wieder zurück gegeben werden. Ist es hier nötig, für jede der TextBoxen eine eigene Zelle zu reservieren, oder würde eine Zelle reichen bzw. benötigt man überhaupt eine Zelle?

Es werden nicht in allen TextBoxen Werte (Zahlen) stehen.

Vielen Dank schon mal für eure Hilfe

VG Florian

26 Antworten

0 Punkte
Beantwortet von
Hallo Florian,

zum Code in Klasse 1
Ich würde dir nicht raten die zweite Zeile wegzulassen. Damit formatierst du die 2 Nachkommastellen direkt während der Eingabe. Bisher machst du diese Formatierung erst nach Klick auf Übernehmen, sodass die Werte in den Textboxen mehr Nachkommastellen haben können, als am Ende gespeichert wird. Das ist nicht nur irreführend sondern kann auch zur Dateninkosistenz führen, da die Summe der gespeicherten Werte nicht mehr die gespeicherte Gesamtsumme ergibt. Beim Neu-Öffnen werden die Daten dann auch nur mit 2 Nachkommastellen wieder eingeladen. Erst dann würde die Gesamtsumme neu berechnet.

Allerdings konnte ich die Code-Zeile zur Formatierung auf 2 Kommastellen während der Eingabe vorhin nicht testen. Damit sie funktioniert muss sie wie folgt lauten:
If Tons.Value Like "*,##*" Then Tons.Value = Application.RoundDown(CDbl(Tons.Value), 2)

Außerdem solltest du auch noch diese Zeile direkt danach einfügen. Damit verhinderst du, dass versehentlich ein zweites Komma eingegeben wird.
If Tons.Value Like "*,*," Then Tons.Value = Left(Tons.Value, Len(Tons.Value) - 1)

Die 3 Zeilen solltest du dann auch für die 3 Maßfelder im jeweiligen Change-Ereignis verwenden. Das Wort Tons ist dabei durch Länge, Breite oder Höhe zu ersetzen.

---------------------------------------------------------------------------

Ich vermute mal, du meinst das mit dem SVERWEIS so, dass aus dem Artikelstamm alle Zeilen gezogen werden sollen, die die gewählte Gerätenr. haben. Gib dazu im Formularcode von Userform3 diese Sub ein:
Private Sub TextBox5005_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Set firstCell = Sheets("Artikelstamm").Range("B:B").Find(TextBox5005.Value)
If firstCell Is Nothing Then Exit Sub
Artikel(1).Info1 = firstCell.Offset(0, 7).Value
LBH = Split(firstCell.Offset(0, 3).Value, " x ")
Artikel(1).Länge = LBH(0)
Artikel(1).Breite = LBH(1)
Artikel(1).Höhe = LBH(2)
Artikel(1).Tons = firstCell.Offset(0, 2).Value

Set NextCell = firstCell
For z = 2 To zeilen
Set NextCell = Sheets("Artikelstamm").Range("B:B").FindNext(NextCell)
If NextCell.Address = firstCell.Address Then Exit Sub
Artikel(z).Info1 = NextCell.Offset(0, 7).Value
LBH = Split(NextCell.Offset(0, 3).Value, " x ")
Artikel(z).Länge = LBH(0)
Artikel(z).Breite = LBH(1)
Artikel(z).Höhe = LBH(2)
Artikel(z).Tons = NextCell.Offset(0, 2).Value

Next z

End Sub
In den meisten Fällen dürfte jedoch nur eine Zeile gezogen werden, da fast alle Gerätenummern nur einmal vorhanden sind.

Mr. K.
0 Punkte
Beantwortet von florian1010 Mitglied (754 Punkte)
Hallo Mr. K.

PERFEKT.

Vielen Dank.

Bis zum nächsten mal.

VG Florian
0 Punkte
Beantwortet von florian1010 Mitglied (754 Punkte)
Hallo,

nach längerer Benutzung habe ich nun noch eine Frage zu diesem Chat. Wäre klasse, wenn mir hier noch jemand helfen könnte.

Wie müssen die Codes abgeändert werden, wenn ich noch zusätzliche Felder im "Sverweis" haben möchte (Anzahl und Verpackung).

Vielen Dank

Gruß Florian
0 Punkte
Beantwortet von
Hallo Florian,

die Anzahl kann berechnet werden. Die Verpackung gibt es in meiner Testdatei im Blatt Artikelstamm noch nicht. Angenommen du legst sie in Spalte L an dann lautet der angepasste Code

Private Sub TextBox5005_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Set firstCell = Sheets("Artikelstamm").Range("B:B").Find(TextBox5005.Value)
If firstCell Is Nothing Then Exit Sub
Artikel(1).Info1 = firstCell.Offset(0, 7).Value
LBH = Split(firstCell.Offset(0, 3).Value, " x ")
Artikel(1).Länge = LBH(0)
Artikel(1).Breite = LBH(1)
Artikel(1).Höhe = LBH(2)
Artikel(1).Tons = firstCell.Offset(0, 2).Value
ComboBox3.Value = firstCell.Offset(0, 10).Value

Set NextCell = firstCell
For z = 2 To zeilen
Set NextCell = Sheets("Artikelstamm").Range("B:B").FindNext(NextCell)
If NextCell.Address = firstCell.Address Then
TextBox5006.Value = z - 1
Exit Sub
End If

Artikel(z).Info1 = NextCell.Offset(0, 7).Value
LBH = Split(NextCell.Offset(0, 3).Value, " x ")
Artikel(z).Länge = LBH(0)
Artikel(z).Breite = LBH(1)
Artikel(z).Höhe = LBH(2)
Artikel(z).Tons = NextCell.Offset(0, 2).Value
Next z

End Sub

Beachte dabei aber, dass die Verpackung im Formularkopf steht. Es kann also nur die Verpackung der ersten gefundenen Zeile eingeladen werden.

Da ich davon ausgehe, dass du inzwischen weitere Anpassungen selbst vorgenommen hast, wäre es für weitergehende Hilfe nützlich, wenn du nochmal eine aktuelle Beispieldatei posten könntest.

Gruß Mr. K.
0 Punkte
Beantwortet von florian1010 Mitglied (754 Punkte)
Hallo Mr. K.

vielen Dank. Hat wieder einmal problemlos funktioniert.

Kannst du mir trotzdem noch kurz die Vorgehensweise bei diesem Code erklären? (u.a. zum einfügen einer TextBox würde es im "oberen" Codebereich dann heißen: TextBox5006.value = firstCell.Offset(0, 10).Value, wie müsste es dann allerdings im "unteren" Codebereich weitergehen? usw)

Gruß
Florian
0 Punkte
Beantwortet von
Hi Florian,

ich verstehe leider nicht was du genau wissen willst. Daher versuch ich's einfach mal:

Der obere Codebereich sucht nach dem ersten Treffer im Blatt Artikelstamm in Spalte B und zieht die Daten rechts davon (Offset = x Spalten nach rechts) in die erste Zeile, sowie ggf. in den Formularkopf.

Im unteren Teil wird geprüft ob es noch weitere Treffer gibt damit auch die anderen Zeilen gefüllt werden. Hier noch Felder im Formularkopf zu füllen macht keinen Sinn, da sonst die vorherigen Daten überschrieben werden. Es sei denn du machst das wieder als String (Textbox5006.value=Textbox5006.value & ", " &
NextCell.Offset(0, 7).Value).
Wie du diesen ausliest und speicherst, siehst du am Feld Info1.

Wenn alle Treffer durchlaufen wurden, ist der nächste Treffer wieder der Erste. Dann wird die Schleife beendet.
Ich habe mit der fettgedruckten Änderung erreicht, dass die Anzahl der Zeilen in Textbox 5006 berechnet ausgegeben werden. Wenn du die stattdessen aus Spalte L übernehmen willst, musst du das entweder im oberen Teil machen (dann wird aber nur der erste Treffer übernommen) oder du legst in deinem Formular eine neue Spalte Textboxen an, die du dann wie bei den anderen Spalten im Initalize-Ereignis mit dem Klassenmodul verknüpfst. Dann könntest du z.B. Artikel(z).Verpackung = NextCell.Offset(0, 11).Value im unteren Code-Teil hinzufügen. (oder du nutzt die oben beschriebene String-Variante)

Ich wollte dir in diesem Thread eigentlich nur zeigen, dass man sich mit ein wenig Ahnung und Erst-Aufwand, die weitere Bearbeitung durchaus vereinfachen und den Code übersichlicher gestalten kann. Solltest du jedoch bei derartigen Änderungen am Formular auf Probleme stoßen, kann ich nur nochmal nach einer aktualisierten Beispieldatei fragen um dir hier weiter helfen zu können, da ich sonst nicht weiß, wo du welche Felder mit welchem Namen angelegt hast.

L.G. Mr. K.
...