Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1364to1368
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

Eingabenprüfung Inputbox

Eingabenprüfung Inputbox
23.06.2014 17:37:14
Christian
Hallo Forum,
mit nachstehendem Code werden Werte von einer Listbox an eine andere übergeben, mit Aufruf einer Inputbox für Mengeneingaben, das fkt. soweit.
Woran ich scheitere, ist folgendes:
Wenn eine Null eingeben wird oder ein Wert, der kleiner ist als der gefundene Wert, sollte man die Eingabe in der Inputbox wiederholen können.
Wie kann man das in den Code einbauen, ohne die ganze Sub abzubrechen?
Dim textletzteMenge As String, letztemenge As Double
For iRow = 0 To irowL
If Me.ListBox1.Selected(iRow) Then
ReDim Preserve arrN(0 To i, 0 To 6)
arrN(iRowU, 0) = Me.ListBox1.List(iRow, 0)
arrN(iRowU, 1) = Me.ListBox1.List(iRow, 1)
arrN(iRowU, 2) = Me.ListBox1.List(iRow, 2)
If Me.ListBox1.List(iRow, 0) = "POS" Or Me.ListBox1.List(iRow, 0) = "EPOS" Then
If IsNumeric(Application.Match(Me.ListBox1.List(iRow, 1), wksletzteAR.Columns(2), 0)) Then
textletzteMenge = "Menge in letzter AR: " & _
Format(Application.Index(wksletzteAR.Columns(4), Application.Match(Me.ListBox1.List(iRow,  _
1), wksletzteAR.Columns(2), 0)), "##,##0.000")
letztemenge = Application.Index(wksletzteAR.Columns(4), Application.Match(Me.ListBox1. _
List(iRow, 1), wksletzteAR.Columns(2), 0))
Else
textletzteMenge = "In letzter AR noch nicht vorhanden"
End If
Menge = InputBox("Menge eingeben für:" & vbLf _
& Me.ListBox1.List(iRow, 0) & vbLf _
& Me.ListBox1.List(iRow, 1) & vbLf _
& Me.ListBox1.List(iRow, 2) & vbLf _
& textletzteMenge & vbLf, "Eingabe Menge für Rechnung", Format(CDbl(Me.ListBox1. _
List(iRow, 3)), "##,##0.000"))
Select Case Menge
'Case 0: hier sollte eine Wiederholung der Eingabe stattfinden
'Case Menge =  _
letzte Menge
Case "": Menge = Me.ListBox1.List(iRow, 3)
Case Else: Menge = Menge
End Select
arrN(iRowU, 3) = String(11 - Len(Format(Menge, "##,##0.000")), " ") & Format(Menge, "##,## _
0.000")
Else
arrN(iRowU, 3) = Me.ListBox1.List(iRow, 3)
End If
arrN(iRowU, 4) = Me.ListBox1.List(iRow, 4)
arrN(iRowU, 5) = Me.ListBox1.List(iRow, 5)
If Me.ListBox1.List(iRow, 0) = "POS" Or Me.ListBox1.List(iRow, 0) = "EPOS" Then
arrN(iRowU, 6) = String(14 - Len(Format(VBA.Round(Menge * Me.ListBox1.List(iRow, 5), 2), " _
##,##0.00 €")), " ") & _
Format(VBA.Round(Menge * Me.ListBox1.List(iRow, 5), 2), "# _
#,##0.00 €")
End If
If Me.ListBox1.List(iRow, 0) = "HP" Or Me.ListBox1.List(iRow, 0) = "HPEPOS" Then
arrN(iRowU, 6) = Me.ListBox1.List(iRow, 5)
End If
If Me.ListBox1.List(iRow, 0) = "LOS" Or Me.ListBox1.List(iRow, 0) = "TI" Or Me.ListBox1. _
List(iRow, 0) = "UP" Then
arrN(iRowU, 6) = ""
End If
iRowU = iRowU + 1
End If
Next iRow
Für Anregungen und Hilfe bedanke ich mich im Voraus
MfG Christian

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Eingabenprüfung Inputbox
23.06.2014 18:22:04
Daniel
Hi
im Prinzip baut man das nach diesem Schema auf.
Bedenke auch, dass die Inputbox einen Abbrechenbutton hat und der Anwender dann ein entsprechendes Verhalten erwartet.
über die Funktion StrPtr(Variable) kannst du unterscheiden, ob x leer ist weil Abgebrochen wurde oder ob ohne Eingabe eines Wertes OK gedrückt wurde. (im Ersten Fall: beenden, im zweiten Fall: Eingabe wiederholen)
Sub test()
Dim x As String
Do
x = InputBox("xxx")
If x = "" And StrPtr(x) = 0 Then Exit Do ' Schleife verlassen bei Abbruch !
If x > Wert Then Exit Do 'Schleife verlassen wenn erfolgreich
Loop
If StrPtr(x) = 0 Then
MsgBox "Abbruch"
Else
MsgBox "Eingabe: " & x
End If
End Sub
Gruß Daniel

Anzeige
AW: Eingabenprüfung Inputbox
23.06.2014 21:25:06
Christian
Hallo Daniel,
Danke für Deine Antwort, habe mir damit den Code anpassen können!
MfG Christian

Eine PrinzipLösung könnte auch so aussehen, ...
23.06.2014 19:01:23
Luc:-?
…Christian:
Sub TestEingabe()
Const ipDefVal As Variant = 1
Static idv As Variant
Dim x As Variant
ne: If IsEmpty(idv) Then idv = ipDefVal
If IsNumeric(idv) Then
Do While x 
Gruß, Luc :-?

AW: Eine PrinzipLösung könnte auch so aussehen, ...
23.06.2014 21:40:40
Christian
Hallo Luc,
danke für Deine Antwort!
Bei meiner Levelangabe wird es Dich nicht überaschen wenn Fragen dazu auftauchen ;-)
1. idv: ich nehme an, das man da noch eine Zuweisung setzen muss? Me.ListBox1.List(iRow, 3)?
2. ipDefVal: welchen Wert muss diese Variable haben bzw. zugewiesen bekommen?
Durch die Hilfe zu Static und Const habe ich mich gelesen, nur hat mir dass nicht wirklich weitergeholfen..
Mein aktueller (laienhafter) Code:
Dim textletzteMenge As String, letztemenge As Double
For iRow = 0 To irowL
If Me.ListBox1.Selected(iRow) Then
ReDim Preserve arrN(0 To i, 0 To 6)
arrN(iRowU, 0) = Me.ListBox1.List(iRow, 0)
arrN(iRowU, 1) = Me.ListBox1.List(iRow, 1)
arrN(iRowU, 2) = Me.ListBox1.List(iRow, 2)
If Me.ListBox1.List(iRow, 0) = "POS" Or Me.ListBox1.List(iRow, 0) = "EPOS" Then
If IsNumeric(Application.Match(Me.ListBox1.List(iRow, 1), wksletzteAR.Columns(2), 0)) Then
textletzteMenge = "Menge in letzter AR: " & _
Format(Application.Index(wksletzteAR.Columns(4), Application.Match(Me.ListBox1.List(iRow,  _
1), _
wksletzteAR.Columns(2), 0)), "##,##0.000")
letztemenge = Application.Index(wksletzteAR.Columns(4), _
Application.Match(Me.ListBox1.List(iRow, 1), wksletzteAR.Columns(2), 0))
Else
textletzteMenge = "In letzter AR noch nicht vorhanden"
letztemenge = 0
End If
Do
Menge = InputBox("Menge eingeben für:" & vbLf _
& Me.ListBox1.List(iRow, 0) & vbLf _
& Me.ListBox1.List(iRow, 1) & vbLf _
& Me.ListBox1.List(iRow, 2) & vbLf _
& textletzteMenge & vbLf, "Eingabe Menge für Rechnung", _
Format(CDbl(Me.ListBox1.List(iRow, 3)), "##,##0.000"))
If Menge > 0 And letztemenge = 0 Then Exit Do
If Menge >= letztemenge And letztemenge  0 Then Exit Do
MsgBox "Menge größer 0 oder größer Menge letzte AR eingeben!"
Loop
Select Case Menge
Case "": Menge = Me.ListBox1.List(iRow, 3)
Case Else: Menge = Menge
End Select
arrN(iRowU, 3) = String(11 - Len(Format(Menge, "##,##0.000")), " ") & Format(Menge, "##,## _
0.000")
Else
arrN(iRowU, 3) = Me.ListBox1.List(iRow, 3)
End If
arrN(iRowU, 4) = Me.ListBox1.List(iRow, 4)
arrN(iRowU, 5) = Me.ListBox1.List(iRow, 5)
If Me.ListBox1.List(iRow, 0) = "POS" Or Me.ListBox1.List(iRow, 0) = "EPOS" Then
arrN(iRowU, 6) = String(14 - Len(Format(VBA.Round(Menge * Me.ListBox1.List(iRow, 5), 2), " _
##,##0.00 €")), " ") & _
Format(VBA.Round(Menge * Me.ListBox1.List(iRow, 5), 2), "# _
#,##0.00 €")
End If
If Me.ListBox1.List(iRow, 0) = "HP" Or Me.ListBox1.List(iRow, 0) = "HPEPOS" Then
arrN(iRowU, 6) = Me.ListBox1.List(iRow, 5)
End If
If Me.ListBox1.List(iRow, 0) = "LOS" Or Me.ListBox1.List(iRow, 0) = "TI" Or Me.ListBox1. _
List(iRow, 0) = "UP" Then
arrN(iRowU, 6) = ""
End If
iRowU = iRowU + 1
End If
Next iRow
Für Aufklärungen und Verbesserungen bin ich immer dankbar!
MfG Christian

Anzeige
Fangen wir mal hinten an, also deiner letzten ...
24.06.2014 00:52:56
Luc:-?
…Anmerkung, Christian:
Const kennzeichnet die Deklarierung einer Konstanten, also eines Wertes, der sich im gesamten PgmVerlauf nicht ändert (und auch nicht ändern darf, sonst wäre es ja keine Konstante).
Static kennzeichnet die Deklarierung einer Variablen, deren Wert sich im PgmVerlauf zwar ändern kann, die am PgmEnde aber nicht gelöscht wird und deshalb beim nächsten PgmAufruf von anfang an ihren zuletzt erhaltenen Wert hat.
Deshalb verwende ich bei InputBoxes gern ein Default-Wert-Paar aus dem InitialWert (hier quasi ipDefVal) für die DefaultAuswahl in der InputBox (3.Parameter beim Aufruf) und einer Static-Variablen (hier idv), die mit diesem Wert initialisiert wird, wenn sie leer ist. In der Folge wird dann diese Variable als DefaultWert-Parameter der InputBox verwendet. Das hat den Vorteil, dass nur beim 1.Aufruf der Box der eigentl DefaultWert angezeigt wird, bei weiteren Aufrufen dann der zuletzt verwendete Wert, was günstig ist, falls man diesen mehrfach verwenden muss. Braucht man das nicht, kann diese Variable und die mit ihr verbundene Regie entfallen und der eigentl DefaultWert kann stattdessen als 3.Parameter verwendet wdn.
Damit dürfte dann auch die 1.Frage beantwortet sein → idv übernimmt erst ipDefVal und in der Folge den jeweils akzeptierten EingabeWert in die InputBox, der dann auch beim nächsten Aufruf als DefaultWert zV steht.
Die AW auf die 2.Frage sollte nun auch klar sein; sie erhält den Wert, den du als den häufigst zu verwendenden Wert ansiehst. Da du aber wohl grundsätzlich eine TextBox-Eingabe als DefaultWert verwendest, brauchst du diese Konstante hier nicht und eigentl auch nicht die dazugehörige Static-Variable. Wolltest du so etwas trotzdem verwenden, dann wohl eher für die TextBox.
Diese PrinzipLösung ist ja auch für eine reine InputBox-Lösung gedacht, nicht für solche Mischformen (übrigens, warum machst du das so — relativ kompliziert?).
Gruß, Luc :-?

Anzeige
AW: Fangen wir mal hinten an, also deiner letzten ...
24.06.2014 01:26:48
Christian
Hallo Luc,
Danke Dir für Deine Erklärung, ich werde mich daran versuchen, den gezeigten Weg umzusetzen, wird aber ein Weilchen dauern.
Zu Deiner Frage warum ich es so kompliziert mache:
Erstens habe ich noch keine große Erfahrung mit dem Thema VBA, daher kommt diese evtl. unorthodoxe Vorgehensweise.
Zweitens:
Hintergrund des Beispiels ist folgender:
In der UF lade ich in die ListBox1 das Leistungsverzeichnis, in ListBox1 kann man dann per Mehrfachauswahl auswählen, welche Positionen in die Rechnung kommen sollen und mit welcher Menge, das wird dann in eine weitere ListBox übergeben, damit man eine Rechnungsvorschau hat, und wenn alles passt wird die zweite ListBox in das Tabellenblatt übergeben.
Ich dachte halt, dass es ein komfortabler Weg ist, über eine InputBox die Mengen der jeweiligen Rechnungspositionen einzugeben, ohne später in der Tabelle rumhopsen zu müssen.
Aber ich bin natürlich offen für andere Lösungswege, wenn sie entsprechend "Anwenderfreundlich" sind, d.h. so viele automatisierte Eingabemöglichkeiten wie möglich,
ohne in den Tabellenblättern rumsuchen zu müssen.
Ich hatte die letzte Zeit die Tabelle mit Formeln aufgebaut, dementsprechend groß ist sie dann geworden, jetzt bin ich am Umstellen auf VBA, und dass sollte dann auch dementsprechend komfortabel (und "idiotensicher") zu bedienen sein.
Dank der Hilfe hier im Forum, auch speziell von fcs, ist dass schon ganz gut vorangeschritten, aber wie gesagt, wenn es elegantere Lösungen für manche Sachen gibt, bin ich für jeden Vorschlag dankbar, auch Kritik hinsichtlich des Codeaufbaus nehme ich gerne an.
MfG Christian

Anzeige
Naja, war nur Neugier, aber du weißt ja sicher,...
24.06.2014 02:28:47
Luc:-?
…was du tust, Christian;
hört sich jedenfalls ziemlich umfangreich an. Idiotensicher ist immer gut, selbst, falls alle einigermaßen exceln können, aber nur schwer zu erreichen, denn die Idioten sind ganz im Ggsatz zu dieser Titulierung, sehr erfinderisch! ;-)
Alles weitere kommt mit der Erfahrung…
Viel Erfolg! Gruß, Luc :-?

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige