Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
872to876
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
872to876
872to876
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Zugriff auf`s Makro von allen Blättern

Zugriff auf`s Makro von allen Blättern
01.06.2007 08:18:31
allen
Hallo, ich mache seit 2 Tagen die ersten Gehversuche mit VBA in Excel und stehe vor folgender Frage.
Wie ist es möglich ein Makro so zu schreiben, dass es aus allen Tabelenblättern heraus automatisch funktioniert. Das Makro wird über Änderungen definierter Zellen gestartet. Es klappt auch prima und ich könnte es jetzt einfach in die restlichen 12 Tabellenblätter kopieren und gut, das möchte ich aber nicht, da der Aufwand bei einer Änderung dann sehr groß wäre.
Habe schon Versuche mit ActiveSheet und Worksheet.select usw. gemacht, es aber noch nicht hinbekommen.
Danke für etwaige Antworten
Gruß
Torsten

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zugriff auf`s Makro von allen Blättern
01.06.2007 08:47:09
allen
Hallo Torsten,
du scheinst das Worksheet_Change-Ereignis zu verwenden (Das Makro wird über Änderungen definierter Zellen gestartet).
In "DieseArbeitsmappe" kannst du das Ereignis Workbook_SheetChange verwenden. Einfach über die beiden Comboboxen über dem Codefenster "zusammenklicken" (links Workbook, rechts SheetChange).
Gruß Matthias

AW: Zugriff auf`s Makro von allen Blättern
01.06.2007 08:54:32
allen
Hallo Matthias,
danke für die schnelle Antwort.
Weiß aber nicht ob mir das weiterhilft. Ich benutze tatsächlich das Ereignis Workbook_SheetChange. Es klappt auch wie gesagt wenn ich das Makro in einem Tabellenblatt ablege. Nur wo muss ich es reintun, damit es für alle Blätter Gültigkeit hat und wie funzt der Aufruf?
Das Makro führt Befehle aus, die dann nur für das aktuelle Tabellenblatt gültig sind.
Deshalb der Ansatz ein allgm. Makro zu schreiben, dass überall funktioniert. Das Makro weiß wo es ist durch den "Target" Befehl. Mein Problem ist nur das starten.
Hier die ersten Zeilen:
Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("C3:AG74")) Is Nothing Then Exit Sub
x = Target.row
y = Target.Column
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)
Gruß
Torsten

Anzeige
AW: Zugriff auf`s Makro von allen Blättern
01.06.2007 09:02:37
allen
Hi Torsten,
in der Workbook_Change-Prozedur gibt es nocht das Argument Sh, welches das betreffende Blatt widergibt, auf dem die Änderung stattgefunden hat.
Soweit du deine Prozedur gepostet hast (sie war leider unvollständig), habe ich das mal umgeschrieben:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Intersect(Target, Sh.Range("C3:AG74")) Is Nothing Then Exit Sub
Dim x As Long, y As Integer
Dim row As Long, inhalt
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
End If
inhalt = UCase(inhalt)
Next row
End With
End Sub


Doch was macht deine Prozedur eigentlich? Eine Schleife ist da wahrscheinlich gar nicht nötig!
Gruß Matthias

Anzeige
AW: Zugriff auf`s Makro von allen Blättern
01.06.2007 09:14:00
allen
Hallo Matthias,
habe es mit Deiner Änderung versucht, allerdings bekomme ich dann eine Fehlermeldung. Hatte nicht die ganze Prozedur gepostet, sondern nur den "aus meiner Sicht" wichtigen Teil.
Jetzt nochmal alles inkl. Deiner Anpassung.
Die Prozedur z.B. in der Tabelle1 abgelegt wird gestartet, allerdings mit der Meldung "Fehler beim Kompilieren. Deklaration der Prozedur entspricht nicht dem der Beschreibung eines Ereignisses oder einer Prozedur mit demselben Namen".
Und nochmal die Grundsätzliche Frage, wo sollten Prozeduren gespeichert werde, die Arbeitsbaltt weit gültig sind? Als Modul, unter "DieseArbeitsmappe"?

Sub Worksheet_Change(ByVal Sh As Object, ByVal Target As Range)
If Intersect(Target, Sh.Range("C3:AG74")) Is Nothing Then Exit Sub
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
x = Target.row
y = Target.Column
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 Sub


Gruß Torsten

Anzeige
AW: Zugriff auf`s Makro von allen Blättern
01.06.2007 09:19:00
allen
Äääh, wer lesen kann ist klar im Vorteil.
Habe noch Teile Deiner Änderung vergessen.
"With Sh" und "End with" habe ich noch dazu geschrieben, ändert aber nichts ander Fehlermeldung und meinem Grundsätzlichen (Start)-Problem
Gruß
Torsten

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

Anzeige
AW: Zugriff auf`s Makro von allen Blättern
01.06.2007 10:52:09
allen
Hallo Matthias,
danke für vielen Hilfen, langsam kapiere ich es mit dem "Zusammenklicken". Wichtig war für mich die Info was wo rein gehört (Ereignisprozedur), konnte trotz längerer Suche dazu nichts finden.
Mal sehen wie weit ich komme.
Gruß
Torsten

AW: Zugriff auf`s Makro von allen Blättern
01.06.2007 11:46:00
allen
Hier noch mein Abschlußdanke an Matthias, für die schnelle und freundliche Hilfe.
Habe es dadurch gelöst.
Gruß
Torsten

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige