Nach Copy und Paste eines Kontextmenues bleibt dies in der falschen Spalte erhalten
Hallo,
ich sollte mal wieder den Rat eines Excelspezialsten habe! Ich habe eine Excelliste mit VBA für Kontextmenüs
Mein programmierter Syntax:
If Not Intersect(Target, Range("A2:A10")) Is Nothing Then
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="Auswahl 1, Auswahl 2, Auswahl 3, Auswahl 4, Auswahl 5"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If
Die Auswahl findet von Zelle A2 bis A10 statt, das funktioniert auch soweit. Wenn jetzt allerdings jemand die Zelle A2 nach XY kopiert so habe ich die Auswahl dann immer in XY. Auch Excel neu starten hilft nicht!
Gibt es eine Möglichkeit dies zu unterbinden, damit bei einem ausversehentlichem Copy und Paste das Kontextmenü nicht übernommen wird?
Dank euch
Gruß Alex
ich sollte mal wieder den Rat eines Excelspezialsten habe! Ich habe eine Excelliste mit VBA für Kontextmenüs
Mein programmierter Syntax:
If Not Intersect(Target, Range("A2:A10")) Is Nothing Then
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="Auswahl 1, Auswahl 2, Auswahl 3, Auswahl 4, Auswahl 5"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If
Die Auswahl findet von Zelle A2 bis A10 statt, das funktioniert auch soweit. Wenn jetzt allerdings jemand die Zelle A2 nach XY kopiert so habe ich die Auswahl dann immer in XY. Auch Excel neu starten hilft nicht!
Gibt es eine Möglichkeit dies zu unterbinden, damit bei einem ausversehentlichem Copy und Paste das Kontextmenü nicht übernommen wird?
Dank euch
Gruß Alex
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 50010
Url: https://administrator.de/forum/nach-copy-und-paste-eines-kontextmenues-bleibt-dies-in-der-falschen-spalte-erhalten-50010.html
Ausgedruckt am: 06.04.2025 um 16:04 Uhr
4 Kommentare
Neuester Kommentar
Hallo captainchaos666!
Da anscheinend gerade kein Excelspezialst in der Nähe ist, versuch ich's mal ...
Programmtechnisch könntest Du den Rest des Arbeitsblattes überwachen und nach dem Einfügen die Gültigkeitsprüfung wieder entfernen, also etwa:
Inwieweit die Performance darunter leidet, müsstest Du testen.
Ansonsten wäre es vermulich aber sinnvoll, ein "ausversehentliches Copy und Paste" zu erschweren, indem Du möglichst viele Zellen des Arbeitsblattes mit dem Blattschutz vor Veränderungen schützt.
Sollte tatsächlich ein Kopiervorgang nötig sein, müsste dieser per "Inhalte einfügen... / Werte" und Esc abgeschlossen werden - besser wäre es aber vermutlich, anstatt den Inhalt zu kopieren einen Zellbezug einzusetzen (=A5).
Grüße
bastla
Da anscheinend gerade kein Excelspezialst in der Nähe ist, versuch ich's mal ...
Programmtechnisch könntest Du den Rest des Arbeitsblattes überwachen und nach dem Einfügen die Gültigkeitsprüfung wieder entfernen, also etwa:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A2:A10")) Is Nothing Then
Target.Validation.Delete
End If
End Sub
Ansonsten wäre es vermulich aber sinnvoll, ein "ausversehentliches Copy und Paste" zu erschweren, indem Du möglichst viele Zellen des Arbeitsblattes mit dem Blattschutz vor Veränderungen schützt.
Sollte tatsächlich ein Kopiervorgang nötig sein, müsste dieser per "Inhalte einfügen... / Werte" und Esc abgeschlossen werden - besser wäre es aber vermutlich, anstatt den Inhalt zu kopieren einen Zellbezug einzusetzen (=A5).
Grüße
bastla
Hallo captainchaos666!
Wenn Du mehrere Bereiche hast, in denen eine Gültigkeitsprüfung erlaubt sein soll, musst Du diese einzeln beim Ändern überprüfen (so kann sehr wahrscheinlich - Einschränkung siehe unten - keine unerwünschte Zelle ein "Kontextmenü" erhalten):
Der Schalter "bDel" steht für "Gültigkeitskontrolle löschen" und wird zunächst auf "True" gesetzt.
Mit der "Intersect"-Funktion wird eine "Überschneidung" von Zellbereichen überprüft - im konkreten Fall der geänderten Zelle(n) ("Target") und des angegebenen Bereiches "A2:A10" etc. Liegt die geänderte Zelle nicht im überprüften Bereich, gibt die Funktion den Wert "Nothing" zurück. "Not Intersect ..." bedeutet dann also: "liegt nicht nicht im Testbereich", ist also eine Zelle des Bereiches, und daher ist ein Löschen nicht erforderlich - Schalter "bDel" auf "False" setzen.
Wenn nach Überprüfung aller von Dir festgelegten Bereiche der Schalter "bDel" immer noch auf "True" steht, liegt die geänderte Zelle also in keinem dieser Bereiche und die Gültigkeitsprüfung kann mit "Target.Validation.Delete" gelöscht werden.
Zu beachten wäre vielleicht noch, dass auch mehrere Zellen als "Target" aufscheinen können (zB eine Zelle wird kopiert und in einen vorher markierten Bereich aus mehreren Zellen eingefügt) - dann gilt: wenn auch nur eine Zelle des Zielbereiches im Testbereich liegt, wird bei keiner Zelle die Gültigkeitskontrolle entfernt (und natürlich auch dann nicht, wenn von einem Testbereich in einen anderen Testbereich kopiert wird).
Zur Ergänzung: Im zuerst geposteten Code war die Vorgangsweise umgekehrt: Wenn die veränderte Zelle nicht im Bereich "A2:A10" liegt, Gültigkeitsprüfung löschen.
Schließlich zum Ereignis "Worksheet_Change": Dieses wird ausgelöst, wenn sich der Inhalt (nicht zB das Ergebnis einer enthaltenen Formel oder die Formatierung) von Zellen ändert (auch zB gelöscht wird).
Noch zur Frage des Löschens beim Öffnen: Im Prinzip könntest Du auch einfach für alle Zellen die Gültigkeitsprüfung entfernen, da diese beim Auswählen einer Zelle ohnehin auch jetzt schon gelöscht und wieder neu zugeordnet wird - allerdings hättest Du damit noch nicht die (relative) Sicherheit für den "laufenden Betrieb".
Grüße
bastla
Wenn Du mehrere Bereiche hast, in denen eine Gültigkeitsprüfung erlaubt sein soll, musst Du diese einzeln beim Ändern überprüfen (so kann sehr wahrscheinlich - Einschränkung siehe unten - keine unerwünschte Zelle ein "Kontextmenü" erhalten):
Private Sub Worksheet_Change(ByVal Target As Range)
bDel = True 'Löschen, außer geänderte Zelle ist in den folgenden Bereichen
If Not Intersect(Target, Range("A2:A10")) Is Nothing Then bDel = False 'nicht löschen
If Not Intersect(Target, Range("B2:B5")) Is Nothing Then bDel = False 'nicht löschen
...
If bDel Then Target.Validation.Delete 'Schalter steht nocht auf "True", daher löschen
End Sub
Mit der "Intersect"-Funktion wird eine "Überschneidung" von Zellbereichen überprüft - im konkreten Fall der geänderten Zelle(n) ("Target") und des angegebenen Bereiches "A2:A10" etc. Liegt die geänderte Zelle nicht im überprüften Bereich, gibt die Funktion den Wert "Nothing" zurück. "Not Intersect ..." bedeutet dann also: "liegt nicht nicht im Testbereich", ist also eine Zelle des Bereiches, und daher ist ein Löschen nicht erforderlich - Schalter "bDel" auf "False" setzen.
Wenn nach Überprüfung aller von Dir festgelegten Bereiche der Schalter "bDel" immer noch auf "True" steht, liegt die geänderte Zelle also in keinem dieser Bereiche und die Gültigkeitsprüfung kann mit "Target.Validation.Delete" gelöscht werden.
Zu beachten wäre vielleicht noch, dass auch mehrere Zellen als "Target" aufscheinen können (zB eine Zelle wird kopiert und in einen vorher markierten Bereich aus mehreren Zellen eingefügt) - dann gilt: wenn auch nur eine Zelle des Zielbereiches im Testbereich liegt, wird bei keiner Zelle die Gültigkeitskontrolle entfernt (und natürlich auch dann nicht, wenn von einem Testbereich in einen anderen Testbereich kopiert wird).
Zur Ergänzung: Im zuerst geposteten Code war die Vorgangsweise umgekehrt: Wenn die veränderte Zelle nicht im Bereich "A2:A10" liegt, Gültigkeitsprüfung löschen.
Schließlich zum Ereignis "Worksheet_Change": Dieses wird ausgelöst, wenn sich der Inhalt (nicht zB das Ergebnis einer enthaltenen Formel oder die Formatierung) von Zellen ändert (auch zB gelöscht wird).
Noch zur Frage des Löschens beim Öffnen: Im Prinzip könntest Du auch einfach für alle Zellen die Gültigkeitsprüfung entfernen, da diese beim Auswählen einer Zelle ohnehin auch jetzt schon gelöscht und wieder neu zugeordnet wird - allerdings hättest Du damit noch nicht die (relative) Sicherheit für den "laufenden Betrieb".
Grüße
bastla