Hallo,
der Skaletti ist mal wieder im Forum.
Hallo Reinhard, falls du diesen Artikel liest, es ist immer noch die gleiche Sache.(Rechnen mit VBA).Was wir, bessergesagt, du, gemacht haben funzt und ist o.k. Der Anwender kam jetzt auf die Idee alles aus einem Eingabefenster (UserForm) zu machen. Habe zugesagt das zu versuchen.(Die Arbeit vorher war mal wieder umsonst). Aber was gelernt.
Also zum Thema:
Aus „aktiver Zeile“ fülle ich die TextBoxen, gebe die neuen Werte ein, rechne dann mit den TextBoxen per Buttonclick um noch mal kontrollieren zu können. funzt.
Jetzt müssen die ausgerechneten Daten in die gleichen Zellen zurück.
Da weiss ich im Moment nicht wie.
Wer weiss wie?
Anbei eine Testmappe. (Excel2000)
Achso ja, in den TextBoxen 1,2,3 sollen beim öffnen der Userform immer eine „0“ stehen. Möglich?
Gruß Skaletti!
http://www.hostarea.de/server-10/Oktober-63d41eb155.xls
Hallo Skaletti,
Aus „aktiver Zeile“ fülle ich die TextBoxen, gebe die neuen
Werte ein, rechne dann mit den TextBoxen per Buttonclick um
noch mal kontrollieren zu können. funzt.
nö, das klappt noch nicht. Bei Anwendern mußt du mit ALLEM rechnen )
Sobald die Uf erscheint und der Anwender klickt gleich auf Berechnen kommt ein Fehler.
Entweder Fehler abfangen oder über .enabled den Button erst dann anklickbar machen wenn ausreichend korrekte Daten eingegeben sind.
Was mir wenig Laune macht wenn ich es so sehe und dir auch nicht wenn du die mappe in drei Wochen wieder mal siehst, weil du grad aktiv mit der mappe beschäftigt bist weißt du was Textbox1 ist usw.
Glaub mir, in 3 Wochen weißt du das nicht mehr und brauchst da unnötige Extrazeit um dich wieder reinzuarbeiten.
Gewöhn dir bitte also gleich an, wenn du weißt du brauchst 10 Textboxen und 3 Buttons, ihnen gleich sprechende namen zu geben.
Also nicht Textbox4 sonder tbBreite, tbLager o.ä.
Die Label in der UF auch entsprechend abändern von Textbox3 in "Breite [cm] usw.
Die Namen der Buttons auch in cbBeenden usw.
Userform1 kannste noch lassen, hast ja nur eine.
Mach das mal bitte und lade die Mappe dann neu hoch.
Achja, Namensvergabe geht im Editor wenn du die UF siehst und dann F4 klickst, dann die einzelnen Steuerelemente anklicken, Namen vergeben usw.
Was genau willst du mit dem Code in Worksheet_SelectionChange erreichen?
Was soll
Rows(Target.Row).Select
Target.Activate
?
Ich sah noch keinen Sinn warum da die ganze Zeile selektiert wird.
Und, wenn du in eine Zelle wechselst ist diese sowieso acttivated, wozu das Target.Activate?
Ähem, wegen deiner Anfrage habe ich noch gar nicht geschaut, ich warte ab bis die verbesserte mappe kommt.
Gruß
Reinhard
Hallo Reinhard,
http://rapidshare.com/files/295139867/Testmappe.xls
Hostarea funzt im Moment nicht. Ich hoffe geht auch so.
Hab ich noch nie Versucht.
Sobald die Uf erscheint und der Anwender klickt gleich auf
Berechnen kommt ein Fehler.
Entweder Fehler abfangen oder über .enabled den Button erst
dann anklickbar machen wenn ausreichend korrekte Daten
eingegeben sind.
Eigenschaft enabled auf False und dann?
Was mir wenig Laune macht wenn ich es so sehe und dir auch
nicht wenn du die mappe in drei Wochen wieder mal siehst, weil
du grad aktiv mit der mappe beschäftigt bist weißt du was
Textbox1 ist usw.Glaub mir, in 3 Wochen weißt du das nicht mehr und brauchst da
unnötige Extrazeit um dich wieder reinzuarbeiten.Gewöhn dir bitte also gleich an, wenn du weißt du brauchst 10
Textboxen und 3 Buttons, ihnen gleich sprechende namen zu
geben.
Ist gemacht,ich dachte als Testmappe wäre das für dich so übersichtlicher.
Ohne TextBox1 u.s.w. =
For i = 6 To 9 funzt jetzt aber nicht mehr, da die Boxen Namen haben,
keine Zahlen. Reihenfolge der Zellen mit der die Boxen gefüllt werden
müssen:
tbWareneingangAktuell = Spalte H
tbAusgangAktuell = Spalte G
tbZurückAktuell = Spalte I
tbLagerAktuell = Spalte F
Die Daten müssen dann in die gleichen Zellen zurück:
tbWareneingangSumme = Spalte H
tbAusgangSumme = Spalte G
tbZurückSumme = Spalte I
tbLagerSumme = Spalte F
Was genau willst du mit dem Code in Worksheet_SelectionChange
erreichen?
Was soll
Rows(Target.Row).Select
Target.Activate
Aus der aktiven Zeile werden die Textboxen gefüllt, so ist es
egal wo man in der Zeile clickt, wird dann markiert. Sonst muss man
die Zeilennummer clicken.
Habe ich aber gelöscht.
Vielen Dank.
Gruß Skaletti!
Hallo Reinhard,
Korrektur:
tbZurückEingabe wird nicht gebraucht, ist gelöscht.
Command Button waren noch nicht benannt. Jetzt o.k.
Gruß Ulli!
http://www.hostarea.de/server-10/Oktober-a40d692a4a.xls
Hallo Ulli.
Es folgt nun Code für Tabelle1. Es ist nur ein Vorschlag, aber der Code hat gewisse Vorteile.
Private Sub CommandButton1\_Click()
'Lokale Variablen
Dim Form As New frmEingabe
'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
On Error GoTo ErrHandler
Load Form
Form.Show
Ende:
Set Form = Nothing
Exit Sub
ErrHandler:
MsgBox "Fehler beim Laden des Eingabe-Dialoges", vbCritical
Resume Ende
End Sub
VG
Carsten
Hallo Ulli.
Es folgt nun Code für frmEingabe. Auch dies ist nur ein Vorschlag. Es macht aber das „Activate“-Ereignis überflüssig und die Prozedur „Zellen_Zuordenen“ kann dann gelöscht werden.
Private Sub UserForm\_Initialize()
tbWareneingangAktuell.Text = Tabelle1.Cells(Selection.Row, 8)
tbAusgangAktuell.Text = Tabelle1.Cells(Selection.Row, 7)
tbLagerAktuell.Text = Tabelle1.Cells(Selection.Row, 6)
End Sub
Bei der Übertragung auf’s Tabellenblatt kannst Du die Zuweisungen umgekehrt schreiben, wobei Du auf den Datentypen achten musst. Wenn ich mich recht erinnere, dann wird eine Zahl vom Typ Double im Tabellenblatt auch als Double gespeichert und in der Bearbeitungsleiste mit den vielen Dezimalstellen angezeigt.
Kleiner Tip noch: Wenn Du den Steuerelementen Namen gibst, solltest Du Umlaute vermeiden.
VG
Carsten
Hallo Carsten,
vielen Dank für deine Hilfe.
Es funzt alle prima, bestens.
Vielleicht noch eine Kleinigkeit:
Wenn ich den Button „Rechnen“ betätige muss in den beiden Textboxen
tbWareneingangEingabe + tbAusgangEingabe ein Wert stehen, sonst
Laufzeitfehler!! Passiert dem Anwender garantiert.
Kann man den Button solange sperren bis in beiden Boxen ein Wert steht?
Vielleicht „Eigenschaft Enabled auf False“ stellen und dann wieder
freigeben? Aber wie?
Vielleicht weiss du eine Lösung.
Nochmals vielen Dank, auch an Reinhard.
Gruß Skaletti!
Hallo Skaletti,
nur mal so als Anregung und ohne das ich den ganzen Thread gelesen habe.
Beim laden der Form setzt den Button. Beim Ändern eines Textes der Textbox setzt du den Button. Unter VB würde das wie folgt auschauen.
Private Sub Form\_Load()
btnRechne.Enabled = CBool(Len(txtWarenEingang) \> 0 And Len(txtWarenausgang) \> 0)
End Sub
Private Sub txtWarenausgang\_Change()
btnRechne.Enabled = CBool(Len(txtWarenEingang) \> 0 And Len(txtWarenausgang) \> 0)
End Sub
Private Sub txtWarenEingang\_Change()
btnRechne.Enabled = CBool(Len(txtWarenEingang) \> 0 And Len(txtWarenausgang) \> 0)
End Sub
Wie du siehst einfach die Ereignisse zu nutzen machen
By the Way … Der Fall das die beiden Textfelder leer sind oder nur eines davon kann so oft auftreten. Deswegen immer auf Sicherheit basteln
MfG Alex
Hallo Skaletti,
nochmals ganz kurz
Irgendwo hatte ich hier mal was zur Namensgebung gelesen. Beim programmieren sollte man sich an die ungarische Notation halten. Ok, ist nicht vorgeschrieben, sondern nur ein Rat. Somit hast du in einen 1/2 Jahr immernoch den Durchblick
Wie die Notation ausschaut, sishst du hier .
http://www.it-academy.cc/article/995/Ungarische+Nota…
MfG Alex
Hallo Alex,
vielen Dank für deine schnelle Antwort.
Sobald ich in eine der beiden Boxen eine Zahl eingeben möchte
kommt der Laufzeitfehler „Objekt erforderlich“.
Hier die „Change Ereignisse“ der beiden Boxen. Ich bin noch ein
„Greenhorn“ was VBA angeht.
Gruß Skaletti!
'Dieser Code auch in das Modul der USerForm?
Private Sub Form\_Load()
btnRechne.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And Len(tbAusgangEingabe) \> 0)
End Sub
Private Sub tbWareneingangEingabe\_Change()
btnRechne.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And Len(tbAusgangEingabe) \> 0)
If IsNumeric(tbWareneingangEingabe) = False Then
MsgBox "Bitte nur Zahlen eingeben"
tbWareneingangEingabe.Value = ""
End If
End Sub
Private Sub tbAusgangEingabe\_Change()
btnRechne.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And Len(tbAusgangEingabe) \> 0)
If IsNumeric(tbAusgangEingabe) = False Then
MsgBox "Bitte nur Zahlen eingeben"
tbAusgangEingabe.Value = ""
End If
Hallo Skaletti,
in kenne dein „Program“ nicht.
Mein geposteter Source ist nur ein Demo.
Du musst diesen Source anpassen!
Private Sub Form\_Load()
btnRechne.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And
Len(tbAusgangEingabe) \> 0)
End Sub
Private Sub tbWareneingangEingabe\_Change()
btnRechne.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And
Len(tbAusgangEingabe) \> 0)
If IsNumeric(tbWareneingangEingabe) = False Then
MsgBox "Bitte nur Zahlen eingeben"
tbWareneingangEingabe.Value = ""
End If
End Sub
Private Sub tbAusgangEingabe\_Change()
btnRechne.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And
Len(tbAusgangEingabe) \> 0)
If IsNumeric(tbAusgangEingabe) = False Then
MsgBox "Bitte nur Zahlen eingeben"
tbAusgangEingabe.Value = ""
End If
Naja das schaut doch schon gut aus
Also du lädst ja eine Userform oder? Wie nennt sich das Ereignis welches beim Laden der Userform ausgeführt wird? In dieses Ereignis schreibst du dann
btnRechne.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And Len(tbAusgangEingabe) \> 0)
Das Form_Load Ereignis sollte das machen. Ist aber unter VBA scheinbar etwas anders. ODer besser gesagt schimpft sich anders.
Nun musst du das von mir genannte Object btnRechne, was bei dir sicher anders heisst umbenennen! Ein Object vom Typ btnRechne gibt es bei dir nicht.
Sprich wenn sich dein Button bRechne schimpft so musst du alle btnRechne duch bRechne ersetzen!
Danach sollte es laufen
MfG Alex
Form_Load in Vba
Das Form_Load Ereignis sollte das machen. Ist aber unter VBA
scheinbar etwas anders. ODer besser gesagt schimpft sich
anders.
Hallo Alex,
ja, es nennt sich:
Private Sub UserForm_Initialize()
Gruß
Reinhard
Hallo Alex,
hat etwas länger gedauert, war unterwegs.
Ich zeige dir nochmal den Code wie er jetzt aussieht.
Nach deiner Beschreibung müsste es so funzen. Aber,
Laufzeitfehler im Code wo die TextBoxen Rechnen.
Danke für deine Hilfe
Gruß Skaletti!
Private Sub cmdRechnen\_Click()
Call TextBoxen\_rechnen
cmdRechnen.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And Len(tbAusgangEingabe) \> 0)
End Sub
Private Sub tbWareneingangEingabe\_Change()
cmdRechnen.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And Len(tbAusgangEingabe) \> 0)
If IsNumeric(tbWareneingangEingabe) = False Then
MsgBox "Bitte nur Zahlen eingeben"
tbWareneingangEingabe.Value = ""
End If
End Sub
Private Sub tbAusgangEingabe\_Change()
cmdRechnen.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And Len(tbAusgangEingabe) \> 0)
If IsNumeric(tbAusgangEingabe) = False Then
MsgBox "Bitte nur Zahlen eingeben"
tbAusgangEingabe.Value = ""
End If
End Sub
'hier der Code wo gerechnet wird
Private Sub TextBoxen\_rechnen()
If IsNumeric(tbWareneingangAktuell.Text) Then
tbWareneingangSumme.Text = CDbl(tbWareneingangEingabe.Text) + CDbl(tbWareneingangAktuell.Text)'diese Zeile gelb 'Laufzeifehler 'Typen unverträglich
End If
If IsNumeric(tbAusgangAktuell.Text) Then
tbAusgangSumme.Text = CDbl(tbAusgangEingabe.Text) + CDbl(tbAusgangAktuell.Text)
End If
If IsNumeric(tbZurückAktuell.Text) Then
tbZurückSumme.Text = CDbl(tbZurückAktuell.Text)
End If
If IsNumeric(tbWareneingangSumme.Text) Then
tbLagerSumme.Text = CDbl(tbWareneingangSumme.Text) - CDbl(tbAusgangSumme.Text) + CDbl(tbZurückSumme.Text)
End If
End Sub
hallo Skaletti,
Laufzeitfehler im Code wo die TextBoxen Rechnen.
gib bitte genauer die Fehlermeldung an und auch die Codezeile wo er auftritt.
Laufzeitfehler könnte 1004 sein, der besagt m.E. aber nur daß Vba etwas machen soll was es grad nicht kann. Gibst viele Ursachen.
Benutze Debug.Print oder MsgBox an/vor den kritischen Stellen und schaue bzw. teile uns mit was in dem Moment wo der Fehler entsteht in den Textboxen drinsteht.
Gruß
Reinhard
Hallo Reinhard,
mmmm, es funktioniert jetzt
Datei gespeichert, geschlossen und wieder geöffnet.
Warum kann ich im Moment nicht sagen. Vielleicht tritt der Fehler
mal wieder auf, dann melde ich mich mit den von dir gewollten Infos.
In welcher Codezeile hatte ich aber angegeben.
(Kommentar hinter der Zeile)
Mach ich nächste mal deutlicher.
Sonst erstmal vielen Dank an Dich, Alex und Carsten.
Sehr gute Hilfe. Gutes Forum.
Gruß Skaletti!
Hallo Skaletti,
mmmm, es funktioniert jetzt
Datei gespeichert, geschlossen und wieder geöffnet.
Warum kann ich im Moment nicht sagen. Vielleicht tritt der
Fehler
mal wieder auf, dann melde ich mich mit den von dir gewollten
Infos.
das ist zwar kein Beweis aber ein Indiz daß es daran liegen könnte daß im Fehlerfall etwas Falsches in der TextBox steht.
In welcher Codezeile hatte ich aber angegeben.
(Kommentar hinter der Zeile)
Ja, hast du, aber ich habe nicht ellenlang nach rechts gescrollt
Sonst erstmal vielen Dank an Dich, Alex und Carsten.
Danke
Gruß
Reinhard
Hallo Reinhard,
Mist, wie zu erwarten ist der Laufzeitfehler wieder da.
Laufzeitfehler ‚13‘ Typen unverträglich.
'Diese Zeile in der Prozedur TextBoxen_Rechnen Gelb
tbWareneingangSumme.Text = CDbl(tbWareneingangEingabe.Text) + CDbl(tbWareneingangAktuell.Text)
Gruß Skalett!
Private Sub cmdRechnen\_Click()
Call TextBoxen\_rechnen
cmdRechnen.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And Len(tbAusgangEingabe) \> 0 And Len(tbZurückAktuell) \> 0)
cmdÜbertragen.Locked = False
End Sub
Private Sub tbWareneingangEingabe\_Change()
cmdRechnen.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And Len(tbAusgangEingabe) \> 0 And Len(tbZurückAktuell) \> 0)
If IsNumeric(tbWareneingangEingabe) = False Then
MsgBox "Bitte nur Zahlen eingeben"
tbWareneingangEingabe.Value = ""
End If
End Sub
Private Sub tbAusgangEingabe\_Change()
cmdRechnen.Enabled = CBool(Len(tbWareneingangEingabe) \> 0 And Len(tbAusgangEingabe) \> 0 And Len(tbZurückAktuell) \> 0)
If IsNumeric(tbAusgangEingabe) = False Then
MsgBox "Bitte nur Zahlen eingeben"
tbAusgangEingabe.Value = ""
End If
End Sub
Private Sub TextBoxen\_rechnen()
If IsNumeric(tbWareneingangAktuell.Text) Then
tbWareneingangSumme.Text = CDbl(tbWareneingangEingabe.Text) + CDbl(tbWareneingangAktuell.Text)
End If
If IsNumeric(tbAusgangAktuell.Text) Then
tbAusgangSumme.Text = CDbl(tbAusgangAktuell.Text) + CDbl(tbAusgangEingabe.Text)
End If
If IsNumeric(tbZurückAktuell.Text) Then
tbZurückSumme.Text = CDbl(tbZurückAktuell.Text)
End If
If IsNumeric(tbWareneingangSumme.Text) Then
tbLagerSumme.Text = CDbl(tbWareneingangSumme.Text) - CDbl(tbAusgangSumme.Text) + CDbl(tbZurückSumme.Text)
End If
End Sub
Hallo Skaletti,
nun kommt die Frage wo wir noch die Antwort wissen müssten. Was stand zur Zeit als der Fehler auftrat in den Textboxen Wareneingang sowie Warenausgang?
Meine Vermutung ist das dort ungültige Werte standen! Warum prüfst du eigentlich nicht die Eingaben, gleich in dem Moment wo eine Taste gedrueckt wird?(Keypress Ereignis abfangen und mittels Select Case dir Taste prüfen)
Dort kannst du zum Bsp. nur Zahlen, Enter und Backspace, sowie das Komma oder den Punkt zulassen. Somit bist du immer auf der sicheren Seite das richtige Werte angegeben sind
MfG Alex
Hallo Alex,
du Nachtschwärmer.
nun kommt die Frage wo wir noch die Antwort wissen müssten.
Was stand zur Zeit als der Fehler auftrat in den Textboxen
Wareneingang sowie Warenausgang?
Wenn die Form aufgerufen wird werden aus 4 bestimmten Zellen
der aktiven Zeile 4 Textboxen gefüllt. Nur Standartzahlen ohne
Komma und Punkt. Die TextBoxen lassen auch nur die Eingabe von
Zahlen ohne K+P zu.
In diesem Moment muss der 1. Button gesperrt sein. ist er es nicht
gibt es den Laufzeitfehler. Wenn ich ihn betätigen würde und in den
3 Eingabeboxen steht keine Zahl sowieso. Eine Zeitlang war der
Button gesperrt, dann kein Laufzeitfehler.
Wenn der Button nicht gesperrt ist, und ich will die erste Zahl
in eine Eingabebox eingeben, Laufzeitfehler.
Ich habe die Befehle zum Sperren des Button mal herauskommentiert,
dann kein Laufzeitfehler, es sei den ich betätige den Butto bevor
in jeder Eingabebox eine Zahl steht, das ist ja normal.
Meine Vermutung ist das dort ungültige Werte standen! Warum
prüfst du eigentlich nicht die Eingaben, gleich in dem Moment
wo eine Taste gedrueckt wird?(Keypress Ereignis abfangen und
mittels Select Case dir Taste prüfen)
Das ist Neuland für mich.
Dort kannst du zum Bsp. nur Zahlen, Enter und Backspace,
sowie das Komma oder den Punkt zulassen. Somit bist du immer
auf der sicheren Seite das richtige Werte angegeben sind
Ich bin fest davon überzeugt das ich nur Zahlen eingeben wollt,
sonst MsgBox „Bitte eine Zahl eingeben“
Ich hoffe das iat einigermaßen Verständlich.
Vielen Dank für deine Hilfe.
Gruß Skaletti!
Hi Alex,
noch ein Nachtrag,
im Moment gehts wieder, aber der Button sperrt erst wenn ich die
- Zahl eingebe, ist nicht gesperrt beim Aufruf der UserForm.
Gruß Skaletti!