captainchaos666
Goto Top

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

Content-Key: 50010

Url: https://administrator.de/contentid/50010

Printed on: April 24, 2024 at 04:04 o'clock

Member: bastla
bastla Jan 28, 2007 at 10:21:11 (UTC)
Goto Top
Hallo captainchaos666!

Da anscheinend gerade kein Excelspezialst in der Nähe ist, versuch ich's mal ... face-wink

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
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
Member: captainchaos666
captainchaos666 Jan 28, 2007 at 11:51:18 (UTC)
Goto Top
Hallo bastla,
Danke für dein Antwort, bei einer Auswahl funktioniert es. Ich habe allerdings mehrere Kontextmenüs welche voneinander abhängig sind. Gibt es keine Möglichkeit beim öffnen der Datei die falsch platzierten Kontextmenüs zu entfernen.

Kannst du mir noch genauer erklären was du mit deinem Syntax genau machst, ich bin wirklich kein Excelspezialist!

Danke

Alex
Member: bastla
bastla Jan 28, 2007 at 14:05:24 (UTC)
Goto Top
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):

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
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
Member: captainchaos666
captainchaos666 Feb 11, 2007 at 13:34:52 (UTC)
Goto Top
Hallo bastla,
Danke noch für deine Antwort, er funktioniert. Konnte leider den Thread bisher nicht als glöst markieren, da ich normal nur am WE Internetfähig bin!

Gruß Alex