PDA

Vollständige Version anzeigen : Eingabe nur wenn Nachbarzelle <>""


Der_Thomas
10.07.2015, 13:53
Hallo zusammen,

ich bräuchte mal wieder eure Hilfe.

Ich möchte erreichen das man in Spalte D die DropDown-Auswahl (Datenüberprüfung) erst anwählen kann wenn in Spalte C die Personalnummer eingetragen wurde.
Dazu habe ich folgenden Code in der Tabelle
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Sub</span> Worksheet_selectionChange(<span class="TOKEN">ByVal</span> Target <span class="TOKEN">As</span> Excel.Range)
<span class="TOKEN">If</span> Target.Row &lt; 46 <span class="TOKEN">Or</span> Target.Row &gt; 666 <span class="TOKEN">Then</span> <span class="TOKEN">Exit Sub</span>
<span class="TOKEN">If</span> Target.Column &lt;&gt; 1 <span class="TOKEN">And</span> Cells(Target.Row, 3) = &quot;&quot; <span class="TOKEN">Then</span>
MsgBox &quot;Zuerst die Personalnummer eintragen&quot;
Application.EnableEvents = <span class="TOKEN">False</span>
Cells(Target.Row + 0, 3).Select
Application.EnableEvents = <span class="TOKEN">True</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Funktioniert auch ansatzweise.
Nur geht die MsgBox auch auf wenn ich eine Zelle in Spalte C anklicke.
Kann mir jemand sagen wo mein Fehler liegt?

Hajo_Zi
10.07.2015, 14:00
Halo Thomas,

Du siehst es falsch in jeder Zelle außer Spalte A. im Bereich Zeile < 46 und Zeile >666.
Da Du dies im Code festgelegt hast.
If Target.Column <> 1

würde ich mal vermuten. Ich habe es nicht getestet.

<img src="http://Hajo-Excel.de/images/grusz1.gif" align="middle" height="40" alt="Grußformel"><a href="http://Hajo-Excel.de/index.htm"><img border="0" src="http://Hajo-Excel.de/images/logo_hajo3.gif" align="middle" height="40" alt="Homepage"></a>

RPP63neu
10.07.2015, 14:09
Hallo!
Nimm anstatt <>1 besser =4
Du brauchst hier kein .EnableEvents zu setzen!
Etwas überarbeitet:
Private Sub Worksheet_selectionChange(ByVal Target As Excel.Range)
With Target
If .Row > 45 And .Row < 667 And .Column = 4 And .Offset(0, -1) = "" Then
MsgBox "Zuerst die Personalnummer eintragen"
.Offset(0, -1).Select
End If
End With
End Sub
Gruß Ralf

Der_Thomas
10.07.2015, 14:17
Hallo,

vielen Dank für schnellen Antworten und Lösungsvorschläge.

Ralfs Code habe ich eingefügt, läuft genau so wie ich mir das gewünscht hatte.

Bis ich soweit bin muss ich wohl noch´n bissl üben ;)

Schönes Wochenende

EarlFred
10.07.2015, 14:38
Hallo,

Du brauchst hier kein .EnableEvents zu setzen!
dem stimme ich nicht zu: Das Ereignis ruft sich sonst selbst auf, was zwar in dem Fall nicht "dramatisch" ist, aber dennoch sinnlos.

Es gibt noch ein paar Sonderfälle, die Du beachten solltest:
- Der Nutzer könnte auch eine Zelle in Spalte A auswählen.
- Der Nutzer kann auch mehrere Zellen gleichzeitig auswählen.

Probier mal:
Private Sub Worksheet_selectionChange(ByVal Target As Excel.Range)
Dim blnFehelnderEintrag As Boolean
If Not Intersect(Target, Range("D46:D666")) Is Nothing Then
For Each c In Intersect(Target, Range("D46:D666"))
If Cells(c.Row, 3) = "" Then
blnFehelnderEintrag = True
Exit For
End If
Next c
If blnFehelnderEintrag Then
MsgBox "Zuerst die Personalnummer eintragen"
Application.EnableEvents = False
Cells(c.Row, 3).Select
Application.EnableEvents = True
End If
End If
End Sub

Grüße
EarlFred

RPP63neu
10.07.2015, 14:49
Hi!
Zudem kann man mit dem Code die Spalte A nicht mehr auswählen
Wie wahr, wie wahr, EarlFred!
Ich hatte auch zunächst einen anderen Code geschrieben, der JEDE and-Bedingung seperat per If ... End if prüft.
Auch wenn es scheinbar unübersichtlich aussieht, ist es im Sinne eines korrekten und schnellen Programmablaufs besser.
Wollte dann pimpen, ging aber wie gezeigt in die Hose!
"Richtig" wäre folgendes:
Private Sub Worksheet_selectionChange(ByVal Target As Excel.Range)
With Target
If .Column = 4 Then
If .Row < 667 Then
If .Row > 45 Then
If .Offset(0, -1) = "" Then
MsgBox "Zuerst die Personalnummer eintragen"
.Offset(0, -1).Select
End If
End If
End If
End If
End With
End Sub
Dann ist auch das .EnableEvents überflüssig, weil die Prüfung beim ersten Schritt aussteigt.

Gruß Ralf

xlph
10.07.2015, 15:11
@ RPP63neu,

ist immer noch unzureichend.

Markier mal D45:D46.

RPP63neu
10.07.2015, 15:25
Ja, xlph, ist heute nicht mein Tag ...
*LockerNachschieb*:
If .Count >1 Then Exit Sub
(alternativ zusätzlich ein Verschieben des Cursors in eine unverdächtige Zelle nebst MsgBox)
Aber: eine For - Each - Schleife halte ich bei einem _SelectionChange für kontraproduktiv.

Gruß Ralf

EarlFred
10.07.2015, 15:29
Hi Ralf,

If .Count >1 Then Exit Sub
d. h., der gerade aufwändig programmierte "Schutzmechanismus" wird programmatisch umgangen? Och nö!

Aber: eine For - Each - Schleife halte ich bei einem _SelectionChange für kontraproduktiv.
Warum? Die sind eigentlich nur aus Performancegründen kontraproduktiv, vor allem beim Hetzen auf Ranges - dann aber auch immer und nicht nur hier. Aber irgendwann ist bei mir Schluss mit Lust auf Umsetzung von solchen recht sinnfreien Aufgaben. Ich würde das eher mit Gültigkeitsprüfung regeln oder Userform (aber keinesfalls mit MsgBoxen, die man immer wegklicken muss - Nervfaktor 100!).

Dann ist auch das .EnableEvents überflüssig, weil die Prüfung beim ersten Schritt aussteigt.

...dennoch ein "sinnloser" (An|Durch)lauf. Einfach Events "disablen" und gut ist.

Aber mach erstmal Wochenende und genieß die Sonne!

Grüße
EarlFred

Der_Thomas
13.07.2015, 09:45
Moin,

nochmals danke für die nachgebesserten Lösungen.
Den Code von Ralph aus Beitrag #6 habe ich eingepflegt.
Die Zeilen oberhalb 46 sind eh alle gesperrt und die User haben keine ausreichende Excel-Kenntniss um dies zu umgehen.

Ab Beitrag #8 habt ihr mich geistig abgehängt :( iss aber ok.