VBA-Code auf mehrere/alle Tabellenblätter anwenden
#1
Hallo!

Wie kann ich den fürs Tabellenblatt "Tabelle1" hinterlegten (beispielhaften) VBA-Code auch auf weitere Tabellenblätter (zum Beispiel "Tabelle2" und "Tabelle3") anwenden, ohne ihn dort jeweils ebenfalls hinterlegen zu müssen? Optimal wären eine Variante für mehrere bestimmte (explizit anzugebende) und eine weitere für alle Tabellenblätter. Hintergrund ist in erster Linie die Wartbarkeit, Änderungen könnten so zentral an einer Stelle vorgenommen werden.


Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Target, Range("A:Z")) Is Nothing Then
   Target.Value = UCase(Target.Value)
End If
Application.EnableEvents = True
End Sub



.xlsm   Mappe1.xlsm (Größe: 14,01 KB / Downloads: 1)

Gruß
h1138123
Top
#2
Hallo,

nimm das Ereignis im VBA-Modul DieseArbeitsmappe:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
 Dein Code
End Sub
Sieh Dir dazu auch die Select Case - Anweisung in der Hilfe an.

Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • h1138123
Top
#3
Hallo Kuwer!

Variante für mehrere bestimmte (explizit anzugebende) Tabellenblätter:
Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Select Case Sh.Name
    Case "Tabelle1", "Tabelle3"
        Application.EnableEvents = False
        If Not Intersect(Target, Range("A:Z")) Is Nothing Then
            Target.Value = UCase(Target.Value)
        End If
        Application.EnableEvents = True
End Select
End Sub

Variante für alle Tabellenblätter:
Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Target, Range("A:Z")) Is Nothing Then
   Target.Value = UCase(Target.Value)
End If
Application.EnableEvents = True
End Sub

So? Irgendwelche Einwände oder Verbesserungsvorschläge? Ansonsten vielen Dank! Thumbsupsmileyanim

Gruß
h1138123
Top
#4
Hallo,

der Anfang ist schon mal gut, aber da fehlen noch 3 wichtige Sachen:

1. muss Sh nicht zwingend das aktive Blatt sein. Also müssen Bereiche genau referenziert werden.
2. könnte Target auch mehrere Zellen, vielleicht auch noch nicht einmal zusammenhängend, enthalten.
3. könnte irgend ein Fehler zum Abbruch des Codes führen, so dass die Zeile, welche Ereignisse wieder einschaltet, gar nicht ausgeführt wird.

So wäre (hoffentlich) alles abgedeckt:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim rngAlleZellenImBereich As Range
Dim rngTeilbereich As Range
Dim rngEinzelneZelle As Range
Select Case Sh.Name
Case "Tabelle1", "Tabelle3"
Set rngAlleZellenImBereich = Application.Intersect(Target, Sh.Range("A:Z"))
If Not rngAlleZellenImBereich Is Nothing Then
On Error Resume Next
Application.EnableEvents = False
For Each rngTeilbereich In rngAlleZellenImBereich.Areas
For Each rngEinzelneZelle In rngTeilbereich
rngEinzelneZelle.Value = UCase(rngEinzelneZelle.Value)
Next rngEinzelneZelle
Next rngTeilbereich
Application.EnableEvents = True
On Error GoTo 0
End If
End Select
End Sub
Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • h1138123
Top
#5
Moin!
Apropos Einwände und daher nur ergänzend:
Sh.Name bezieht sich auf den Tabellennamen, der jederzeit vom Anwender geändert werden kann und das Makro ins Leere laufen lässt.
Ich würde immer Sh.Codename wählen.
Den Codename (im Projekt-Explorer vor der Klammer) kann man nur in der VBE ändern.
Projekt mit Kennwort sichern, Projekt für die Anzeige sperren und Du bist auf der sicheren Seite.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • h1138123
Top
#6
Hallo Kuwer und RPP63!

Vielen Dank für eure wertvolle Hilfe! Thumbsupsmileyanim

Gruß
h1138123
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste