Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1072to1076
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
Inhaltsverzeichnis

Einfache Ereignisprozedur

Einfache Ereignisprozedur
07.05.2009 16:18:18
MBorn
Hallo,
weiß jemand, warum diese einfache Ereignisprozedur nicht hinhaut?
Dieses Skript befindet sich im Bereich Worksheet

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set Target = Range("A2")
If Target = Nothing Then
Exit Sub
Else
Range("A3") = Now
End If
End Sub


Warum bekomme ich zu "Nothing" die Meldung: "Unzulässige Verwendung eines Ojekts"?
Dank und Gruß,
Born

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Einfache Ereignisprozedur
07.05.2009 16:23:17
Hajo_Zi
Halo Born,
ich würde niemals vom System benutze Variablen benutzen.
Was soll den Dein Makro machen.
Es reicht doch einfach Exit Sub oder noch einfachen kein Code.

AW: Einfache Ereignisprozedur
07.05.2009 16:41:34
Luschi
Hallo Born,
die Fehlerzeile muß so lauten: If Target Is Nothing Then
oder: If Not Target Is Nothing Then
Ansonsten verstehe ich den Sinn dieses Makros nicht. Die Ereignisprozedur 'Worksheet_SelectionChange' übergibt den Parameter Target, in dem der gerade selektierte Range-Bereich steht.
Dann änderst Du diesen Übergabeparameter (was man eigentlich nie machen sollte) auf den Zellbereich 'A3'. Target kann also niemals 'Nothing' sein , sondern zeigt immer auf die Zelle 'A3'; egal, welcher Zellbereich mit der Maus oder Tastatur selektiert wird.
Beschreibe doch mal, was das Ziel dieses Makros sein soll.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Einfache Ereignisprozedur
07.05.2009 16:45:07
Raist10

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target = Range("A2") Then
Exit Sub
Else
Range("A3") = Now
End If
End Sub


So müsste es klappen.
Du bekommst die Fehlermeldung weil Du versuchst ein Objekt das vom System gesetzt ist zu ändern. Verusche nie was an Systemvariabelen zu ändern.
Gruß
Rainer

Danke an Euch. So klappts
07.05.2009 17:02:59
MBorn
Hallo Rainer, Luschi und HaJo,
danke vielmals für die schnelle Hilfe. Ja, so klappt es.
Und wir haben wieder mal was gelernt.
Merci,
Born
Doch noch was...
07.05.2009 17:09:28
MBorn
Na doch noch eine Frage hinterher:
Wenn sich in Zelle A2 was ändert, soll Excel die aktuelle Zeit (Now) in Zelle A3 eintragen.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target = Range("A2") Then
Exit Sub
Else
Range("A3") = Now
End If
End Sub


Macht das nicht wirklich, oder?
Und auch nicht "Target is nothing", oder?
Gruß und Dank,
Born

Anzeige
AW: Doch noch was...
07.05.2009 17:10:31
Hajo_Zi
Halo Born
If Target.address "$A$2") Then
Exit Sub
Else
Range("A3") = Now
End If
Gruß Hajo
AW: Das wars noch nicht...
07.05.2009 17:48:22
MBorn
Hallo Hajo,
nochmals muß ich leider nachfragen:
https://www.herber.de/bbs/user/61677.xls
Genau wie Du es vorgeschlagen hast (und es mir auch einleuchtet), aber
trotzdem funktioniert es nicht. Siehe beigefügte Tabelle.
Ich bin ratlos...
Gruß,
Born
AW: Das wars noch nicht...
07.05.2009 17:54:23
Hajo_Zi
Hallo Born,
man sollte schon das schreiben was vorgeschlagen wurde, bei VBA bescheiden sollte man sich mit Ände4rungen zurückhalten. Es war auch die falsche Aktion.

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address  "$A$2" Then
Exit Sub
Else
Application.EnableEvents = False
Range("A3") = Now
Application.EnableEvents = True
End If
End Sub


Gruß Hajo

Anzeige
AW: Das wars noch nicht...
07.05.2009 19:43:59
Erich
Hi Born,
da sehe ich diese beiden (durchaus unterschiedlichen) Varianten:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("A2"), Target) Is Nothing Then
Application.EnableEvents = False
Range("A3") = Now
Application.EnableEvents = True
End If
End Sub
' ODER (nicht beide gleichzeitig!)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$2" Then
Application.EnableEvents = False
Range("A3") = Now
Application.EnableEvents = True
End If
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Das wars noch nicht...
07.05.2009 20:14:01
MBorn
Hallo Erich, hallo HaJo
danke für die Vorschläge.
Leider funktioniert Deine Version, HaJo nicht, wenn Zelle A2 mit

Sub test()
Range("A2")= 17
End Sub


gefüllt wird. Dann passiert da nixxxxx in Zelle A3.
Erich, ich habe Deinen zweiten Vorschlag eingebaut und konnte ihn gut
gebrauchen.
Herzlichen Dank Euch beiden.
Gruß,
Born

AW: Das wars noch nicht...
07.05.2009 20:28:20
Hajo_Zi
Hallo Born,
bisher war von Eingaben die Rede, nicht von Makro.
Gruß Hajo
Störte da noch etwas anderes?
08.05.2009 00:24:03
Erich
Hi Born,
deine Antwort ist so nicht richtig.
Zwischen Hajos Version und meiner zweiten Variante besteht kaum ein Unterschied,
in meiner zweiten Variante ist der Code nur etwas kürzer aufgeschrieben.
Also: Beide sollten gleichermaßen funktionieren.
Wenn dem nicht so ist, liegt der Fehler an irgend einer anderen Stelle.
@Hajo:
Beide Ereignisprozeduren laufen bei Änderung in A2, bei Eingaben wie auch bei Änderung via Test-Makro.
Ob Makro oder Eingabe ist also gleichgültig.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Einfache Ereignisprozedur
07.05.2009 17:26:21
Luschi
Hallo Rainer,
die Begründung, warum es zu dem Vba-Fehler kommt ist falsch. Target ist keine Systemvariable, sondern ein vom System generierter Übergabeparameter für die Ereignis-Routine.
Natürlich kann man den ändern.
Target ist ein Range-Objekt und muß so geändert werden:
Target.Value = 120, wenn man den Inhalt ändern will oder
Set Target = Activesheet.Range("B25"), wenn man ein neuen Range-Bereich zuordnen will
Will man wissen, ob Target auf einen Zellbereich zeigt, dann so:
If Not (Target Is Nothing) Then
Gruß von Luschi
aus klein-Paris
AW: Einfache Ereignisprozedur
07.05.2009 20:55:38
Raist10
Hi Luschi!
Natürlich hast Du in der Ausführlichkeit recht, ich habe es deutlich salopper formuliert und auch eine Fehlbehauptung drinnen. ;)
Aber was anderes, das hier:
Will man wissen, ob Target auf einen Zellbereich zeigt, dann so:
If Not (Target Is Nothing) Then
kannst mir nochmal bitte genauer erklären. Meiner Auffassung nach zeigt hier Target nicht auf einen Zellbereich, sondern auf den kompletten verfügbaren Zellbereich. Irgendwo fehlt da doch noch die Angabe für welchen Bereich geprüft werden soll ob es die definierte Range ist, so sehe ich gerade nicht wirklich einen Sinn in dem Codestück.
Aber man muß ja auch nicht unbedingt die Not Is Nothing Variante wählen, geht ja auch mit If Intersect(Target, rngBereich) Then ... oder wenn man prüfen will ob nicht Bereich dann If Intersect(Target, rngBereich) Is Nothing Then. Kann mich an die doppelte Verneinung nie so wirklich gewöhnen, nehme da soweit möglich und sinnvoll lieber die einfach Bejahung. Aber sicherlich Geschmackssache.
Gruß
Rainer
Anzeige
Versuch einiger Klärungen
08.05.2009 01:07:38
Erich
Hi zusammen,
@Hajo:
"ich würde niemals vom System benutze Variablen benutzen."
In "Private Sub Worksheet_SelectionChange(ByVal Target As Range)"
ist Target KEINE "vom System benutzte Variable",
sondern eine hier in der Prozedur deklarierte Variable,
die einen (ByVal) übergebenes Bereichsobjekt repräsentiert.
Statt "Target" könnte man ebenso "fizzlipuzzli" schreiben.


Die "Unzulässige Verwendung eines Objekts" findet beim Vergleichsversuch mit
"If Target = Nothing" statt. Objekte können nicht mit "=" verglichen werden.
"If Target Is Nothing" wäre korrekt (wenn auch hier nicht unbedingt sinnvoll...)
(Das hat auch Luschi schon geschrieben.)


@Rainer
"Du bekommst die Fehlermeldung weil Du versuchst, ein Objekt das vom System gesetzt ist zu ändern."
Falsch, siehe oben.
"Versuche nie was an Systemvariabelen zu ändern."
Nein, siehe oben. Hier ist keine Systemvariable.
Zu "If Not (Target Is Nothing) Then"
Damit prüft man, ob die Objektvariable (vom Typ Range) einen Bereich oder Nichts repäsentiert.
In "Worksheet_Change" oder "Worksheet_SelectionChange" wäre das direkt nach dem Aufruf Unfug.
Hier wird immer ein Bereich übergeben.


"zeigt hier Target nicht auf einen Zellbereich, sondern auf den kompletten verfügbaren Zellbereich"
Verstehe ich nicht, das wäre Cells.


"man muß ja auch nicht unbedingt die Not Is Nothing Variante wählen,
geht ja auch mit If Intersect(Target, rngBereich) Then"
Hast du das gestestet?
If Intersect(Target, rngBereich) Then
erzeugt bei mir einen Laufzeitfehler 13 - Typen unverträglich.
Intersect(Target, rngBereich) ist ein Bereich,
in "If XXX Then" muss XXX aber ein Wahrheitswert sein (oder wenigstens in True oder False umwandelbar).
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Sic, das musste mal gesagt wdn, Erich! orT
08.05.2009 05:23:12
Luc:-?
Allerdings lag auch Luschi richtig!
Gruß Luc :-?
AW: Versuch einiger Klärungen
08.05.2009 10:32:26
Raist10
@ Erich
Auch Du hast wie Luschi Recht. ;)
Aber:
In "Worksheet_Change" oder "Worksheet_SelectionChange" wäre das direkt nach dem Aufruf Unfug.
Hier wird immer ein Bereich übergeben.
--------------------------------------------------------------------------------
"zeigt hier Target nicht auf einen Zellbereich, sondern auf den kompletten verfügbaren Zellbereich"
Verstehe ich nicht, das wäre Cells.
genau das meinte ich, direkt nach Aufruf ist die Anweisung unsinnig. Sondern macht nur Sinn wenn vorher ein Bereich zugewiesen wurde. Da Target ja erstmal die Übergabe beinhaltet und wenn es keinen Vergleichsbereich gibt, dann ist es immer ein Treffer egal wo Du klickst oder änderst. Weise ich aber Trarget vorher einen Bereich zu überschreibt man den übergebenen Parameter und die Abklärung ob Ereignis in gewünschten zielbereich liegt ist nicht mehr möglich.
Hast du das gestestet?
If Intersect(Target, rngBereich) Then
erzeugt bei mir einen Laufzeitfehler 13 - Typen unverträglich.
Intersect(Target, rngBereich) ist ein Bereich,
in "If XXX Then" muss XXX aber ein Wahrheitswert sein (oder wenigstens in True oder False umwandelbar).
Hast Recht, hier muß auch die doppelte Verneinung kommen. Wusste doch das es einen Grund hat wieso ich fast ausschließlich mit If intersect(target,rngBereich) is Nothing arbeite. ^^
Aber gut, halte das nächste Mal zur Theorie die Klappe und bleib bei der Praxis. Ihr habt mich überzeugt. *g*
Wobei wenn man es ganz genau nimmt, die Aussage auch nicht 100%ig korrekt ist:
sondern eine hier in der Prozedur deklarierte Variable,
die einen (ByVal) übergebenes Bereichsobjekt repräsentiert.
Im Sinne des Programmes gibt es keine Bereichsobjekt, sondern nur Variabelen des Typus Wert und Variabelen des Typus Verweis. Damit ich auch mal was theoretisch richtiges gesagt habe. *lach*
Aber gut, wieder was gelernt. *memoanmich:beitheoriedieklappehalten*
Gruß
Rainer
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige