Discussion:
Mit Strg+Mausklick "x" eintragen
(zu alt für eine Antwort)
Peter Schuerer
2015-06-22 16:21:38 UTC
Permalink
Hallo Zusammen,
XL2002

mit folgendem Makro können durch Mausklick, im Bereich "D5:R114" "x"
eingetragen oder entfernt werden.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
If Intersect(Target, Range("D5:R114")) Is Nothing Then Exit Sub
Target = IIf(Target = "x", "", "x")
End Sub

Aus Sicherheitsgründen wird jetzt gewünscht das diese Aktion nur beim
gleichzeitigen drücken der Taste "Strg"+Mausklick ausgeführt wird.
Es wurde schon mehrmals aus versehen in diesen Bereich geklickt und
danach wusste keiner mehr wo und ob ein "x" gesetzt oder gelöscht wurde.
Hoffe auf Hilfe.

Danke und Gruß
Peter
Claus Busch
2015-06-22 16:44:44 UTC
Permalink
Hallo Peter,
Post by Peter Schuerer
Aus Sicherheitsgründen wird jetzt gewünscht das diese Aktion nur beim
gleichzeitigen drücken der Taste "Strg"+Mausklick ausgeführt wird.
Es wurde schon mehrmals aus versehen in diesen Bereich geklickt und
danach wusste keiner mehr wo und ob ein "x" gesetzt oder gelöscht wurde.
SendKeys sind nicht zuverlässig und sollten vermieden werden. Auch sehe
ich keine Möglichkeit SendKey mit Mausklick zu kombinieren.
Wäre es eine Möglichkeit, das Ganze mit Rechtsklick zu tätigen?
Probiere es mal so:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As
Boolean)
If Intersect(Target, Range("D5:R114")) Is Nothing Then Exit Sub
Target = IIf(Target = "x", "", "x")
Cancel = True
End Sub

Du könntest statt Rechtsklick auch Doppelklick nehmen.
Sonst müsste man mal sehen, wie man das unbeabsichtigte Löschen
verhindern kann:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Intersect(Target, Range("D5:R114")) Is Nothing Then Exit Sub

Dim Antwort As Integer

If Target = "" Then
Target = "x"
Else
Antwort = MsgBox("Soll x gelöscht werden?", vbOKCancel +
vbExclamation)
End If
If Antwort = vbOK Then Target = ""
End Sub


Mit freundlichen Grüßen
Claus
--
Vista Ultimate / Windows7
Office 2007 Ultimate / 2010 Professional
Peter Schuerer
2015-06-24 16:19:59 UTC
Permalink
Hallo Claus,
Post by Claus Busch
Wäre es eine Möglichkeit, das Ganze mit Rechtsklick zu tätigen?
Ja, das wäre sogar noch besser als eine Taste+Mauskombination. Hoffe das
es so akzeptiert wird. Mir gefällt es und ich kann überzeugen.

Danke und Gruß
Peter
Ulrich Möller
2015-06-22 20:45:17 UTC
Permalink
Post by Peter Schuerer
Hallo Zusammen,
XL2002
mit folgendem Makro können durch Mausklick, im Bereich "D5:R114" "x"
eingetragen oder entfernt werden.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
If Intersect(Target, Range("D5:R114")) Is Nothing Then Exit Sub
Target = IIf(Target = "x", "", "x")
End Sub
Aus Sicherheitsgründen wird jetzt gewünscht das diese Aktion nur beim
gleichzeitigen drücken der Taste "Strg"+Mausklick ausgeführt wird.
Es wurde schon mehrmals aus versehen in diesen Bereich geklickt und
danach wusste keiner mehr wo und ob ein "x" gesetzt oder gelöscht wurde.
Hoffe auf Hilfe.
Danke und Gruß
Peter
Hallo Peter,

mit Windows API Funktion GetKeyState() kann man abfragen, ob eine Taste
gedrückt wurde.
Hier mal zum ausprobieren:

Private Declare Function GetKeyState Lib "user32" ( _
ByVal nVirtKey As Long) As Integer

Private Const VK_LCONTROL = &HA2 ' linke STRG-Taste
Private Const VK_RCONTROL = &HA3 ' rechte STRG-Taste

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
If Intersect(Target, Range("D5:R114")) Is Nothing Then Exit Sub
Debug.Print CBool(GetKeyState(VK_LCONTROL) And &H8000)
Target = IIf(Target = "x", "", "x")
End Sub

"Debug.Print" dann ein einfache durch die gewünschte IF Konstruktion
ersetzen. Alternativ können auch Shift und Alt abgefragt werden. Um
andere Interaktionen zu vermeiden, würde ich vielleicht anstatt der
STRG-Taste die ALT-Taste nehmen.

Ulrich
Peter Schuerer
2015-06-24 16:24:55 UTC
Permalink
Hallo Ulrich,
Post by Ulrich Möller
Debug.Print CBool(GetKeyState(VK_LCONTROL) And &H8000)
Target = IIf(Target = "x", "", "x")
End Sub
"Debug.Print" dann ein einfache durch die gewünschte IF Konstruktion
ersetzen.
Ich kriegs nicht hin. Egal wie ich die IF Konstruktion einfüge immer
wird "CBool" als Fehler angezeigt.
Wie genau füge ich die IF Konstruktion ein?
Wie geschrieben, ich verwende Excel 2002.

Danke und Gruß
Peter
Ulrich Möller
2015-06-24 16:56:25 UTC
Permalink
Post by Peter Schuerer
Hallo Ulrich,
Post by Ulrich Möller
Debug.Print CBool(GetKeyState(VK_LCONTROL) And &H8000)
Target = IIf(Target = "x", "", "x")
End Sub
"Debug.Print" dann ein einfache durch die gewünschte IF Konstruktion
ersetzen.
Ich kriegs nicht hin. Egal wie ich die IF Konstruktion einfüge immer
wird "CBool" als Fehler angezeigt.
Wie genau füge ich die IF Konstruktion ein?
Wie geschrieben, ich verwende Excel 2002.
Danke und Gruß
Peter
Hier nochmal das komplette Beispiel:

Private Declare Function GetKeyState Lib "user32" ( _
ByVal nVirtKey As Long) As Integer

Private Const VK_LCONTROL = &HA2 ' linke STRG-Taste
Private Const VK_RCONTROL = &HA3 ' rechte STRG-Taste
Private Const VK_CONTROL = &H11 ' beide STRG-Tasten

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
If Intersect(Target, Range("D5:R114")) Is Nothing Then
Exit Sub
ElseIf GetKeyState(VK_CONTROL) And &H8000 Then
Target = IIf(Target = "x", "", "x")
End If
End Sub

Ich habe im Beispiel jetzt VK_CONTROL genommen, damitwerden beide STRG
Tasten abgefragt. Wenn lieber die ALT-Taste oder eine Shift Taste
geüwnscht wird, muß man die entsprechenden Konstanten ergänzen und dann
anstelle von VK_CONTROL verwenden.

Ulrich
Peter Schuerer
2015-06-24 17:40:52 UTC
Permalink
Hallo Ulrich,
Post by Peter Schuerer
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
If Intersect(Target, Range("D5:R114")) Is Nothing Then
Exit Sub
ElseIf GetKeyState(VK_CONTROL) And &H8000 Then
Target = IIf(Target = "x", "", "x")
End If
End Sub
Dieses "CBool" ist jetzt weg. Wofür brauchte man es und wieso jetzt
nicht mehr?
Makro teste ich morgen.

Danke und Gruß
Peter
Ulrich Möller
2015-06-24 17:53:24 UTC
Permalink
Post by Peter Schuerer
Hallo Ulrich,
Post by Peter Schuerer
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
If Intersect(Target, Range("D5:R114")) Is Nothing Then
Exit Sub
ElseIf GetKeyState(VK_CONTROL) And &H8000 Then
Target = IIf(Target = "x", "", "x")
End If
End Sub
Dieses "CBool" ist jetzt weg. Wofür brauchte man es und wieso jetzt
nicht mehr?
Makro teste ich morgen.
Danke und Gruß
Peter
"CBool()" wird benutzt, um einen Wert explizit in einen Booleschen Wert
zu konvertieren. Zusammen mit dem Debug-Befehl wird dann einfach "Wahr"
oder "Falsch" im Direktfenster angezeigt.
Den Debug-Befehl selber benutzt man zu Kontrollausgaben und kann sich so
im Direktfenster während des Programmablaufs z.B. Variablenwerte
ausgeben lassen. Auf den eigentlichen Programmablauf hat das keinen
Einfluß und kann damit auch weggelassen werden.

Ulrich

Lesen Sie weiter auf narkive:
Loading...