VBA - Eingefügter Text verschwindet
Hallo!
Ich habe folgendes Problem:
Ich hab eine Programm, das die Zeile 15 grau hinterlegt und sperrt, wenn der Wert von B15 gelöscht wird.
(Das ganze befindet sich in einem Change()-Ereignis!)
jetzt kommt nun dazu, dass eine Userform aufgerufen wird, wenn B15 gelöscht wird, bei der man mehrer Auswahlmöglichkeiten hat.
Wird diese Userfom, dann bestätigt, soll die gewählte Möglichkeit in D15 automatisch eingetragen werden.
Ansich funktioniert es zwar
Mein Problem ist jetzt, dass der Text nur ganz kurz erscheint und dann wieder gelöscht wird.
Kann mir jemand sagen, warum das so ist und/oder wie ich das beheben kann?!
LG MIKE
Ich habe folgendes Problem:
Ich hab eine Programm, das die Zeile 15 grau hinterlegt und sperrt, wenn der Wert von B15 gelöscht wird.
(Das ganze befindet sich in einem Change()-Ereignis!)
If Cells(Target.Row, "B") = 0 Then
NoChange = True
Range(Cells(Target.Row, "C"), Cells(Target.Row, "I")).ClearContents
NoChange = False
Range(Cells(Target.Row, "C"), Cells(Target.Row, "N")).Locked = True
Cells(Target.Row, "A").Font.Color = RGB(216, 216, 216)
Range(Cells(Target.Row, "C"), Cells(Target.Row, "N")).Font.Color = RGB(192, 192, 192)
Range(Cells(Target.Row, "A"), Cells(Target.Row, "N")).Interior.Color = RGB(192, 192, 192)
.....
jetzt kommt nun dazu, dass eine Userform aufgerufen wird, wenn B15 gelöscht wird, bei der man mehrer Auswahlmöglichkeiten hat.
Wird diese Userfom, dann bestätigt, soll die gewählte Möglichkeit in D15 automatisch eingetragen werden.
Ansich funktioniert es zwar
if optionbutton1.value = true
Range("D15").Value="text"
endif
Mein Problem ist jetzt, dass der Text nur ganz kurz erscheint und dann wieder gelöscht wird.
Kann mir jemand sagen, warum das so ist und/oder wie ich das beheben kann?!
LG MIKE
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 148149
Url: https://administrator.de/forum/vba-eingefuegter-text-verschwindet-148149.html
Ausgedruckt am: 24.12.2024 um 02:12 Uhr
24 Kommentare
Neuester Kommentar
Hallo xaumichi!
Wenn Du immer, wenn der Wert einer Zelle geändert wird, gleich mal kontrollierst, ob sich in der Splate B der aktuellen Zeile der Wert 0 befindet und dann alle Inhalte der Spalten C bis I eliminierst, hat der Wert in Spalte D nicht allzu gute Chancen ...
... daher könntest Du versuchsweíse zunächst einmal prüfen, ob "
Grüße
bastla
Wenn Du immer, wenn der Wert einer Zelle geändert wird, gleich mal kontrollierst, ob sich in der Splate B der aktuellen Zeile der Wert 0 befindet und dann alle Inhalte der Spalten C bis I eliminierst, hat der Wert in Spalte D nicht allzu gute Chancen ...
... daher könntest Du versuchsweíse zunächst einmal prüfen, ob "
Target.Column
" gerade "D" ist und in diesem Fall einfach "tschüss" (oder auch "Exit Sub
") sagen, oder ev etwas anderes Vernünftiges tun.Grüße
bastla
Hallo xaumichi!
Etwa in der Art:
Gruß Dieter
Etwa in der Art:
If Target.Address = "$D$15" Then ....
'oder sowas?
If Target.Address = "$D$15" And Range("D15") <> "" Then ....
Gruß Dieter
Zitat von @xaumichi:
Wie könnte ich dies verallgemeinern, sodass das Programm für alle 36 Zeilen geht?
Wie, wer, wo, was 36 Zeilen?Wie könnte ich dies verallgemeinern, sodass das Programm für alle 36 Zeilen geht?
ActiveSheet.cells(Target.Row, "D") = "Möglichkeit1"
funktioniert nicht. (Laufzeitfehler! Objekt wählen)
Dann laß das ActiveSheet weg, nur:Cells(Target.Row, "D") = "Möglichkeit1"
Gruß Dieter
Zitat von @xaumichi:
Naja, es ist so, dass in diesem Tabelleblatt 36 Reihen sind, und bei jeder Reihe, wenn die B-Zelle gelöscht wird, wird die
Userform aufgerufen.
Und die Codezeile mit dem Target.Row hast Du im UserForm-Code stehen? Wenn ja, kann das natürlich nicht funktionieren.Naja, es ist so, dass in diesem Tabelleblatt 36 Reihen sind, und bei jeder Reihe, wenn die B-Zelle gelöscht wird, wird die
Userform aufgerufen.
Entweder Du definierst in einem Modul eine Public-Variable As Range und initialisierst diese in der Change-Routine oder
Du fügst in Deiner UserForm eine Sub mit Übergabe-Parameter ein z.B.:
'UserForm
Option Explicit
Sub SetTarget(ByRef Target)
Show
If OptionButton1 = True Then
Cells(Target.Row, "D") = "Möglichkeit1"
ElseIf OptionButton2 = True
Cells(Target.Row, "D") = "Möglichkeit2"
ElseIf....
...
End If
Unload Me
End Sub
Oder Du verwendest eine Funktion, die den Options-Button-Text zurückgibt. Das geht dann in etwa so:
'UserForm
Option Explicit
Funktion GetString() As String
Show
If OptionButton1 = True Then
GetString = "Möglichkeit1"
ElseIf OptionButton2 = True
GetString = "Möglichkeit2"
ElseIf....
...
End If
Unload Me
End Function
Gruß Dieter
Hallo Mike!
Die Antwort steht genau vor Deinem Kommentar *kopfschüttel* ???
Da handelt es sich zwar um ein Range-Object, aber das Prinzip ist das Gleiche
Gruß Dieter
Die Antwort steht genau vor Deinem Kommentar *kopfschüttel* ???
Da handelt es sich zwar um ein Range-Object, aber das Prinzip ist das Gleiche
Gruß Dieter
Hallo Mike!
Bevor ich mir das eigentliche Problem noch anschaue, einen Hinweis zum Sort vorweg:
Das hier:
muss so lauten
Gruß Dieter
PS. Und vergebe in Deinen UserForms mal vernünftige Name z.B. für CommandButton1 den Namen "Btn_OK" ...
VB-Editor: Button markieren und im Eigenschaftsfenster unter (Namen) "Btn_OK" eintragen
Bevor ich mir das eigentliche Problem noch anschaue, einen Hinweis zum Sort vorweg:
Das hier:
With Sheets("Mitarbeiter")
.Range("E1:H30").Locked = False
.Range(Cells(Target.Row, 1), Cells(Target.Row, "H")).ClearContents
.Range("E1:H30").Locked = True
.Sort
.SetRange Range("A2:K21")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
With Sheets("Mitarbeiter")
.Range("E1:H30").Locked = False
.Range(Cells(Target.Row, 1), Cells(Target.Row, "H")).ClearContents
.Range("E1:H30").Locked = True
With .Sort
.SetRange Range("A2:K21")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
Gruß Dieter
PS. Und vergebe in Deinen UserForms mal vernünftige Name z.B. für CommandButton1 den Namen "Btn_OK" ...
VB-Editor: Button markieren und im Eigenschaftsfenster unter (Namen) "Btn_OK" eintragen
Zitat von @xaumichi:
Wenn ich beim Namen einen " _ " machen möchte, muss dann der Namen unter " " stehen??
Ne, natürlich nicht, diente im Kommentar nur der WortabgrenzungWenn ich beim Namen einen " _ " machen möchte, muss dann der Namen unter " " stehen??
Und wenn Du schon dabei bist, dann könntest Du das auch mit den UserForms machen z.B. UserForm3 (Rahmen anklicken) und Namen FormUserDelete...
Gruß Dieter
Hallo Mike!
So sollte es funktionieren:
wobei aber in UserForm3-Codezeile 10 bis Spalte K gelöscht werden sollte, da ja bis Spalte K sortiert wird. Und Deine Sort-Syntax bekomme ich leider nicht zum Laufen oder ist in meiner Excel-Version so nicht verfügbar?
Gruß Dieter
So sollte es funktionieren:
'Sheet Mitarbeiter
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Row > 1 Then 'keine aktion bei klick auf Überschrift
If Cells(Target.Row, 1) <> "" Then 'keine Aktion bei klick auf leerzelle
Cancel = True
With Sheets(Cells(Target.Row, "A").Value)
Select Case Target.Column
Case 9 'Spalte I Anzeigen
.Visible = True
.Activate
Case 10 'Spalte J Blatt drucken
.Visible = True
.PrintOut
.Visible = False
Case 11 'Blatt löschen
If UserForm3.Loeschen(Target) = True Then
.Visible = True
.Delete
End If
Case Else
End Select
End With
End If
End If
End Sub
'UserForm3
Dim OK As Boolean
Function Loeschen(ByRef Target) As Boolean
Show
If OK = True Then
Range("E1:H30").Locked = False
Range(Cells(Target.Row, 1), Cells(Target.Row, "H")).ClearContents
Range("E1:H30").Locked = True
Range("A2:K21").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlNo, MatchCase:=False, _
Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:=xlSortNormal
Loeschen = True
End If
End Function
Private Sub Btn_OK_Click()
OK = True: Unload Me
End Sub
Private Sub Btn_Cancel_Click()
Unload Me
End Sub
Gruß Dieter
Hallo Mike!
Ups, daran habe ich jetzt nicht gedacht Code oben geändert.
Und wofür steht das Exit Sub vor End Sub?
Gruß Dieter
Ups, daran habe ich jetzt nicht gedacht Code oben geändert.
Und wofür steht das Exit Sub vor End Sub?
Gruß Dieter
Hallo nochmal!
Und was willst Du mit der Hide-Anweisung (Verstecken) erreichen? Im Speicher halten, bis der nächste User in 3 Jahren gelöscht wird?
Das macht nur Sinn, wenn Du eine andere UserForm aufrufst. Ansonsten die UserForm mit Unload Me beenden.
Gruß Dieter
Und was willst Du mit der Hide-Anweisung (Verstecken) erreichen? Im Speicher halten, bis der nächste User in 3 Jahren gelöscht wird?
Das macht nur Sinn, wenn Du eine andere UserForm aufrufst. Ansonsten die UserForm mit Unload Me beenden.
Gruß Dieter