Mal wieder: Dienstplan

26/02/2009 - 16:35 von Ralf Brinkmann | Report spam
Hallo, liebe Formelexperten!

Ich muss meinen mit Eurer Hilfe vor einigen Jahren geschaffenen
Dienstplan (Excel 2003) àndern und benötige deshalb mal wieder Eure
Hilfe, damit ich alles richtig mache und gleich ein paar Verbesserungen
einfließen lasse.

1.) Formatierungen aus anderem Tabellenblatt übernehmen:
=
Ich habe zwölf Tabellenblàtter "Januar" bis "Dezember" und dazu ein
Blatt "Personal".

Ich hàtte gerne, dass bei Eintrag eines Namens in einem der
Tabellenblàtter in "Personal" nachgeguckt wird, ob dieser Name dort
auftaucht und wie er formatiert ist (Schriftfarbe, Hintergrund) und dann
diese Formatierung übernimmt.

Für ein anderes Projekt hatten wir mal sowas hier entwickelt, das
innerhalb eines Blattes funktionierte und einfach "oben" nachguckte:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As
Range)
Set Target = Intersect(Range("F13:F378,H13:H378,N13:N378,P13:P378"),
Target)
If Not Target Is Nothing Then
Dim rngName As Range
On Error Resume Next
Set rngName = Range("C4:C9").Find(Target.Value)
On Error GoTo 0
On Error GoTo ErrorHandler
Application.EnableEvents = False
If Not rngName Is Nothing Then
rngName.Copy Target
Else
Target.ClearFormats
End If
End If
ErrorHandler:
Application.EnableEvents = True
End Sub

Kann man das irgendwie so umwandeln, dass ich das nicht in den
Codebereich jedes einzelnen Blattes eintragen muss, sondern dass das für
die ganze Mappe von "Januar" bis "Dezember" gilt, aber nicht für
"Personal" (da soll ja nachgeschaut werden)? Ist das überhaupt sinnvoll?

2.) Zellen gegen unbeabsichtigtes Löschen schützen:
==
Für eine bedingte Formatierung mit mehr als 4 Bedingungen hatten wir
damals sowas hier entworfen:

Option Explicit
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
Dim Zelle As Range
For Each Zelle In Sh.Range("B4:BK4")
Select Case Zelle.Value
Case "A"
Zelle.Interior.ColorIndex = 50 'Grün
Case "B"
Zelle.Interior.ColorIndex = 6 'Gelb
Case "C"
Zelle.Interior.ColorIndex = 3 'Rot
Case "D"
Zelle.Interior.ColorIndex = 41 'Blau
Case "E"
Zelle.Interior.ColorIndex = 1 'Schwarz
Zelle.Font.ColorIndex = 2 'Weiß
Case Else
Zelle.Interior.ColorIndex = xlNone 'keine
End Select
Next
ErrorHandler:
Application.ScreenUpdating = True
End Sub

Damit kann an aber den normalen Dokumentenschutz nicht anwenden, weil
dann die Aktualisierung nicht klappt. Damit nun niemand versehentlich
Formeln löscht, hatten wir das Makro

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal
Target As Range)
Dim Adresse
'Zelle "B3" darf selektiert werden
If Target.Address = "$B$3" Then Exit Sub

Application.EnableEvents = False
'Zeilen 1 bis 4 sind verboten
If Target.Row <= 4 _
Or Target.Row >= 60 Then
If Adresse = "" Then _
[B3].Select Else Range(Adresse).Select
Else: Adresse = Target.Address
End If
Application.EnableEvents = True
End Sub

dazugeschrieben. Das hat sich aber im Laufe der Zeit als eher hinderlich
erwiesen. Gibt es eine andere Möglichkeit, dass Anwender zwar frei im
Tabellenblatt herumwandern, aber dennoch bestimmte Zellen nicht löschen
oder veràndern können? Zur Not soll der Cursor bei dem Versuch, eine
"verbotene" Zelle zu betreten, einfach da stehenbleiben wo er ist.

Ich hoffe, dieses lange Posting schreckt Euch jetzt nicht ab und Ihr
könnte mir Programmier-Analphabet helfen.

Herzlichen Dank im voraus.

Gruß, Ralf
Windows XP Home SP3
Opera 10.00-1285
 

Lesen sie die antworten

#1 Alexander Wolff
26/02/2009 - 17:18 | Warnen spam
Die Tastatur von Ralf Brinkmann wurde wie folgt gedrückt:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As
Range)
Set Target = Intersect(Range("F13:F378,H13:H378,N13:N378,P13:P378"),
Target)

Kann man das irgendwie so umwandeln, dass ich das nicht in den
Codebereich jedes einzelnen Blattes eintragen muss, sondern dass das
für die ganze Mappe von "Januar" bis "Dezember" gilt, aber nicht für
"Personal" (da soll ja nachgeschaut werden)? Ist das überhaupt
sinnvoll?



Das steht doch (als Workbook_SheetChange) schon in "Diese Arbeitsmappe",
nicht im einzelnen Blatt. Das erstere Argument nun làßt Dich "Personal"
einfach ausschließen:

If Sh.Name <> "Personal" Then ...

(ohne Gewàhr, bin nicht so der VBA-Fuchs; vielleicht kommen ja noch
Kommentare/Einwànde)

2.) Zellen gegen unbeabsichtigtes Löschen schützen:
==>
dazugeschrieben. Das hat sich aber im Laufe der Zeit als eher
hinderlich erwiesen. Gibt es eine andere Möglichkeit, dass Anwender
zwar frei im Tabellenblatt herumwandern, aber dennoch bestimmte
Zellen nicht löschen oder veràndern können? Zur Not soll der Cursor
bei dem Versuch, eine "verbotene" Zelle zu betreten, einfach da
stehenbleiben wo er ist.



Vielleicht hilft

If Not Target.Locked Then ...

(Dafür müsste das Blatt geschützte und ungeschützte Zellen haben, jedoch
ohne aktivierten Blattschutz sein.)
Moin+Gruss Alexander - MVP for MS Excel - www.xxcl.de - mso2000sp3 --7-2

Ähnliche fragen