Autor
|
Thema: Makro - Tasten deaktivieren (2485 / mal gelesen)
|
Tammy89 Mitglied
Beiträge: 24 Registriert: 28.07.2016 Microsoft Office 2010 Windows 7
|
erstellt am: 21. Sep. 2016 15:27 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe auf einem Sheet ein Blattschutz, lediglich zwei Zellen sind frei. In diesen zwei Zellen darf der User etwas eingeben, allerdings nicht löschen (dies nur über einen Button). Ich habe es mit folgendem Code versucht: Sub Tasten_deaktivieren() 'ENTER deaktivieren Application.OnKey "{Return}", "" 'Entf deaktivieren Application.OnKey "{Clear}", "" End Sub Allerdings kann ich weiterhin mit "Entf" und "ENTER" arbeiten. Kann mir da evtl. jemand helfen? Danke und Gruß Tammy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 21. Sep. 2016 17:28 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
Hallo Tammy, so ganz verstehe ich Dein Problem nicht (vor allem warum Du generell die Löschen- und Entertaste deaktivieren möchtest) aber vielleicht einen Tip wie Du das lösen könntest: Wenn wirklich nur zwei Werte (Zellen) zu ändern sind könntest Du doch einfach eine Maske (Userform) machen in der die WErte verändert werden können, da hast Du dann volle Kontrolle darüber was eingegeben wird, kannst den Wertebereich auch festlegen. Evtl. beschreibst Du ja einmal ausführlicher warum der Zellinhalt nicht gelöscht werden soll, vermutlich beziehen sich ja einige Formeln darauf und der Inhalt muß eine Zahl sein. Warum darf die Eingabetaste (Enter, Return) nicht betätigt werden? Wie soll der Wert denn dann übergeben werden? Tab-taste? Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 21. Sep. 2016 20:13 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
Hi Tammy, definiere in einem Standardmodul eine als Public definierte boolsche Variable (z.B. blnSchalter), die du im Code für den Schalter auf True setzt und benutze das Change-Ereignis, um fehlerhafte Löschungen rückgängig zu machen: Private Sub Worksheet_Change(ByVal Target As Range) If blnSchalter = False Then If Target.Address(False, False) = "A10" Or Target.Address(False, False) = "B10" Then '<== Zelladressen anpassen If Target.Value = "" Then Application.Undo End If Else blnSchalter = False End If End Sub
------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tammy89 Mitglied
Beiträge: 24 Registriert: 28.07.2016 Microsoft Office 2010 Windows 7
|
erstellt am: 22. Sep. 2016 11:58 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, ich habe ein Sheet, in dem Werte ausgewählt werden können (Drop-Down), abhängig von diesen Werten werden Bilder, Informationen usw. angezeigt. In diesem Sheet gibt es einen Button um Werte/Eingaben zu löschen und auch nur mit diesem Button soll das möglich sein. Also wäre das Deaktiveren der "Entf" Taste am wichtigsten, ENTER muss nicht unbedingt sein. Hallo Karin, ich verstehe das nicht so ganz, bin leider noch nicht so geübt in VBA aber was meinst du mit "die du im Code für den Schalter auf True setzt" Bzw. was macht dein Code genau? Wenn ich es richtig verstehe, muss ich der Variable "bInSchalter" die "Entf"-Taste zuweisen, oder? Nur wie? Danke und Gruß Tammy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tammy89 Mitglied
Beiträge: 24 Registriert: 28.07.2016 Microsoft Office 2010 Windows 7
|
erstellt am: 22. Sep. 2016 12:10 <-- editieren / zitieren --> Unities abgeben:
|
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 22. Sep. 2016 12:28 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
|
Tammy89 Mitglied
Beiträge: 24 Registriert: 28.07.2016 Microsoft Office 2010 Windows 7
|
erstellt am: 22. Sep. 2016 12:39 <-- editieren / zitieren --> Unities abgeben:
Also mein Code sieht aktuell so aus: Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("C12")) Is Nothing Then BildWA If Not Intersect(Target, Range("C6")) Is Nothing Then BildWE If blnSchalter = False Then If Target.Address(False, False) = "C6" Or Target.Address(False, False) = "C12" Then '<== Zelladressen anpassen If Target.Value = "" Then Application.Undo End If Else blnSchalter = False End If End Sub Kann aber weiterhin in C6 die "Entf" Taste nutzn, um den Wert zu löschen :-( Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tammy89 Mitglied
Beiträge: 24 Registriert: 28.07.2016 Microsoft Office 2010 Windows 7
|
erstellt am: 22. Sep. 2016 14:16 <-- editieren / zitieren --> Unities abgeben:
Hallo nochmal an alle, ich habe noch eine weitere Idee/Frage, die mir besser gefallen würde. Wenn der User "Entf" drückt, soll eine MsgBox erscheinen, mit zwei Optionen. If "Entf gedrückt" Then 'Hier müsste ich den genauen Befehl wissen AbfrageEntf = MsgBox("Entf darf hier nicht verwendet werden! Löschen Sie Eingaben bitte nur über den entsprechenden Button! Möchten Sie die Eingaben jetzt löschen?", vbYesNo) If AbfrageEntf = vbNo Then Exit Sub Else Clean_Button Vielen Dank für eure Hilfe! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 22. Sep. 2016 18:12 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
Hi Tammy, angenommen es ist ein Formular-Steuerelement, dann sieht der Code im Standardmodul vom Prinzip her so aus: Code: Option Explicit Public blnSchalter As BooleanSub Schaltfläche2_Klicken() blnSchalter = True Range("A10:B10").ClearContents End Sub
------------------ Bis später, Karin [Diese Nachricht wurde von Beverly am 22. Sep. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 22. Sep. 2016 19:55 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
Zitat: Original erstellt von Tammy89: Hallo nochmal an alle,ich habe noch eine weitere Idee/Frage, die mir besser gefallen würde. Wenn der User "Entf" drückt, soll eine MsgBox erscheinen, mit zwei Optionen. If "Entf gedrückt" Then 'Hier müsste ich den genauen Befehl wissen AbfrageEntf = MsgBox("Entf darf hier nicht verwendet werden! Löschen Sie Eingaben bitte nur über den entsprechenden Button! Möchten Sie die Eingaben jetzt löschen?", vbYesNo) If AbfrageEntf = vbNo Then Exit Sub Else Clean_Button
Mit Verlaub, Entweder die Benutzer sind so doof Oder die Benutzer muessen unter allen Umständen Dumm gehalten werden... Solche Anweisungen kenne ich zu genügend, mittels Reguläre Ausdrücke Wird die Usereingabe geprüft... -"Bitte keine Leerzeichen" -"Bitte nicht mehr als 56 Zeichen" und das Makro springt wieder an den Anfang zurück und der Anwender darf sich nochmals an der Eingabe versuchen :-) Dabei wäre ein Replace " " ; "_" und ein Trim auf die erlaubte Zeichen einfach unauffällig und User freundlich. In deinem Fall: If [Entf] then Clean_Button und Ok ist. (ich denke, also bin/will ich) Dieses "Hallo User, willst du wirklich, halte ich zu bevormundend" <Ja, Nein, Vielleicht, Morgen...>
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tammy89 Mitglied
Beiträge: 24 Registriert: 28.07.2016 Microsoft Office 2010 Windows 7
|
erstellt am: 23. Sep. 2016 09:12 <-- editieren / zitieren --> Unities abgeben:
Hallo Thomas, ja, warum einfach wenns auch kompliziert geht. Du hast natürlich Recht, das wäre eine einfachere und auch schönere Lösung. Nur weiß ich leider noch immer nicht, wie ich mit dem Makro auswerte, ob die ENTF Taste gedrückt wurde? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 23. Sep. 2016 09:25 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
|
Tammy89 Mitglied
Beiträge: 24 Registriert: 28.07.2016 Microsoft Office 2010 Windows 7
|
erstellt am: 23. Sep. 2016 11:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Karin, ja habe ich geselen. Alledings habe ich bereits einen Button, der mir die Werte löscht. Jetzt will ich diesen Button aber zusätzlich auch noch ansprechen, wenn die Entf Taste gedrückt wird. Mir fehlt allerdings genau dieser Code, mit dem ich auswerte, ob die Entf Taste gedrückt wird. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 23. Sep. 2016 12:49 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
Und dann kam einer und löschte es per backspace+TAB und der brachte auch noch seinen Kumpel mit, der löschte es per Kontextmenü Ich schließe mich Thomas an.
google mal KeyCode, aber das wirkt imho nicht im sheet, nur über würgarounds. Hätte >> dieses << gefunden und >> damit << dieses gebastelt: Code: Option ExplicitPrivate Declare Function GetAsyncKeyState Lib "user32" ( _ ByVal vKey As Long) As Integer Private Const VK_DEL As Long = 46 Private Sub Worksheet_Change(ByVal Target As Range) If Not GetAsyncKeyState(VK_DEL) = 0 Then _ MsgBox "Laß das!" End Sub
Teste und berichte, denn gelöscht wird dabei trotzdem (noch, kann man ja noch weiter proggen). Und überleg bitte doch nochmal, ob das ganze Theater wirklich zielführend ist, denn eine einfache Bedienungsanleitung sollte ausreichen. Du kannst nicht alle Anwenderfehlbedienung wegprogrammieren, glaub mir ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 23. Sep. 2016 16:06 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
Hi Tammy, du brauchst keinen Code der das abfragt, wenn du genau so vorgehst wie ich geschrieben habe - einen Code für das Worksheet_Change-Ereignis und den anderen für den Schalter. ------------------ Bis später, Karin [Diese Nachricht wurde von Beverly am 23. Sep. 2016 editiert.] [Diese Nachricht wurde von Beverly am 23. Sep. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 23. Sep. 2016 16:12 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
|
Tammy89 Mitglied
Beiträge: 24 Registriert: 28.07.2016 Microsoft Office 2010 Windows 7
|
erstellt am: 23. Sep. 2016 16:47 <-- editieren / zitieren --> Unities abgeben:
Danke für deine Mühe Karin, aber so einfach ist es leider nicht :-( Ich bräuchte den Befehl für das Drücken der Entf-Taste, da ich auch verbunde Zellen habe und da liefert mir der Befehl Target.Value kein brauchbares Ergebnis... Aber wenn es hierfür keine Lösung gibt, muss ich leider damit leben und hoffen, dass sich alle Mitarbeiter an meine Vorgaben halten... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
..... Mitglied
Beiträge: 433 Registriert: 01.07.2011
|
erstellt am: 23. Sep. 2016 17:05 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
|
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 23. Sep. 2016 20:57 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
Verzichte wenn möglich auf verbunden Zellen, die sind nicht wirklich nötig und dienen nur der Verschönerungen:-) Und sie machen ofmals Später Problemen, Wenn man gezielt die Zelle per Formel / Code etc. ansprechen will. @Rübe Copy & Paste vernichtet auch Inhalte :-) Und ja man kann versuchen alles Idiotensicher zu machen, aber es gibt dann auch noch die Narren... die Spielkinder, etc :-) Aber für die muss man auch nix proggen, fliegt es halt um die Ohren ;-) - Ausser man hat viel Lust an der Spielerei
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 24. Sep. 2016 13:43 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
Hi Tammy, verbundene Zellen sind das größte Übel, wenn man mit VBA arbeiten will. Aber auch dafür gibt es Abhilfe: benutze anstelle Target dieses: Target.Cells(1) Ich sehe übrrigens immer noch nicht, weshalb du den Befehl für das Drücken der Taste benötigst, wenn du das erreichen willst, was du ausgangs geschrieben hast: verhindern dass Zellinhalte durch die Entf.-Taste gelöscht werden können - genau das macht der von mit gepostete Vorschlag. ------------------ Bis später, Karin [Diese Nachricht wurde von Beverly am 24. Sep. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 25. Sep. 2016 17:57 <-- editieren / zitieren --> Unities abgeben: Nur für Tammy89
Zitat: Original erstellt von Tammy89: Danke für deine Mühe Karin,aber so einfach ist es leider nicht :-( Ich bräuchte den Befehl für das Drücken der Entf-Taste, da ich auch verbunde Zellen habe und da liefert mir der Befehl Target.Value kein brauchbares Ergebnis... Aber wenn es hierfür keine Lösung gibt, muss ich leider damit leben und hoffen, dass sich alle Mitarbeiter an meine Vorgaben halten...
Verstehe diese Antwort nicht. Du hast doch geschrieben dass das Tabellenblatt ansonsten geschützt ist, somit kommt von Excel schon eine Fehlermeldung dass die Zelle nicht verändert werden kann. Die nicht geschützten Zellen werden mit Karins (Beverlys) Code abgefragt und gut. Bist Du Dir überhaupt sicher dass Excel das richtige Programm für Deine Aufgabe ist? Wenn ich so lese, je nach Drop-Down Auswahl werden Bilder und Infos angezeigt, hört sich das eher nach Datenbank an ... Grüße Klaus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Tammy89 Mitglied
Beiträge: 24 Registriert: 28.07.2016 Microsoft Office 2010 Windows 7
|
erstellt am: 26. Sep. 2016 11:39 <-- editieren / zitieren --> Unities abgeben:
|