xaumichi
Goto Top

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!)

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

Content-ID: 148149

Url: https://administrator.de/contentid/148149

Ausgedruckt am: 22.11.2024 um 20:11 Uhr

bastla
bastla 02.08.2010 um 16:53:07 Uhr
Goto Top
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 "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
xaumichi
xaumichi 02.08.2010 um 17:06:29 Uhr
Goto Top
hm....!
Hab ich das richtig verstanden?

Ich soll einfach das Change()-Ereignis in eine IF-Verzweigung geben, in dem ich zuerst überprüfe ob "TargetColumn" = "D" ist?

Okey. probier ich mal! =)
xaumichi
xaumichi 02.08.2010 um 18:39:49 Uhr
Goto Top
Hm...irgendwie bekomm ich das nicht hin.... =(
76109
76109 02.08.2010 um 20:01:16 Uhr
Goto Top
Hallo xaumichi!

Etwa in der Art:
If Target.Address = "$D$15" Then ....  
'oder sowas?  
If Target.Address = "$D$15" And Range("D15") <> "" Then ....  

Gruß Dieter
bastla
bastla 02.08.2010 um 20:08:11 Uhr
Goto Top
Hallo xaumichi!

Versuch es so (Spalte D = Spalte 4):
If Target.Column = 4 Then Exit Sub
Grüße
bastla
xaumichi
xaumichi 02.08.2010 um 20:19:54 Uhr
Goto Top
Hm...funktioniert gaber leider nicht ganz.

Denn wenn B15 einen Wert hat, dann darf/muss man etwas in die Spalte D schreiben können!
bastla
bastla 02.08.2010 um 20:27:20 Uhr
Goto Top
... und was hält Dich davon ab, das mit einem "And" zu verknüpfen (hat Dieter gerade oben gezeigt) oder ein weiteres "If" dahinter zu hängen?

Außerdem: Die Eingabe (in D15) bleibt ja trotzdem in der Zelle erhalten ...

Grüße
bastla
xaumichi
xaumichi 02.08.2010 um 20:58:11 Uhr
Goto Top
Okey danke! =)
allerdings ist habe ich jetzt das Problem: wie bekomm ich den Text jetzt wieder weg?

habe es mit

Cells(Target.Row, "D").value= "" oder Cells(Target.Row, "D").clearContents
(in dem if-zweig, der aktiviert wird, wenn in der B-Spalte wieder etwas eingetragen wird)


Allerdings stürzt dabei das Programm ab
xaumichi
xaumichi 03.08.2010 um 10:00:18 Uhr
Goto Top
So, habs geschafft! =) (hab eine "WENN Text -- DANN" hineingebracht, jetzt gehts!

Noch eine Kleinichkeit am Rande:

Mein Programm zum einfügen der verschiedenen Möglichkeiten (durch aktivieren von OptionsButtons) sieht so aus:

if UserForm1.OptionButton1.Value = True then
   UserForm1.Hide
   Worksheets("Tabelle3").Range("D15") = "Möglichkeit1"  
end if

if UserForm1.OptionButton2.Value = True then
   UserForm1.Hide
   Worksheets("Tabelle3").Range("D15") = "Möglichkeit2"  
end if

usw.

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)

LG Mike
xaumichi
xaumichi 03.08.2010 um 10:47:27 Uhr
Goto Top
76109
76109 03.08.2010 um 12:52:54 Uhr
Goto Top
Zitat von @xaumichi:
Wie könnte ich dies verallgemeinern, sodass das Programm für alle 36 Zeilen geht?
Wie, wer, wo, was 36 Zeilen?

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
xaumichi
xaumichi 03.08.2010 um 13:06:58 Uhr
Goto Top
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.


Hätte ich auch schon versucht!

"Laufzeitfehler! Objekt erforderlich"
76109
76109 03.08.2010 um 16:27:55 Uhr
Goto Top
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.

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
Aufruf z.B. : UserForm1.SetTarget(Target)

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
Aufruf z.B.: Text = UserForm1.GetString

Gruß Dieter
xaumichi
xaumichi 11.08.2010, aktualisiert am 18.10.2012 um 18:43:06 Uhr
Goto Top
Hallo!

So, hab jetzt noch mal so ein ähniches Problem:

Es geht um das selbe Programm, bei dem Im Thread <url>VBA Verweise erstellen schon sehr oft geholfen wurde! face-wink

Ich habe im Tabellenblatt "Mitarbeiter" einen kleinen Code geschrieben, der durch Doppelklich auf eine Zelle I, J oder K das entsprechende Tabellenblatt öffne, löschen oder drucken kann.

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).Value <> "" Then 'keine Aktion bei klick auf leerzelle  
       Cancel = True
                   
            Select Case Target.Column
            Case 9 'Spalte I Anzeigen  
                Sheets(Cells(Target.Row, 1).Value).Visible = True
                Sheets(Cells(Target.Row, 1).Value).Activate
                                
            Case 10  'Spalte J Blatt drucken  
                Sheets(Cells(Target.Row, 1).Value).Visible = True
                Sheets(Cells(Target.Row, 1).Value).PrintOut
                Sheets(Cells(Target.Row, 1).Value).Visible = False
                
            Case 11 'Blatt löschen  
            
                Sheets(Cells(Target.Row, 1).Value).Visible = True
                Sheets(Cells(Target.Row, 1).Value).Delete
                                
            Case Else
        End Select
    End If
End If
End Sub

soweit, so gut, das funktioniert ohne Probleme.

Jetzt wollte ich zur Sicherheit, vorm Löschen, eine Userform ausgeben, die nochmal fragt, ob man wirklich löschen möchte. (Userform3, mit 2 Commandbuttons "Löschen" und "Abbruch")

Dazu hab ich obigen Code ein bisschen geändert

'Tabellenblatt "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).Value <> "" Then 'keine Aktion bei klick auf leerzelle  
       Cancel = True
                   
            Select Case Target.Column
            Case 9 'Spalte I Anzeigen  
                Sheets(Cells(Target.Row, 1).Value).Visible = True
                Sheets(Cells(Target.Row, 1).Value).Activate
                                
            Case 10  'Spalte J Blatt drucken  
                Sheets(Cells(Target.Row, 1).Value).Visible = True
                Sheets(Cells(Target.Row, 1).Value).PrintOut
                Sheets(Cells(Target.Row, 1).Value).Visible = False
                
            Case 11 'Blatt löschen  
           
            Dim zulöschen As String

                zulöschen = Cells(Target.Row, 1).Value
                UserForm3.Show
                                
            Case Else
        End Select
    End If
End If
End Sub

'Userform3  
'--------------------------------  

Private Sub CommandButton1_Click()

                Sheets(zulöschen).Delete
                           
                    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
End Sub


Allerdings bekomme ich so einen Laufzeitfehler ("Objekt nicht im Bereich").
Ich vermute jetzt mal stark, dass das mit der Variable "zulöschen" zusammenhängt, dass diese nicht richtig ans userform3 übergeben wird. Aber leider weiß ich nicht, wie das richtig geht.
Könnte mir da jemand helfen?

Lg Mike
76109
76109 11.08.2010 um 12:00:29 Uhr
Goto Top
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 Gleicheface-wink

Gruß Dieter
xaumichi
xaumichi 11.08.2010 um 12:29:24 Uhr
Goto Top
Hm....ich packs nicht!

Ich habe jetzt:

Sub SetTarget(ByRef Target)
    Show
                zulöschen = sheets(cells(Target.Row, 1).Value)
    Unload Me
End Sub

würde das so stimmen?

und wo sollte das jetzt eingefügt werden, in die Userform unter "Allgemein" oder bei "Mitarbeiter"????

LG Mike
76109
76109 11.08.2010 um 13:14:02 Uhr
Goto Top
Hallo Mike!

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
muss so lauten
                    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
xaumichi
xaumichi 11.08.2010 um 14:11:21 Uhr
Goto Top
Hm...okey, hab ich gemacht! würde für eine bessere Übersicht helfen, ja! face-smile

Wenn ich beim Namen einen " _ " machen möchte, muss dann der Namen unter " " stehen??

LG Mike
76109
76109 11.08.2010 um 15:02:35 Uhr
Goto Top
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 Wortabgrenzungface-wink

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
76109
76109 11.08.2010 um 15:05:46 Uhr
Goto Top
Hallo Mike!

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
wobei aber in UserForm3-Codezeile 10 bis Spalte K gelöscht werden sollte, da ja bis Spalte K sortiert wirdface-wink. Und Deine Sort-Syntax bekomme ich leider nicht zum Laufen oder ist in meiner Excel-Version so nicht verfügbar?

Gruß Dieter
xaumichi
xaumichi 11.08.2010 um 15:27:20 Uhr
Goto Top
Hm! Funktioniert ansich schon ganz gut! face-smile Danke.
Nur das mit dem Abbrechen funktioniert noch nicht so wirklich.
Wenn ich Abbrechen klicke, will Excel trotzdem löschen....!

Hab jetzt schon probiert:

Privat Sub Btn_Cancel_Click()
    Userform3.Hide
   Exit Sub
End Sub

Hat jedoch so nicht funktioniert...!
76109
76109 11.08.2010 um 15:46:41 Uhr
Goto Top
Hallo Mike!

Ups, daran habe ich jetzt nicht gedachtface-sad Code oben geändert.

Und wofür steht das Exit Sub vor End Sub?

Gruß Dieter
xaumichi
xaumichi 11.08.2010 um 15:50:23 Uhr
Goto Top
Das wollte ich soeben ändern, weil ich selber gerade gemerkt habe, dass das komplet nutzlos ist! face-smile

Okey, thx!

[EDIT]

Aaaachso, okey. Jetzt weiß ich das auch!
76109
76109 11.08.2010 um 16:01:16 Uhr
Goto Top
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