Hmm..Hmm.. Corina,
(Back to the Future)
der nachstehende Code-Teil (ohne die Einbeziehung der Spalte F) ist nur eine leichte Anpassung aus einer, meiner Tabellen.
Und funktioniert auch auf der von dir "veröffentlichten" Arbeitsmappe.
Den Hinweis bei "Case 6" lass ich einmal so stehen, denn ich habe den Eindruck, die Meinung ...
mit so einem Klassenmodul betreibt Frau quasi "user guidance".
Oder auf deinen Fall bezogen "Kein Risiko – kein Ereignis, daher keine Kategorien". Ergo sollte Löschen eines relevanten Eintrages auch das Entfernen aller sachbezogenen Einträge bewirken. Denn erfahrungsgemäß verliert der Benutzer bei mehr als einem Dutzend Einträgen rasch den Überblick und "vergessene" Spiegelpunkte verfälschen zumindest die Statistik.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
'Shows dropdown entries for reference columns
'
Rem so allgemein wie möglich, daher
Rem die Spalte wo "Validation-Objekt" variabel
Dim clOffset As Long
'
Rem es ändert sich fallweise nur die Formel1 für das o.g. Objekt, daher
Dim strFormula1 As String
'
Rem Mehrfachselektionen durch den Benutzer sind nicht erlaubt, daher
If Target.Count > 1 Then Exit Sub
'
Rem die Titelzeilen sind gesperrt, daher
If Target.row < 6 Then Exit Sub
'
Rem jetzt die Fallunterscheidung nach Spalte
Select Case Target.column
Case 3
strFormula1 = "=Drivers"
Case 5
strFormula1 = "=Category"
Case 6
'consider guidelines of user interface in functional areas:
'like data entry, data display, sequence control, data transmission, and data protection
Exit Sub
Case 10
strFormula1 = "=Organizational_level"
Case Else
Exit Sub
End Select
Rem alle Objekte sind 1 rechts von
clOffset = 1
Rem die Arbeit macht die Funktion und wenns nicht kracht, dann
Rem soll der Benutzer ja die zugehörige Auswahl treffen, denn
Rem die Excel Voreinstellung ist nie zwingend xlToRight
If ChkValidation(Len(Trim(Target.Formula)), Target.Offset(0, clOffset), _
3, 1, 1, strFormula1) Then Target.Offset(0, clOffset).Select
'
End Sub
Private Function ChkValidation(tLen As Long, vCell As Range, _
vlType As XlDVType, vlStyle As XlDVAlertStyle, vlOperator As XlFormatConditionOperator, _
vlFormula1 As Variant, Optional vlFormula2 As Variant) As Boolean
'
On Error GoTo errh
Rem das ist eine Krücke, denn als eierlegende Wollmilchsau !
Rem muss die Funktion ja erkennen ob Objekt existiert
Rem womöglich verbesserungswürdig
If Len(vCell.Validation.Parent) > 0 Then
'
Rem Aha, da ist was - lösche es wenn nichts eingegeben wurde
If tLen = 0 Then
Application.EnableEvents = False
vCell.Validation.Delete
vCell.Formula = vbNullString
'
End If
Rem sonst erzeuge neu
Else
Rem sicherheitshalber, es gibt auch leere Zellen mit Inhalt
If tLen > 0 Then
'
Rem eigentlich unnötig, da bereits gelöscht sein müsste
vCell.Validation.Delete
'
Rem auf ein Neues
vCell.Validation.Add Type:=vlType, AlertStyle:=vlStyle, _
Operator:=vlOperator, Formula1:=vlFormula1, Formula2:=vlFormula2
With vCell.Validation
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.Errormessage = ""
.ShowInput = False
.ShowError = True
End With
End If
End If
'
errh:
Rem wie gesagt, das erzeugte Objekt soll den Fokus erhalten
If Err.number = 0 Then ChkValidation = True
'
Application.EnableEvents = True
End Function
Alle Klarheiten beseitigt ?
|