Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1636to1640
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
Fehler bei Textbox in Zelle schreiben
15.08.2018 15:01:55
EasyD
Hallo zusammen
ich bin verzweifelt.
Grundsätzlich versuche ich ja schon erstmal alleine meinen selbst fabrizierten Unfug zu bereinigen. Ich habe aber hier in meiner Planungsrechnung einen Laufzeitfehler und bekomme nicht heraus was das Problem ist.
Ich habe eine Userform "UFVormonate" mit 2 multipages.
auf jeder page befinden sich 3 Textboxen, insgesamt also 6 Stück.
Click auf den Commandbutton soll die in den Textboxen eingetragenen Zahlen in die Zellen ab Zeile 66 schreiben. Die zu befüllende Zeile wird dabei davon abhängig gemacht, ob in den Zeilen 44 bis 47 eine "1" steht oder nicht (da steht jeweils nur in einer dieser 4 Zeilen eine 1).
merkwürdig ist, dass die Textbox1 anstandslos zu funktionieren scheint. Der Laufzeitfehler kommt mir erst bei der Textbox2. Ich habe deshalb die Anweisung für die Textbox2 mal auskommentiert und der Fehler erschien dann bei Textbox3.
Ich habe allerdings ALLE übrigen 5 Textboxen erstellt indem ich die Textbox1 kopiert habe. Ich kann also beim besten Willen nicht erkennen, warum Textbox1 geht und die anderen nicht.
Hängt doch sicherlich zusammen mit der Formatiererei bei den Textboxen (ich will natürlich Zahlen mit 2 Kommastellen erzwingen) oder?
Wer hat die Muße sich das hier rein zu ziehen?
Der Code der Userform:
(die Initialisierung der Userform nur der Vollständigkeit halber, vielleicht mache ich ja da _ schon was falsch)

Private Sub UserForm_Initialize()
ActiveSheet.Unprotect
MultiPage1.Value = 0 'immer die erste Multipage-Seite anzeigen
MultiPage1.Pages(0).Caption = "Umsätze " & ActiveSheet.Range("B60").Value
MultiPage1.Pages(1).Caption = "Umsätze " & ActiveSheet.Range("B61").Value
Label4.Caption = ActiveSheet.Range("D60").Value & " 19% USt"
Label5.Caption = ActiveSheet.Range("D60").Value & " 7% USt"
Label6.Caption = ActiveSheet.Range("D60").Value & " 0% USt"
Label7.Caption = ActiveSheet.Range("D60").Value & " 19% USt"
Label8.Caption = ActiveSheet.Range("D60").Value & " 7% USt"
Label9.Caption = ActiveSheet.Range("D60").Value & " 0% USt"
TextBox1 = Format(TextBox1, "#,##0.00")
TextBox2 = Format(TextBox2, "#,##0.00")
TextBox3 = Format(TextBox3, "#,##0.00")
TextBox4 = Format(TextBox4, "#,##0.00")
TextBox5 = Format(TextBox5, "#,##0.00")
TextBox6 = Format(TextBox6, "#,##0.00")
'die Summen der Einträge von der letzten Eingabe wieder in die Textboxen übernehmen
TextBox1 = ActiveSheet.Range("F78").Value
TextBox2 = ActiveSheet.Range("F79").Value
TextBox3 = ActiveSheet.Range("F80").Value
TextBox4 = ActiveSheet.Range("E78").Value
TextBox5 = ActiveSheet.Range("E79").Value
TextBox6 = ActiveSheet.Range("E80").Value
If ActiveSheet.Range("D5").Value = "nein" Then
MultiPage1.Pages(1).Visible = False 'die zweite Seite ausblenden, wenn keine DFV gewährt wurde
End If
'die letzten Angaben für die Vormonate wieder löschen
'Events abschalten, da sonst das worksheet.change Ereignis durchlaufen wird
Application.EnableEvents = False
ActiveSheet.Range("E66:F77").ClearContents
Application.EnableEvents = True
ActiveSheet.Protect
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'alle 6 TextBoxen der Userform mit Dezimalzahlen erzwingen
TextBox1 = Format(TextBox1, "#,##0.00")
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 48 To 57
Case 44, 46: KeyAscii = IIf(InStr(1, TextBox1, ",") = 0, 44, 0)
Case Else: KeyAscii = 0
End Select
End Sub

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox2 = Format(TextBox2, "#,##0.00")
End Sub

Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 48 To 57
Case 44, 46: KeyAscii = IIf(InStr(1, TextBox2, ",") = 0, 44, 0)
Case Else: KeyAscii = 0
End Select
End Sub

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox3 = Format(TextBox3, "#,##0.00")
End Sub

Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 48 To 57
Case 44, 46: KeyAscii = IIf(InStr(1, TextBox3, ",") = 0, 44, 0)
Case Else: KeyAscii = 0
End Select
End Sub

Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox4 = Format(TextBox4, "#,##0.00")
End Sub

