Excel Zelladresse speichern, abrufen

Fritz50

Stammgast
Hallo zusammen,
Da habe ich folgendes Problem. Wenn ich eine neue Zelle selektiere, möchte ich in der alten Zelle noch den Hintergrund zurücksetzen. Damit ich auf die alte Zelle zugreifen kann, muss ich die Zelladresse zuvor gespeichert haben. Das ist dann bei jeder Selektion so.
Ich mache das mit folgender Codesequenz (in Sub Worksheet_BeforeDoubleClick):

Set cPosold = Cells(2, 6) 'irgendeine Position für den ersten DblKlick, viell. im Range damit nicht leer
Set cPosnew = Cells

cPosnew = ActiveCell.Address ' neue Zelladresse sichern (wird alte Selektion)

Range(cPosold).Select ' alte Zelle selektieren/aktivieren, dann bearbeiten

Range(cPosnew).Select 'neue Zelle selektieren/aktivieren, dann bearbeiten

cPosold = cPosnew ' aktuelle Zelladresse sichern für nächsten Umgang

jetzt bekomme ich bei "Range(cPosold).Select" die Fehlermeldung "Methode 'Range' für das Objekt '_Workshett' fehlgeschlagen.

Beim Starten der Applikation ist cPosold wohl nicht initialisiert. Dann muss cPosold static sein, weil ja erst nach den nächsten DblClick gebraucht.
Wie löse ich das? Wo und wie ist cPosold deklariert/definiert. Alles läuft über die Tabelle, kein Formular, keine Buttons.

Bei Zellen finde ich keinen lostFocus oder ähnliches.

Danke

Freundliche Grüsse
Fritz
 

nochEinAndreas

Stammgast
Hallo Fritz,

ich habe das mal so gelöst:
Du brauchst eine globale Variable. Die definierst du in einem Standard-Modul:
Code:
Option Explicit

Public alterBereich As Object

In Codebereich von "DieseArbeitsmappe" belegst du die Variable bei Öffnen der Mappe mit der aktuellen Auswahl:

Code:
Option Explicit

Private Sub Workbook_Open()
    Set alterBereich = Selection
End Sub

Und in den Codebereich des Tabellenblatts kommt das hier:

Code:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    alterBereich.Interior.Pattern = xlNone
    Set alterBereich = Target
End Sub

Damit löschst du den Hntergrund der aktuelle Auswahl, wenn du die Zelle wechselst. Dann wird die aktuelle Auswahl mit der neuen belegt.

Gruß, Andreas
 

Fritz50

Stammgast
noch Fehlermeldung

Hallo Andreas,
Soweit verstehe ich den Vorschlag einigermassen. Aber ich habe noch eine Fehlermeldung.
Hatte auch eine Fehlermeldung bei "alterBereich.Interior.Pattern = xlNone"

hier mein Code: (Zusatzfrage zur Darstellung: wie bringe ich die Codeteile in diese Fensterform?)

Code:
Option Explicit
'Public alterBereich As Object
 Public alterBereich As Range

Private Sub Workbook_Open()
    Set alterBereich = Range("B6:B6")
'    Set alterBereich = Selection
MsgBox ("AlterBereich vor: " & alterBereich.Address)        ' es kommt keine Anzeige
    alterBereich.Select
End Sub


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    
    Dim cID As Range
    Set cID = Target
MsgBox ("AlterBereich vor: " & alterBereich.Address)        ' Fehler Ojektvariable oder With-Blockvariable nicht festgelegt
MsgBox ("cID: " & cID.Address)
'    alterBereich.Interior.Pattern = xlNone
    Set alterBereich = Target
MsgBox ("AlterBereich nach: " & alterBereich.Address)
    Set cID = Target

'    cID = ActiveCell                                ' Zelladresse sichern
    
'    Range(cID).Select                               ' zrück zur ID

End Sub
Was ist Selection? wo wird Selection etwas zugewiesen?

Danke
Gruss
Fritz
 
Zuletzt bearbeitet von einem Moderator:

nochEinAndreas

Stammgast
Hallo Fritz,

zuerst zu der Frage, wie du hier Code in diese Code-Kästchen bekommst: Das geht mit dem Raute-Symbol oben in der Werkzeugleiste.
Jetzt zu deinem Code. Du hast nicht so ganz genau das gemacht, was ich beschrieben hatte:
Du brauchst eine globale Variable. Die definierst du in einem Standard-Modul:
So wie es aussieht, steht die globale Variable 'Public alterBereich As Range' bei dir im Codebdreich von 'DieseArbeitsmappe', denn direkt darunter steht dein Ereignis-Makro 'Private Sub Workbook_Open()'.
Globale Variable werden nur erkannt, wenn sie in einem Standard-Modul stehen. Also: Einfügen - Modul! Und dann da hinein 'Public alterBereich As Range'.
Übrigens hatte ich nicht 'Range' sondern 'Object' geschrieben, und das aus gutem Grund:
Du fragtest, was 'Selection' ist. Das ist immer das, was gerade ausgewählt ist. Das können nicht nur Zellen sein, sondern auch Formen, Diagrammreihen oder sonst was. Beim Speichern wird auch mit festgehalten, was gerade selektiert ist. Beim Öffnen der Datei wird die globale Variable also mit dieser 'Selection' belegt. Wenn du die Variable also als Range definierst aber es ist gerade eine Form ausgewählt, gibt's einen Fehler.
Die Fehler, die bei dir aufgetreten sind, kommen vermutlich daher, das 'alterBereich' nicht in einem Standard-Modul definiert war und deswegen nicht erkannt wurde.
Also, versuch's noch mal in einem Standard-Modul.

Gruß, Andreas
 

nochEinAndreas

Stammgast
Hallo Fritz,

ich habe eben zufällig gesehen, dass du im Forum "Applikationen" auch nach einer Lösung für das selbe Problem gefragt hast. Das finde ich nicht sehr schön. Wenn du schon solch ein Doppelposting anfängst, dann sag wenigstens in beiden Foren Bescheid, dass du das tust. Und gib auch bitte in beiden Foren Bescheid, dass das Problem gelöst ist. Wenn ich nicht zufällig bei den "Applikationen" reingeschaut hätte, wüsste ich nicht, ob meine Hilfe erfolgreich war.

Gruß, Andreas
 

Fritz50

Stammgast
Hallo

Sorry, ich erinnerte mich nicht mehr an dieses Problem. Damals hatte ich ja die Lösung. Aber es war mir nicht so richtig bewusst, dass nur die Deklarationen in den Modulen wirklich global sind. Bin beim Suchen auch nicht auf diesen Thread gestossen. Ich programmiere auch nicht regelmässig. Danke für deine Unterstützung.

Gruss
Fritz
 
Oben