Frage von Maskera, 6

Excel Code welcher bei einem Makro Zellen auf "" setzt, wenn eine andere =x ist?

Hallo zusammen, ich habe bei Excel einen Code aus dem Internet kopiert und bearbeitet, bei diesem Code wird sobald ich die Zelle xy1 anklicke ein x darin erscheinen oder weggehen, wenn ich erneut drauf klicke. Ich wollte nun Fragen ob es möglich ist, dass das x verschwindet sobald ich an einem anderen Ort klicke also etwa so: Ich habe den Bereich A1-A5, wenn ich in A1 klicke erscheint dort ein x, sobald ich jetzt in Feld A5 klicke, soll allerdings A1-A4 leer sein und ein x in A5 stehen. Der Code falls es hilft:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Bereich1 Dim Bereich2 Dim Bereich3 Dim Bereich4 Set Bereich1 = Application.Union([B3], [C3], [D3], [E3], [F3], [G3]) Set Bereich2 = Application.Union([B6], [C6], [D6], [E6]) Set Bereich3 = Application.Union([B9], [C9], [D9], [E9]) Set Bereich4 = Application.Union([B12], [C12], [D12]) If Not Intersect(Target, Bereich1) Is Nothing Or _ Not Intersect(Target, Bereich2) Is Nothing Or _ Not Intersect(Target, Bereich3) Is Nothing Or _ Not Intersect(Target, Bereich4) Is Nothing Then

            If Target = "x" Then
                Target = ""
            Else
                Target = "x"
            End If
        End If

End Sub

Vielen Dank für alle Antworten Maskera

Expertenantwort
von Iamiam, Community-Experte für Excel, 4

vielleicht tut´s das (für beliebig viele, hier drei willkürlich definierte Bereiche(auch mehrspaltig, siehe D2:E3), jeder wird hier separat prozessiert:

Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Union(Range("A1:A5"), Range("B1:B5"), Range("D2:E3"))) Is Nothing Then
If Target.Column = 1 Then Range("A1:A5").ClearContents: Target.Value = "X"
If Target.Column = 2 Then Range("B1:B5").ClearContents: Target.Value = "X"
If Target.Column = 4 Or Target.Column = 5 Then Range("D2:E3").ClearContents: Target.Value = "X"
End If
End Sub

Du kannst auch benannte Bereiche verwenden, die Du verschieben kannst, dann musst Du aber die Syntax für Target.column = ..  anpassen, was v.a. für mehrspaltige 
recht kompliziert werden kann

Und die Bereiche dürfen keine Spaltenüberlappung aufweisen, sonst würd´s nochmal komplizierter und Du brauchst eine recht komplizierte zusätzliche Zeilenauswahl (mit entsprechendem Aufwand alles möglich).

PS: ich hab dür die Einzelbereiche die einzeilige if-Variante verwendet, die kein End if braucht

Kommentar von Iamiam ,

da bei Auswahl eines größeren Bereichs in jede Zelle ein x geschrieben würde, hab ich das Target auf Target.cells(1) begrenzt.

SelectionChange(ByVal Target As Range)
If Not Intersect(Target.Cells(1), Union(Range("A1:A5"), Range("B1:B5"), Range("D2:E3"))) Is Nothing Then
If Target.Column = 1 Then Range("A1:A5").ClearContents: Target.cells(1).Value = "X"
If Target.Column = 2 Then Range("B1:B5").ClearContents: Target.cells(1).Value = "X"
If Target.Column = 4 Or Target.Column = 5 Then Range("D2:E3").ClearContents: Target.Cells(1).Value = "X"
End If
End Sub

sollte jetzt narrensicher sein (ohne Garantie!)

Kommentar von Iamiam ,

wieder mal keinerlei Rückmeldung!

Expertenantwort
von Ninombre, Community-Experte für Excel, 5

ich muss gestehen, dass ich den code und die Frage nicht ganz nachvollziehen konnte. Soll nach Deiner Änderung immer ein X gesetzt werden oder soll es auch möglich sein, ein X zu löschen?

Um immer ein X zu setzen sollte es reichen wenn Du vor dem if target="x"... (also dem Teil, der als Code angezeigt wird) einfügst

Range("A1:A5").value="" um den Bereich erstmal zu leeren. Danach entfällt aber auch die weitere Logik, den Zellinhalt zu prüfen.

Kurz wäre es also so möglich:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A5")) Is Nothing Then
Range("A1:A5").Value = ""
Target.Value = "X"
End If
End Sub
Kommentar von Maskera ,

Das wäre schon für meine Wünsche perfekt, wenn man es erweitern kann, also dass nicht nur der Bereich A1-A5 sondern auch B1-B4(aber seperat) inbegriffen ist. Also Wenn zwischen A1 und A5 geklickt wird, wird A1-A5 zuerst gecleart, aber B1-B4 bleibt bestehen wie es ist, ist dies auch möglich?

Danke vielmals

Maskera

Kommentar von Ninombre ,
wenn es bei den beiden Spalten bleibt, geht es ggf so

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A5")) Is Nothing Then
Range("A1:A5").Value = ""
Target.Value = "X"
End If
If Not Intersect(Target, Range("B1:B4")) Is Nothing Then
Range("B1:B4").Value = ""
Target.Value = "X"
End If
End Sub
Kommentar von Iamiam ,

vielleicht ging's auch noch einfacher, aber häng doch einfach die Befehle Blockweise aneinander, also von If not intersect ....end if und dann im zweiten Teil den Bereich anders definieren.

Ich würde sowas normalerweise mit selection machen, aber mit dem Auswählen hättest du ja schon Deinen Click, Du müsstest auf Worksheet:BeforeDoubleclick (oder so ähnlich) ausweichen. Dann gings mit jeder beliebigen Auswahl: Einfache Bereichsmarkierung, das Makro merkt sich den Bereich mit Dim Bereich as range, set Bereich = selection,  if not intersect(Target, selection is nothing, ...Doppelklick auf Einzel-Zelle. Habs aber nicht ausprobiert, nur Idee.

Evtl das beforedoubleclick im selectionchange aufrufen und Targ_2, damit sich nicht was beisst.

Habs nochmal kurz überdacht, geht so wahrscheinlich nicht!

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten