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 florian1010 Mitglied (754 Punkte)
Hallo Mr. K.

das sieht so richtig gut aus. Danke schön.

Ich habe bei den Maßen noch das Format ("0.00") dazugefügt und die die Schreibweise verändert (jeweils eine neue Zeile).

For ze = 1 To zeilen
If Artikel(ze).Info1 <> "" Then LBH = LBH & Format(CDbl(Artikel(ze).Länge.Text), "0.00") & " x " & Format(CDbl((Artikel(ze).Breite.Text)), "0.00") & " x " & Format(CDbl((Artikel(ze).Höhe.Text)), "0.00") & vbCrLf
If Artikel(ze).Info1 <> "" Then Tn = Tn & Artikel(ze).Tons & " / "


Allerdings zeigt es mir in der letzten beschriebenen Zeile der Maße bei der Höhe nur eine Nachkommastelle an. Die zweite verschluckt es. Mit der neue Zeile bei den Gewichten hat's leider überhaupt nicht funktioniert.


Zudem hab ich versucht, die Zelle J Farbig werden zu lassen, wenn die Breite >3,01 ist. Das hat aber leider nicht so funktioniert wie ich das haben möchte.

Ich hab das mit
CDbl((Artikel(ze).Breite.Text)>3.01 then rot=1

...

If rot=1 Then activeCell.interior.colorindex=19


versucht. Wie wäre dafür der richtige Code?

Vielen Dank schon mal im voraus. Du kannst dir nicht vorstellen, wie du mir hiermit hilfst.

VG Florian
0 Punkte
Beantwortet von
Hallo Florian,

schön, dass es dir gefällt. Was du mit Format(Cdbl()) bezweckst ist mir zwar räselhaft, da bereits die Eingabe ausschließlich Zahlen und das Kommazeichen erlaubt, aber nun gut. Format nutze ich zumeist nur dann, wenn ich einen Tausenderpunkt haben will.

Das letzte Zeichen bei Höhe wird deshalb abgeschnitten, da du die 3 Zeichen " / " (Leer, Schrägstrich, Leer) durch das Zeichen doppelter Länge vbcrlf ersetzt hast. In diesem Fall solltest du die erste Zeile nach Next ze durch Cells(z, 10) = Left(LBH, Len(LBH) - 2) ersetzen, also nur 2 statt 3 Zeichen am Ende des Strings abschneiden.
Ich verwende statt vbCrLf lieber das Zeichen Chr(10) auch bekannt unter dem Namen vbLf. Damit wird (zumindest in Excel) ebenfalls ein Zeilenumbruch erzeugt, ohne dass so ein häßlich langes Leerzeichen in der Formelleiste am Ende jeder Zeile auftaucht. Da dieses nur ein Zeichen einfacher Länge ist, reicht es wenn du am Ende des Strings nur 1 Zeichen Cells(z, 10) = Left(LBH, Len(LBH) - 1) abziehst.

Der String bei den Gewichten ist genauso aufgebaut wie der String für die Maße. Auch dort musst du " / " durch vbLf ersetzen und am Ende Left(Tn, Len(Tn) - 3) durch Left(Tn, Len(Tn) - 1) ersetzen.

Mit Colorindex weist du die Farbe zu, die in der aktuell ausgewählten Farbpalette an Position 19 steht. Das muss nicht immer Rot sein. (Bei mir ist das z.B. gelb.) Wenn du sicher gehen willst nimm lieber die Color-Eigenschaft ActiveCell.Interior.Color=255 Außerdem möchtest du nicht die aktive Zelle rot färben (welche sich aufgrund des Doppelklick wahrscheinlich in Spalte B befindet) sondern die Zelle Cells(z,10)

Letzlich stürzt das Programm deshalb ab, weil versucht wird eine der unteren Leeren Zellen in einen Double-Wert umzuwandeln. Hier kannst du nur mit einer verschachtelten If-Bedingung oder der Switch-Funktion ran um das auszuschließen.

Zusammenfassend hier nochmal der betreffende Codeblock im Ganzen:

For ze = 1 To zeilen
If Artikel(ze).Info1 <> "" Then LBH = LBH & Format(CDbl(Artikel(ze).Länge), "0.00") & " x " & Format(CDbl(Artikel(ze).Breite), "0.00") & " x " & Format(CDbl(Artikel(ze).Höhe), "0.00") & vbLf
If Artikel(ze).Info1 <> "" Then Tn = Tn & Artikel(ze).Tons & vbLf

If Artikel(ze).Breite.Text <> "" Then
If CDbl(Artikel(ze).Breite.Text) > 3.01 Then rot = 1
End If
Next ze

If rot = 1 Then Cells(z, 10).Interior.Color = 255

Cells(z, 10) = Left(LBH, Len(LBH) - 1)
Cells(z, 22) = Left(Tn, Len(Tn) - 1)

Unload Me


Viele Grüße
Mr. K.
0 Punkte
Beantwortet von
PS: Im übrigen solltest du dann auch im Initialize-Ereignis bei den Split-Funktionen die Zeichen " / " durch vbLf ersetzten, damit du die Werte auch wieder reinladen kannst.
z.B.
InputTons = Split(Cells(ActiveCell.Row, 22), vbLf)
InputLBH = Split(Cells(ActiveCell.Row, 10), vbLf)
InputBez = Split(Cells(ActiveCell.Row, 15), " / ")


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

beim Gewicht hat der Code scheinbar ein Problem, ich komme allerdings nicht drauf, wo und was genau er mäckert.

Private Sub Tons_Change()
'Berechnet das Gesamtgewicht in Tonnen

Dim Erg As Double

If Tons.Parent.Controls("TextBox5007").Value = "" Then Tons.Parent.Controls("TextBox5007").Value = 0

For z = 1 To 13
Erg = Erg + IIf(Tons.Parent.Controls("TextBox" & Trim(Str(7000 + z))).Value = "", 0, Tons.Parent.Controls("TextBox" & Trim(Str(7000 + z))).Value)
Next z



und zwar bei ... Erg = Erg + IIf(Tons.Parent.Controls("TextBox" & Trim(Str(7000 + z))).Value = "", 0, Tons.Parent.Controls("TextBox" & Trim(Str(7000 + z))).Value)

VG Florian
0 Punkte
Beantwortet von
Hallo Florian,

in meiner Datei, welche ich letzte Woche von dir gedownloaded habe, funktionierts. Hast du eventuell die TextBoxen des Gewichts inzwischen umbenannt? Bei mir heißen sie noch 7001 bis 7013.
Was wird denn genau als Fehlermeldung angezeigt?

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

beim testen ist es mir aufgefallen, dass wenn ich anstelle von z.B. 0,5 nur ,5 eingebe, mir ein Debug anzeigt. Lässt sich das ändern, dass es eine Eingabe auch ohne die 0 vor dem Komma nimmt?

Erg = Erg + IIf(Tons.Parent.Controls("TextBox" & Trim(Str(7000 + z))).Value = "", 0, Tons.Parent.Controls("TextBox" & Trim(Str(7000 + z))).Value)

VG Florian
0 Punkte
Beantwortet von florian1010 Mitglied (754 Punkte)
Nachtrag:

Ich habe Format "CDbl" verwendet, da ich bei den Maßen immer das Format 0,00 haben möchte - sprich zwei Nachkommastellen.

VG Florian
0 Punkte
Beantwortet von
Dazu solltest du in Klasse1 am Ende der Sub Tons_Change folgende Zeilen hinzufügen.

If Left(Tons.Value,1) = "," Then Tons.Value = "0,"
If Right(Tons.Value,1)<>"," Then Tons.Value = Format(CDbl(Tons.Value),"0.00")

Leider kann ich das jetzt gerade nicht prüfen. Wenn's nicht klappt melde ich mich heute Abend noch mal.

Mr. K.
0 Punkte
Beantwortet von
Sorry, nicht am Ende der Sub sondern am Anfang gleich nach Dim Erg As Double einfügen.
0 Punkte
Beantwortet von florian1010 Mitglied (754 Punkte)
Hallo Mr. K.

ich kann sogar das Format - sprich If Right.. weglassen. Dann funktioniert es einwandfrei.

Vielen Dank.

Neues Thema, das ich bisher noch nicht angegangen bin - Sverweis aus dieser UserForm3 zum Tabellenblatt "Artikelstamm" - Ausgangspunkt ist die TextBox5005 (Gerätenummer) kannst du mir hier auch weiterhelfen?

VG Florian
...