Private Sub TextBox4_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 48 To 57
Case 44, 46: KeyAscii = IIf(InStr(1, TextBox4, ",") = 0, 44, 0)
Case Else: KeyAscii = 0
End Select
End Sub

Private Sub TextBox5_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox5 = Format(TextBox5, "#,##0.00")
End Sub

Private Sub TextBox5_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 48 To 57
Case 44, 46: KeyAscii = IIf(InStr(1, TextBox5, ",") = 0, 44, 0)
Case Else: KeyAscii = 0
End Select
End Sub

Private Sub TextBox6_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TextBox6 = Format(TextBox6, "#,##0.00")
End Sub

Private Sub TextBox6_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 48 To 57
Case 44, 46: KeyAscii = IIf(InStr(1, TextBox6, ",") = 0, 44, 0)
Case Else: KeyAscii = 0
End Select
End Sub

Private Sub CommandButton1_Click()
ActiveSheet.Unprotect
Application.ScreenUpdating = False
'die aktuellen Angaben in die Planung übernehmen
With ActiveSheet
'Soll-Versteuerung / ohne DFV
If ActiveSheet.Cells(44, 3).Value = 1 Then
ActiveSheet.Cells(66, 6) = CDbl(TextBox1.Value)
ActiveSheet.Cells(67, 6) = CDbl(TextBox2.Value) 'ab hier hängts xxxxxxx
ActiveSheet.Cells(68, 6) = CDbl(TextBox3.Value)
ActiveSheet.Cells(66, 5) = CDbl(TextBox4.Value)
ActiveSheet.Cells(67, 5) = CDbl(TextBox5.Value)
ActiveSheet.Cells(68, 5) = CDbl(TextBox6.Value)
Else
End If
'Soll-Versteuerung / mit DFV
If ActiveSheet.Cells(45, 3).Value = 1 Then
ActiveSheet.Cells(69, 6) = CDbl(TextBox1.Value)
ActiveSheet.Cells(70, 6) = CDbl(TextBox2.Value) 'ab hier hängts xxxxxxx
ActiveSheet.Cells(71, 6) = CDbl(TextBox3.Value)
ActiveSheet.Cells(69, 5) = CDbl(TextBox4.Value)
ActiveSheet.Cells(70, 5) = CDbl(TextBox5.Value)
ActiveSheet.Cells(71, 5) = CDbl(TextBox6.Value)
Else
End If
'IST-Versteuerung / ohne DFV
If ActiveSheet.Cells(46, 3).Value = 1 Then
ActiveSheet.Cells(72, 6) = CDbl(TextBox1.Value)
ActiveSheet.Cells(73, 6) = CDbl(TextBox2.Value) 'ab hier hängts xxxxxxx
ActiveSheet.Cells(74, 6) = CDbl(TextBox3.Value)
ActiveSheet.Cells(72, 5) = CDbl(TextBox4.Value)
ActiveSheet.Cells(73, 5) = CDbl(TextBox5.Value)
ActiveSheet.Cells(74, 5) = CDbl(TextBox6.Value)
Else
End If
'IST-Versteuerung / mit DFV
If ActiveSheet.Cells(47, 3).Value = 1 Then
ActiveSheet.Cells(75, 6) = CDbl(TextBox1.Value)
ActiveSheet.Cells(76, 6) = CDbl(TextBox2.Value) 'ab hier hängts xxxxxxx
ActiveSheet.Cells(77, 6) = CDbl(TextBox3.Value)
ActiveSheet.Cells(75, 5) = CDbl(TextBox4.Value)
ActiveSheet.Cells(76, 5) = CDbl(TextBox5.Value)
ActiveSheet.Cells(77, 5) = CDbl(TextBox6.Value)
Else
End If
End With
ActiveSheet.Protect
Application.ScreenUpdating = True
Unload UFVormonate
End Sub

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fehler bei Textbox in Zelle schreiben
15.08.2018 16:22:21
EasyD
Oh mann
Ich habe mal weiter herum probiert.
Das worksheet_change scheint mir das Problem zu sein.
EnableEvents am Anfang der Commandbutton1-Prozedur abschalten und am Ende wieder ein bringt den gewünschten Effekt und die Zahlen der Textboxen stehen in den Zellen wo sie hin gehören.
Das Problem:
Ich muss aber (!!!) in dem worksheet_change den Blattschutz aus- und wieder anschalten.
Das habe ich natürlich am Anfang und am Ende der Prozedur gemacht. Offensichtlich aber löst genau das den Laufzeitfehler aus denn die Zahlen der Textboxen in die Zellen schreiben löst das worksheet-change natürlich aus.
Warum aber ist das ein Problem, wenn ich den Blattschutz zu Beginn des worksheet_change abschalte und am Schluss wieder ein? In der Zeit dazwischen sollte doch die Nummer mit den Textboxen ablaufen oder?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
ActiveSheet.Unprotect
Application.ScreenUpdating = False
If Not Intersect(Target, Range("D3")) Is Nothing Then
'die richtigen Spalten ein- und ausblenden bei Auswahl der Planungsebene
'Formeln in die Quartalsspalten wenn Monatsplanung ausgewählt wurde, sonst leer
'ACHTUNG - Umsatzsteuer wird bei Auswahl Monat nur summiert aus den Monatsspalten
'Bei Auswahl Quartal muss gerechnet werden
If Target.Value = "Quartal" Then
Columns("G:S").Hidden = True
Range("T9:T38, T40:T42, U9:U38, U40:U42, V9:V38, V40:V42, W9:W38, W40:W42").Value = ""
Range("T9:T38, T40:T42, U9:U38, U40:U42, V9:V38, V40:V42, W9:W38, W40:W42").Locked = False
Range("T49").FormulaR1C1 = "=IF(R3C4=""Monat"",SUM(RC[-13]:RC[-11]),SUMPRODUCT(R9C4:R42C4,R[ _
-40]C[-1]:R[-7]C[-1]))"
Range("U49").FormulaR1C1 = "=IF(R3C4=""Monat"",SUM(RC[-11]:RC[-9]),SUMPRODUCT(R9C4:R42C4,R[- _
40]C[-1]:R[-7]C[-1]))"
Range("V49").FormulaR1C1 = "=IF(R3C4=""Monat"",SUM(RC[-9]:RC[-7]),SUMPRODUCT(R9C4:R42C4,R[- _
40]C[-1]:R[-7]C[-1]))"
Range("W49").FormulaR1C1 = "=IF(R3C4=""Monat"",SUM(RC[-7]:RC[-5]),SUMPRODUCT(R9C4:R42C4,R[- _
40]C[-1]:R[-7]C[-1]))"
Else
If MsgBox("Wenn Sie von ""Quartal"" auf ""Monat"" umstellen, werden sämtliche evtl.  _
vorgenommene Eintragungen in den Quartalsspalten gelöscht!", vbOKCancel, "Planungsebene ändern") = vbOK Then
Columns("G:S").Hidden = False
Range("T9:T38, T40:T42, T49").FormulaR1C1 = "=SUM(RC[-13]:RC[-11])"
Range("U9:U38, U40:U42, U49").FormulaR1C1 = "=SUM(RC[-11]:RC[-9])"
Range("V9:V38, V40:V42, V49").FormulaR1C1 = "=SUM(RC[-9]:RC[-7])"
Range("W9:W38, W40:W42, W49").FormulaR1C1 = "=SUM(RC[-7]:RC[-5])"
Range("T9:T38, T40:T42, U9:U38, U40:U42, V9:V38, V40:V42, W9:W38, W40:W42").Locked =  _
True
Else
Target.Value = "Quartal"
End If
End If
Else
'Die Spalten entsperren wenn Startmonat = Monat
'in Zeile 6 steht der Kenner ob Monat kleiner als Startdatum
For Each c In Range("G6:R6")
'zuerst alle entsperren und ohne Hintergrundfarbe
c.Offset(3, 0).Resize(30).Interior.ColorIndex = 0
c.Offset(3, 0).Resize(30).Locked = False
c.Offset(34, 0).Resize(3).Interior.ColorIndex = 0
c.Offset(34, 0).Resize(3).Locked = False
If c 

Anzeige
AW: Fehler bei Textbox in Zelle schreiben
15.08.2018 16:37:16
ChrisL
Hi
Unprotect/Protect und EnableEvents ist kein Widerspruch.
Wenn das Target nicht D2 oder D3 ist, dann brauchst du auch kein Unprotect.
Hier ein mögliches Grundgerüst:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
On Error GoTo ErrorHandler
If Not Intersect(Target, Range("D2:D3")) Is Nothing Then
Application.ScreenUpdating = False
Application.EnableEvents = False
ActiveSheet.Unprotect
If Not Intersect(Target, Range("D3")) Is Nothing Then
'mach
End If
If Not Intersect(Target, Range("D2")) Is Nothing Then
'mach
End If
ActiveSheet.Protect
Application.EnableEvents = True
End If
Exit Sub
ErrorHandler:
ActiveSheet.Protect
Application.EnableEvents = True
MsgBox "Fehler blabla"
End Sub
cu
Chris
PS: Die On-Error-Anweisung während der Entwicklung deaktivieren, sonst siehst du die Fehler nicht.
Anzeige
AW: Fehler bei Textbox in Zelle schreiben
16.08.2018 08:11:48
EasyD
HEy Chris
Ich dank Dir!
An solchen Sachen merke ich immer, dass ich noch viel üben muss.
Natürlich muss ich den Blattschutz nur dann aufheben, wenn ich mich in D2 oder D3 befinde. Ist logisch und meinen Code hätte ich von Anfang an so schreiben sollen allein um andere Fehler auch auszuschließen und auch um die Prozedur zu beschleunigen.
Mit deiner Lösung funktioniert's bis jetzt prima! Ich werde noch ein bisschen weiter testen.
Ich verstehe allerdings immernoch nicht, warum die Userform bzw die Textboxen Streß machen wenn ich doch in dem CommandButton_Click ebenfalls den Blattschutz aufhebe.
Wenn ich mit Blattschutz arbeiten muss, dann mache ich das nämlich meistens so dass ich als erstes vor jeder weiteren Programmierung an Beginn und Ende der jeweiligen Prozedur immer den Balttschutz ab- und einschalte, damit ich es nicht später irgendwo vergesse und definitiv alle Aktionen ausführen kann wie ich es brauche. Scheint mir die falsche Herangehensweise zu sein....
Grüße
Anzeige
AW: Fehler bei Textbox in Zelle schreiben
15.08.2018 16:39:14
Matthias
Moin!
Ne, das ist eben etwas anders. Erst wird der Wert in das Blatt eingetragen und durch das Eintragen springt das Change Ereignis an.
Im Zweifel ein Funktion anlegen, die vor dem Eintragen den Schutz aufhebt (noch vor dem ChangeEvent).
VG
AW: Fehler bei Textbox in Zelle schreiben
15.08.2018 21:50:25
Gerd
Moin,
probier mal so:
If IsNumeric(Textbox2.Value) Then
ActiveSheet.Cells(70, 6) = CDbl(Replace(Textbox2.Value, ",", ".")) 'ab hier hängts xxxxxxx
End If

Gruß Gerd
AW: Fehler bei Textbox in Zelle schreiben
16.08.2018 08:13:24
EasyD
Danke für die Rückmeldung Gerd
die Nummer mit Isnumeric hatte ich ebenfalls schon probiert, war nicht das Problem.
Mit CDbl(TextBox1.Value) erreiche ich ja auch schon den Numerischen Wert, richtig?
Abgesehen davon - mit Chris KLösung läuft es.
Grüße
Anzeige

329 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige