AW: Zugriff auf`s Makro von allen Blättern
01.06.2007 09:31:00
allen
Hi Torsten,
und dann hast du noch vergessen, dass das Ereignisprozedur im Tabellenblatt Sheet_Change() heißt im Modul DieseArbeitsmappe aber Workbook_SheetChange().
Da sind doch im Codefenster oben links und rechts je ein Auswahlfeld, damit kannst du dir den Prozedurrumpf "zusammenklicken".
Prozeduren, die in der ganzen Mappe gültig sein sollen, sollten in einem "normalen" Modul (Modul1 heißt der erst einmal) gesetzt werden. Allerding haben wir hier Ereignisprozeduren, und die müssen ins entsprechende Modul der Tabelle oder eben in "DieseArbeitsmappe".
nochmal der Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Intersect(Target, Sh.Range("C3:AG74")) Is Nothing Then Exit Sub
On Error GoTo setevent
Application.EnableEvents = False
MsgBox "ok"
Dim F As Integer
Dim S As Integer
Dim N As Integer
Dim x As Integer
Dim y As Integer
Dim z As String
Dim z1 As String
Dim inhalt As String
Dim row As Integer
Dim erg
x = Target.row
y = Target.Column
With Sh
For row = 3 To 74 Step 2
If IsEmpty(.Cells(0 + row, y).Value) Then _
inhalt = .Cells(1 + row, y).Value _
Else inhalt = .Cells(0 + row, y).Value
inhalt = UCase(inhalt)
Select Case inhalt
Case "F"
F = F + 1
Case "FZ"
F = F + 1
Case "F/RE"
F = F + 1
Case "S"
S = S + 1
Case "SZ"
S = S + 1
Case "S/RE"
S = S + 1
Case "N"
N = N + 1
Case "NZ"
N = N + 1
Case "N/RE"
N = N + 1
End Select
Next row
.Cells(75, y).Value = F
.Cells(76, y).Value = S
.Cells(77, y).Value = N
F = 0
S = 0
N = 0
For row = 3 To 74 Step 2
erg = 0
Select Case .Cells(0 + row, 1)
Case "Gerhartz": erg = 1
Case "Poluschkin": erg = 1
Case "Späth": erg = 1
End Select
If erg = 1 Then GoTo weiter:
If IsEmpty(.Cells(0 + row, y).Value) Then _
inhalt = .Cells(1 + row, y).Value _
Else inhalt = .Cells(0 + row, y).Value
inhalt = UCase(inhalt)
Select Case inhalt
Case "F"
F = F + 1
Case "FZ"
F = F + 1
Case "F/RE"
F = F + 1
Case "S"
S = S + 1
Case "SZ"
S = S + 1
Case "S/RE"
S = S + 1
Case "N"
N = N + 1
Case "NZ"
N = N + 1
Case "N/RE"
N = N + 1
End Select
weiter:
Next row
.Cells(81, y).Value = F
.Cells(82, y).Value = S
.Cells(83, y).Value = N
F = 0
S = 0
N = 0
End With
setevent:
If Err.Number > 0 Then MsgBox Err.Description, vbCritical, "Fehler " & Err.Number
Application.EnableEvents = True
End Sub
Fall du den Befehl Application.EnableEvents = False nicht kennst, er schaltet die Ereignisprozeduren ab. Denn in deiner Prozedur werden wieder Zellen geändert, was zu einem (rekursiven und höchstwahrscheinlich überflüssigen) Aufruf deines Codes führt. Durch (vorübergehendes!) Abschalten der Events verhindert man dies. Und damit bei einem Fehler die Events (Ereignisprozeduren) wieder aktiviert werden, steht da noch On Error Goto... oben im Code.
Gruß Matthias