Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Inhalt der aktivierten Zelle bestimmen
#1
Hallo VBA-Freunde,

ich sitze wieder einmal vor einem VBA-Problem und komme nicht weiter.

Mein Ziel:

Ich will die Zelle, deren Wert ich gerade geändert habe einfärben.

Diesen Code habe ich mal gefunden. Er färbt leider die Zielzelle, in die ich mit Enter / Return gesprungen bin.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim X As Integer
Dim Y As Integer

X = ActiveCell.Row
Y = ActiveCell.Column

'If ActiveCell.Value = "" Then Exit Sub

MsgBox (Y)
MsgBox (X)

Cells(X, Y).Select

    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.599993896298105
        .PatternTintAndShade = 0
    End With
   

End Sub


Ich will aber die Ausgangszelle gefärbt haben. Und wenn die beim aktivieren leer war soll nicht gefärbt werden.

Wie müsste der richtige Befehl lauten?

Vielen Dank für eure Antworten.

Heinz
Es ist nicht genug, zu wissen. Man muss es auch anwenden.
Es ist nicht genug, zu wollen. Man muss es auch tun.
Antworten Top
#2
Hallo Heinz,

dafür gibt es Target.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim X As Integer
Dim Y As Integer

X = ActiveCell.Row
Y = ActiveCell.Column

'If ActiveCell.Value = "" Then Exit Sub

MsgBox (Y)
MsgBox (X)

Cells(X, Y).Select

    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.599993896298105
        .PatternTintAndShade = 0
    End With
  

End Sub
Gruß Stefan
Win 10 / Office 2016
Antworten Top
#3
Hallo Stefan,

das Problem ist folgendes:

Wenn ich die Zelle nach der Eingabe verlasse ist Taget die Zielzelle.

Beispiel: Die B10 wird mit dem Wert 15 gefüllt. Wenn ich die B10 mit Tab verlasse wird die C10
gefärbt und nicht wie gewünscht die B10.

Beim Verlassen mit Return wird die B11 gefärbt.

Ich möchte aber immer die geänderte Zelle einfärben. Ich komme einfach nicht drauf, wie ich die 
Ausgangszelle wieder bekomme.

Gruß Heinz
Es ist nicht genug, zu wissen. Man muss es auch anwenden.
Es ist nicht genug, zu wollen. Man muss es auch tun.
Antworten Top
#4
Das geht - mangels dieser nötigen Erinnerung von Excel - nur mit einer entsprechend mitgeführten globalen Variablen (oder einer Zelle oder einem Namen, bezogen auf Zelle).

Die Erinnerung liegt nämlich beim händischen Arbeiten in der Zwischenablage.
Antworten Top
#5
Hi LCohen,

und wie könnte ich diese globale Variable einrichten?


Gruß Heinz
Es ist nicht genug, zu wissen. Man muss es auch anwenden.
Es ist nicht genug, zu wollen. Man muss es auch tun.
Antworten Top
#6
Da würde ich die VBA-ler fragen. Vielleicht schütteln die aber wegen meines anfängerhaften Vorschlages den Kopf.

Aber: Außer der Undo-Zwischenablage (mittels der man Strg-Z machen kann) hat Excel nun mal kein "Handlungsgedächtnis". Könnte man aus ihr separat die vorige Cursorposition auslesen, wäre alles geritzt. Vorhanden ist diese Info auf jeden Fall.
Antworten Top
#7
Hallo Heinz,

(04.12.2020, 19:13)Heinz Ulm schrieb: Beispiel: Die B10 wird mit dem Wert 15 gefüllt. Wenn ich die B10 mit Tab verlasse wird die C10
gefärbt und nicht wie gewünscht die B10.

Beim Verlassen mit Return wird die B11 gefärbt.

Kann ich nicht feststellen. Wegen dem Code versuche es mal so

Code:
Private rngZelle As Range

Private Sub Worksheet_Change(ByVal Target As Range)
Dim X As Integer
Dim Y As Integer

If Not rngZelle Is Nothing Then rngZelle.Interior.ThemeColor = xlNone
Set rngZelle = Target
X = Target.Row
Y = Target.Column

'If ActiveCell.Value = "" Then Exit Sub

MsgBox (Y)
MsgBox (X)

'Cells(X, Y).Select

    With Target.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.599993896298105
        .PatternTintAndShade = 0
    End With
  

End Sub
Gruß Stefan
Win 10 / Office 2016
Antworten Top
#8
Hallöchen,

der letzte Code von Stefan sollte passen. Der Punkt ist der Unterschied zwischen Target und ActiveCell mit Abschluss der Aktion. Dazu gehört eben je nach Option auch das Aktivieren einer Zelle. Nur wenn "Markierung nach Drücken der Eingabetaste verschieben" deaktiviert ist und die Aktion mit ENTER abgeschlossen wird, ist bei Change beides gleich.

Wenn man mal testen will, was passiert und vielleicht auch in welcher Reihenfolge die Ereignisse wirken, kann man sich mal ein paar Makros zusammenstellen, z.B.

Code:
Private Sub Worksheet_Calculate()
MsgBox "Calculate"
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "Change Target: " & Target.Address & vbTab & "Active:" & ActiveCell.Address
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "SelectionChange: " & Target.Address & vbTab & "Active:" & ActiveCell.Address
End Sub

Da sieht man z.B. auch, dass unerwarteterweise bei der oben erwähnten Deaktivierung der Option ... das SelectionChange ausgeführt wird, obwohl man die Zelle gar nicht verlässt Sad

Das von LCohen erwähnte Merken von Adressen ist vor allem interessant, wenn man wissen will, woher man beim SelectionChange kommt. Dazu müsste man ein min. zwei Stellen die Adresse der aktiven Zelle aufnehmen. Wenn man das in einer Variable speichert, müsste man ggf. beachten, dass sich die Variable zuweilen leert, z.B., wenn mal eine Codausführung über Ausführen | Zurücksetzen im VBA-Editor beendet wird.

1)
Im WorkBook_Open, wenn Du die Adresse beim Speichern nicht irgendwo abgelegt hast. Dazu müsstest Du ggf. beim Öffnen kurz das betreffende Blatt aktivieren.

Code:
Option Explicit

Private Sub Workbook_Open()
Dim strSheet As String
Application.ScreenUpdating = False
strSheet = ActiveSheet.Name
Sheets("Tabelle1").Activate
strMeineZelle = ActiveCell.Address
strSheet.Activate
Application.ScreenUpdating = True
End Sub

2)
Im SelectionChange auf dem Blatt

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "SelectionChange.vorher: " & strMeineZelle & "jetzt: " & ActiveCell.Address
'Variable neu setzen
strMeineZelle = ActiveCell.Address
End Sub

und dazu natürlich die Variable in einem Modul deklarieren

Public strMeineZelle As String
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#9
Bei mir reicht ein simples
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    With Target.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.599993896298105
        .PatternTintAndShade = 0
    End With
End Sub
Habe ich dabei etwas übersehen?
Schöne Grüße
Berni
Antworten Top
#10
Hi Berni,

nö, hast Du nicht. Haben Stefan in seiner zweiten Antwort und ich im oberen Teil meiner Antwort auch schon geschrieben Smile
Mein unterer Teil hat einen anderen Hintergrund. Damit bin ich auf den Hinweis von LCohen eingegangen.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste