Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Makro beim verlassen einer Zelle ausführen

241 views
Skip to first unread message

Helmut Gütschow

unread,
Jun 25, 2009, 10:39:00 AM6/25/09
to
Hallo,

ich m�chte beim verlassen bestimmer Zellen, hier Spalte A und E ein
Makro ausf�hren bzw. zwei verschiedene, je Spalte:

Verlassen von $A$X Makro1
Verlassen von $E$X Makro2

Worksheet_SelectionChange(ByVal Target As Range) wird ja auch beim
aktivieren einer Zelle ausgef�hrt, da h�nge ich fest.

--

MfG

Andreas Killer

unread,
Jun 25, 2009, 10:53:08 AM6/25/09
to
Helmut G锟絫schow schrieb:

> ich m锟絚hte beim verlassen bestimmer Zellen, hier Spalte A und E ein
> Makro ausf锟絟ren bzw. zwei verschiedene, je Spalte:
...


> Worksheet_SelectionChange(ByVal Target As Range) wird ja auch beim

> aktivieren einer Zelle ausgef锟絟rt, da h锟絥ge ich fest.
Du musst Dir nur am Ende von SelectionChange merken welches Target da
锟絙ergeben wurde, sprich die letzte Zelle war (LastCell). Und beim
锟絝fnen der Mappe merkst Du Dir ActiveCell in LastCell.

Andreas.

Private LastCell As Range

Private Sub Workbook_Open()
Set LastCell = ActiveCell
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _
ByVal Target As Range)
'Tabelle gew锟絟lt?
If TypeOf Sh Is Worksheet Then
'Ist es die gew锟絥schte?
If Sh.Name <> "Tabelle1" Then Exit Sub
'Safety first!
If Not LastCell Is Nothing Then
'Welche Spalte?
Select Case LastCell.Column
Case 1, 5
'Spalte A oder E verlassen
MsgBox LastCell.Address
End Select
End If
'Mach irgendwas
Set LastCell = Target
End If
End Sub

Melanie Breden

unread,
Jun 25, 2009, 11:55:55 AM6/25/09
to

Hallo Helmut,

""Helmut G�tschow"" schrieb:

verwende das Change-Ereignis, hier ein Beispiel:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngBereich As Range
Dim rngCell As Range

Set rngBereich = Range("A:A,E:E")

' Verlasse Prozedur, wenn Bereich nicht �bereinstimmt
If Intersect(Target, rngBereich) Is Nothing Then Exit Sub

' Alle ge�nderten Zellen durchlaufen
For Each rngCell In Target.Cells
MsgBox rngCell.Address
Next rngCell
End Sub

Mit freundlichen Gr�ssen
Melanie Breden

--
- Microsoft MVP f�r Excel -
www.melanie-breden.de

Ribbon-Programmierung f�r Office 2007 http://tinyurl.com/59awla

Helmut Gütschow

unread,
Jun 25, 2009, 12:06:00 PM6/25/09
to
Am 25.06.09 haute andreas.killer auf die Tasten

Hallo Andreas!

> Du musst Dir nur am Ende von SelectionChange merken welches Target

> da �bergeben wurde, sprich die letzte Zelle war (LastCell). Und
> beim �ffnen der Mappe merkst Du Dir ActiveCell in LastCell.

Besten Dank, das war der entscheidene Hinweis.
--

MfG

Helmut Gütschow

unread,
Jun 26, 2009, 11:17:00 AM6/26/09
to
Am 25.06.09 haute Melanie.Breden auf die Tasten

Hallo Melanie!

> verwende das Change-Ereignis, hier ein Beispiel:

Besten Dank, funktioniert. Es gef�llt mir sogar besser, weil Makros
nur bei einer �nderung der festgelegten Zelle ausgef�hrt werden und
das wollte ich eigentlich.

Noch eine Frage zur Schleife:

For Each rngCell In Target.Cells
MsgBox rngCell.Address
Next rngCell

Die kann ich doch sparen, oder? Ich habe es jetzt so f�r mich
abge�ndert:


If Intersect(Target, rngBereich) Is Nothing Then Exit Sub

If Target.Column = 1 Then
Makro_1
ElseIf Target.Column = 5 Then
Makro_2
Endif

Und es funktioniert wie ich wollte, ist das ok. Oder habe ich etwas
�bersehen.


--

MfG

Melanie Breden

unread,
Jun 26, 2009, 12:52:13 PM6/26/09
to

Hallo Helmut,

""Helmut G�tschow"" schrieb:


> Noch eine Frage zur Schleife:
>
> For Each rngCell In Target.Cells
> MsgBox rngCell.Address
> Next rngCell
>
> Die kann ich doch sparen, oder? Ich habe es jetzt so f�r mich
> abge�ndert:
>
> If Intersect(Target, rngBereich) Is Nothing Then Exit Sub
> If Target.Column = 1 Then
> Makro_1
> ElseIf Target.Column = 5 Then
> Makro_2
> Endif

mit der Pr�fung auf Target.Column wird nur die erste Zelle im ge�nderten Bereich angesprochen.
Die restlichen Zellen k�nnen auch au�erhalb der gepr�ften Spalte sein.

Target referenziert auf den gesamten ge�nderten Bereich.
Wenn dieser aus mehreren Zellen besteht, kann eine �nderung von Target
zu Fehlern f�hren.

Man kann die Prozedur auch noch verbessern, indem man bei �nderung mehrerer
Zellen einen Verweis auf die Zellen setzt, die im tats�chlichen Bereich liegen:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngBereich As Range
Dim rngCell As Range

Set rngBereich = Range("A:A,E:E")

If Intersect(Target, rngBereich) Is Nothing Then Exit Sub

Set rngBereich = Intersect(Target, rngBereich)

' Alle ge�nderten Zellen durchlaufen

For Each rngCell In Target.Cells

Select Case rngCell.Column
Case 1
Application.EnableEvents = False
rngCell.Value = 4
Application.EnableEvents = True
Case 5
Application.EnableEvents = False
rngCell.Value = 6
Application.EnableEvents = True
End Select
Next rngCell
End Sub

�ndern zum testen mal einige Werte mit VBA:
Range("A1:E1").Value = 1
und lass deine und meine Prozedur jeweils dr�berlaufen.

' Deine Sub


Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngBereich As Range

Set rngBereich = Range("A:A,E:E")

If Target.Column = 1 Then
Application.EnableEvents = False
Target.Value = 4
Application.EnableEvents = True


ElseIf Target.Column = 5 Then

Application.EnableEvents = False
Target.Value = 6
Application.EnableEvents = True
End If
End Sub

Mit deiner Routine werden alle Zellen ge�ndert, mit meiner nur die im
gew�nschten Bereich und auch je nach Spalte.

Helmut Gütschow

unread,
Jun 27, 2009, 11:49:00 AM6/27/09
to
Am 26.06.09 haute Melanie.Breden auf die Tasten

Hallo Melanie!

> mit der Pr�fung auf Target.Column wird nur die erste Zelle im


> ge�nderten Bereich angesprochen. Die restlichen Zellen k�nnen auch
> au�erhalb der gepr�ften Spalte sein.

Danke f�r die ausf�hrliche Erkl�rung. Ich sehe aber, nach oben hin ist
alles offen;-)

--

MfG

0 new messages