Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

VBA - Eingefügter Text verschwindet

Frage Microsoft Microsoft Office

Mitglied: xaumichi

xaumichi (Level 1) - Jetzt verbinden

02.08.2010, aktualisiert 18.10.2012, 4034 Aufrufe, 24 Kommentare

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

01.
 
02.
If Cells(Target.Row, "B") = 0 Then 
03.
                                           
04.
                                          
05.
                NoChange = True 
06.
                Range(Cells(Target.Row, "C"), Cells(Target.Row, "I")).ClearContents 
07.
                NoChange = False 
08.
                Range(Cells(Target.Row, "C"), Cells(Target.Row, "N")).Locked = True 
09.
                Cells(Target.Row, "A").Font.Color = RGB(216, 216, 216) 
10.
                Range(Cells(Target.Row, "C"), Cells(Target.Row, "N")).Font.Color = RGB(192, 192, 192) 
11.
                Range(Cells(Target.Row, "A"), Cells(Target.Row, "N")).Interior.Color = RGB(192, 192, 192) 
12.
                ..... 
13.
 
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

01.
 
02.
if optionbutton1.value = true 
03.
        Range("D15").Value="text" 
04.
endif 
05.
 
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
Mitglied: bastla
02.08.2010 um 16:53 Uhr
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
Bitte warten ..
Mitglied: xaumichi
02.08.2010 um 17:06 Uhr
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! =)
Bitte warten ..
Mitglied: xaumichi
02.08.2010 um 18:39 Uhr
Hm...irgendwie bekomm ich das nicht hin.... =(
Bitte warten ..
Mitglied: 76109
02.08.2010 um 20:01 Uhr
Hallo xaumichi!

Etwa in der Art:
01.
If Target.Address = "$D$15" Then .... 
02.
'oder sowas? 
03.
If Target.Address = "$D$15" And Range("D15") <> "" Then ....
Gruß Dieter
Bitte warten ..
Mitglied: bastla
02.08.2010 um 20:08 Uhr
Hallo xaumichi!

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

Denn wenn B15 einen Wert hat, dann darf/muss man etwas in die Spalte D schreiben können!
Bitte warten ..
Mitglied: bastla
02.08.2010 um 20:27 Uhr
... 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
Bitte warten ..
Mitglied: xaumichi
02.08.2010 um 20:58 Uhr
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
Bitte warten ..
Mitglied: xaumichi
03.08.2010 um 10:00 Uhr
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:

01.
if UserForm1.OptionButton1.Value = True then 
02.
   UserForm1.Hide 
03.
   Worksheets("Tabelle3").Range("D15") = "Möglichkeit1" 
04.
end if 
05.
 
06.
if UserForm1.OptionButton2.Value = True then 
07.
   UserForm1.Hide 
08.
   Worksheets("Tabelle3").Range("D15") = "Möglichkeit2" 
09.
end if 
10.
 
11.
usw. 
12.
 
Wie könnte ich dies verallgemeinern, sodass das Programm für alle 36 Zeilen geht?

01.
ActiveSheet.cells(Target.Row, "D") = "Möglichkeit1"


funktioniert nicht. (Laufzeitfehler! Objekt wählen)

LG Mike
Bitte warten ..
Mitglied: 76109
03.08.2010 um 12:52 Uhr
Zitat von xaumichi:
Wie könnte ich dies verallgemeinern, sodass das Programm für alle 36 Zeilen geht?
Wie, wer, wo, was 36 Zeilen?
01.
ActiveSheet.cells(Target.Row, "D") = "Möglichkeit1"
funktioniert nicht. (Laufzeitfehler! Objekt wählen)
Dann laß das ActiveSheet weg, nur:
01.
Cells(Target.Row, "D") = "Möglichkeit1" 


Gruß Dieter
Bitte warten ..
Mitglied: xaumichi
03.08.2010 um 13:06 Uhr
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"
Bitte warten ..
Mitglied: 76109
03.08.2010 um 16:27 Uhr
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.:
01.
'UserForm 
02.
 
03.
Option Explicit 
04.
 
05.
Sub SetTarget(ByRef Target) 
06.
    Show 
07.
 
08.
    If OptionButton1 = True Then 
09.
        Cells(Target.Row, "D")  = "Möglichkeit1" 
10.
    ElseIf OptionButton2 = True 
11.
       Cells(Target.Row, "D")  = "Möglichkeit2" 
12.
    ElseIf.... 
13.
        ...            
14.
    End If     
15.
 
16.
    Unload Me 
17.
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:
01.
'UserForm 
02.
 
03.
Option Explicit 
04.
 
05.
Funktion GetString() As String 
06.
    Show 
07.
    If OptionButton1 = True Then 
08.
        GetString = "Möglichkeit1" 
09.
    ElseIf OptionButton2 = True 
10.
        GetString = "Möglichkeit2" 
11.
    ElseIf.... 
12.
        ...            
13.
    End If 
14.
     
15.
    Unload Me 
16.
End Function
Aufruf z.B.: Text = UserForm1.GetString

Gruß Dieter
Bitte warten ..
Mitglied: xaumichi
11.08.2010, aktualisiert 18.10.2012
Hallo!

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

Es geht um das selbe Programm, bei dem Im Thread <url>http://www.administrator.de/forum/vba-verweise-erstellen-148450.html" schon sehr oft geholfen wurde!

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.

01.
 
02.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
03.
 
04.
 
05.
 
06.
If Target.Row > 1 Then 'keine aktion bei klick auf Überschrift 
07.
    If Cells(Target.Row, 1).Value <> "" Then 'keine Aktion bei klick auf leerzelle 
08.
       Cancel = True 
09.
                    
10.
            Select Case Target.Column 
11.
            Case 9 'Spalte I Anzeigen 
12.
                Sheets(Cells(Target.Row, 1).Value).Visible = True 
13.
                Sheets(Cells(Target.Row, 1).Value).Activate 
14.
                                 
15.
            Case 10  'Spalte J Blatt drucken 
16.
                Sheets(Cells(Target.Row, 1).Value).Visible = True 
17.
                Sheets(Cells(Target.Row, 1).Value).PrintOut 
18.
                Sheets(Cells(Target.Row, 1).Value).Visible = False 
19.
                 
20.
            Case 11 'Blatt löschen 
21.
             
22.
                Sheets(Cells(Target.Row, 1).Value).Visible = True 
23.
                Sheets(Cells(Target.Row, 1).Value).Delete 
24.
                                 
25.
            Case Else 
26.
        End Select 
27.
    End If 
28.
End If 
29.
End Sub 
30.
 
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

01.
 
02.
'Tabellenblatt "Mitarbeiter" 
03.
'--------------------------------------- 
04.
 
05.
 
06.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
07.
 
08.
 
09.
 
10.
If Target.Row > 1 Then 'keine aktion bei klick auf Überschrift 
11.
    If Cells(Target.Row, 1).Value <> "" Then 'keine Aktion bei klick auf leerzelle 
12.
       Cancel = True 
13.
                    
14.
            Select Case Target.Column 
15.
            Case 9 'Spalte I Anzeigen 
16.
                Sheets(Cells(Target.Row, 1).Value).Visible = True 
17.
                Sheets(Cells(Target.Row, 1).Value).Activate 
18.
                                 
19.
            Case 10  'Spalte J Blatt drucken 
20.
                Sheets(Cells(Target.Row, 1).Value).Visible = True 
21.
                Sheets(Cells(Target.Row, 1).Value).PrintOut 
22.
                Sheets(Cells(Target.Row, 1).Value).Visible = False 
23.
                 
24.
            Case 11 'Blatt löschen 
25.
            
26.
            Dim zulöschen As String 
27.
 
28.
                zulöschen = Cells(Target.Row, 1).Value 
29.
                UserForm3.Show 
30.
                                 
31.
            Case Else 
32.
        End Select 
33.
    End If 
34.
End If 
35.
End Sub
01.
 
02.
'Userform3 
03.
'-------------------------------- 
04.
 
05.
Private Sub CommandButton1_Click() 
06.
 
07.
                Sheets(zulöschen).Delete 
08.
                            
09.
                    With Sheets("Mitarbeiter") 
10.
                        .Range("E1:H30").Locked = False 
11.
                        .Range(Cells(Target.Row, 1), Cells(Target.Row, "H")).ClearContents 
12.
                        .Range("E1:H30").Locked = True 
13.
                        .Sort 
14.
                        .SetRange Range("A2:K21") 
15.
                        .Header = xlNo 
16.
                        .MatchCase = False 
17.
                        .Orientation = xlTopToBottom 
18.
                        .SortMethod = xlPinYin 
19.
                        .Apply 
20.
                    End With 
21.
End Sub 
22.
 

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
Bitte warten ..
Mitglied: 76109
11.08.2010 um 12:00 Uhr
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
Bitte warten ..
Mitglied: xaumichi
11.08.2010 um 12:29 Uhr
Hm....ich packs nicht!

Ich habe jetzt:

01.
 
02.
Sub SetTarget(ByRef Target) 
03.
    Show 
04.
                zulöschen = sheets(cells(Target.Row, 1).Value) 
05.
    Unload Me 
06.
End Sub 
07.
 
würde das so stimmen?

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

LG Mike
Bitte warten ..
Mitglied: 76109
11.08.2010 um 13:14 Uhr
Hallo Mike!

Bevor ich mir das eigentliche Problem noch anschaue, einen Hinweis zum Sort vorweg:
Das hier:
01.
                    With Sheets("Mitarbeiter") 
02.
                        .Range("E1:H30").Locked = False 
03.
                        .Range(Cells(Target.Row, 1), Cells(Target.Row, "H")).ClearContents 
04.
                        .Range("E1:H30").Locked = True 
05.
                        .Sort 
06.
                        .SetRange Range("A2:K21") 
07.
                        .Header = xlNo 
08.
                        .MatchCase = False 
09.
                        .Orientation = xlTopToBottom 
10.
                        .SortMethod = xlPinYin 
11.
                        .Apply 
12.
                    End With
muss so lauten
01.
                    With Sheets("Mitarbeiter") 
02.
                        .Range("E1:H30").Locked = False 
03.
                        .Range(Cells(Target.Row, 1), Cells(Target.Row, "H")).ClearContents 
04.
                        .Range("E1:H30").Locked = True 
05.
                         With .Sort 
06.
                            .SetRange Range("A2:K21") 
07.
                            .Header = xlNo 
08.
                            .MatchCase = False 
09.
                            .Orientation = xlTopToBottom 
10.
                            .SortMethod = xlPinYin 
11.
                            .Apply 
12.
                        End With 
13.
                    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
Bitte warten ..
Mitglied: xaumichi
11.08.2010 um 14:11 Uhr
Hm...okey, hab ich gemacht! würde für eine bessere Übersicht helfen, ja!

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

LG Mike
Bitte warten ..
Mitglied: 76109
11.08.2010 um 15:02 Uhr
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 Wortabgrenzung

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
Bitte warten ..
Mitglied: 76109
11.08.2010 um 15:05 Uhr
Hallo Mike!

So sollte es funktionieren:
01.
'Sheet Mitarbeiter 
02.
 
03.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
04.
    If Target.Row > 1 Then 'keine aktion bei klick auf Überschrift 
05.
        If Cells(Target.Row, 1) <> "" Then 'keine Aktion bei klick auf leerzelle 
06.
           Cancel = True 
07.
                        
08.
           With Sheets(Cells(Target.Row, "A").Value) 
09.
                Select Case Target.Column 
10.
                    Case 9 'Spalte I Anzeigen 
11.
                        .Visible = True 
12.
                        .Activate 
13.
                     
14.
                    Case 10  'Spalte J Blatt drucken 
15.
                        .Visible = True 
16.
                        .PrintOut 
17.
                        .Visible = False 
18.
                         
19.
                   Case 11 'Blatt löschen 
20.
                        If UserForm3.Loeschen(Target) = True Then 
21.
                            .Visible = True 
22.
                            .Delete 
23.
                        End If 
24.
                     
25.
                   Case Else 
26.
                End Select 
27.
            End With 
28.
        End If 
29.
    End If 
30.
End Sub
01.
'UserForm3 
02.
 
03.
Dim OK As Boolean 
04.
 
05.
Function Loeschen(ByRef Target) As Boolean 
06.
    Show 
07.
     
08.
    If OK = True Then 
09.
        Range("E1:H30").Locked = False 
10.
        Range(Cells(Target.Row, 1), Cells(Target.Row, "H")).ClearContents 
11.
        Range("E1:H30").Locked = True 
12.
         
13.
        Range("A2:K21").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlNo, MatchCase:=False, _ 
14.
                             Orientation:=xlTopToBottom, SortMethod:=xlPinYin, DataOption1:=xlSortNormal 
15.
        Loeschen = True 
16.
    End If 
17.
End Function 
18.
Private Sub Btn_OK_Click() 
19.
    OK = True:  Unload Me 
20.
End Sub 
21.
 
22.
Private Sub Btn_Cancel_Click() 
23.
    Unload Me 
24.
End Sub
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
Bitte warten ..
Mitglied: xaumichi
11.08.2010 um 15:27 Uhr
Hm! Funktioniert ansich schon ganz gut! Danke.
Nur das mit dem Abbrechen funktioniert noch nicht so wirklich.
Wenn ich Abbrechen klicke, will Excel trotzdem löschen....!

Hab jetzt schon probiert:

01.
 
02.
Privat Sub Btn_Cancel_Click() 
03.
    Userform3.Hide 
04.
   Exit Sub 
05.
End Sub
Hat jedoch so nicht funktioniert...!
Bitte warten ..
Mitglied: 76109
11.08.2010 um 15:46 Uhr
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
Bitte warten ..
Mitglied: xaumichi
11.08.2010 um 15:50 Uhr
Das wollte ich soeben ändern, weil ich selber gerade gemerkt habe, dass das komplet nutzlos ist!

Okey, thx!

[EDIT]

Aaaachso, okey. Jetzt weiß ich das auch!
Bitte warten ..
Mitglied: 76109
11.08.2010 um 16:01 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
VB for Applications
gelöst VBA-Makro verschwindet nach Speichern (5)

Frage von lupi1989 zum Thema VB for Applications ...

VB for Applications
gelöst VBA Text mit Format übertragen und Zeichen ergänzen (11)

Frage von Dau12345 zum Thema VB for Applications ...

VB for Applications
Excel VBA Sortierung von Daten (4)

Frage von easy4breezy zum Thema VB for Applications ...

Microsoft Office
gelöst Excel-Formel oder VBA (7)

Frage von nicki01 zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (27)

Frage von patz223 zum Thema Windows Userverwaltung ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (20)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...