Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
936to940
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
936to940
936to940
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

VBA aktivieren bei Änderung in mehreren Zellen

VBA aktivieren bei Änderung in mehreren Zellen
30.12.2007 03:46:00
Richard
Hallo liebe XL Freunde
Ich habe folgendes VBA:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address  "$M$12" Then Exit Sub
Dim r As Range
For Each r In ActiveSheet.Range("20:58").Rows
If r.Cells(16) = 0 Then r.EntireRow.Hidden = True
If r.Cells(16) = 1 Then r.EntireRow.Hidden = False
Next r
End Sub


Welches hervorangend funktioniert, nur möchte ich, dass das VBA sich nicht nur bei Änderungen im Feld M12 aktiviert sondern auch bei Änderungen in den Zellen M7, M12, M13, M14, M15 und M16.
Wahrscheinlich wird es nur ne sehr kleiner Änderungen sein, aber meine VBA Kenntnisse sind noch sehr bescheiden.
Vielen Dank im Voraus für eure Unterstützung!!
Frohes neues Jahr,
Daniel.

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Das sieht man,...
30.12.2007 04:51:00
Luc:-?
...aber trotzdem schon recht ordentlich, Daniel... ;-)
Die Dim-Anweisung steht immer als Erste nach der Kopfzeile! Dann folgt hier die Zeile, _ die die Grundvoraussetzungen überprüft und auf Folgendes zu ändern ist...

With ActiveSheet
If Not Intersect(Target, .Cells(7, 13), .Range("M12:M16")) Then Exit Sub
For Each r In .Range("20:58").Rows
Next r
End With


Die With-Konstruktion spart hier die mehrfache Wiederholung von ActiveSheet. Außerdem lässt sich das Ganze auch schneller ändern, falls du die Ereignisprozedur (eine VBA-Subroutine, so wäre die richtige Bezeichnung!) mal in mehreren Blättern des ActiveWorkbook anwenden willst und sie deshalb in das Dokument-(Klassen-)modul der Arbeitsmappe verlegst (With sh!).
Ganz komplett wäre das Ganze, wenn du zuletzt noch die Objektvariable Target wieder freigibst (mit Set Target = Nothing). Die Objektvariable r "repräsentiert" nach Zyklusdurchlauf ohnehin Nichts. Da du das auch bei Nichterfüllung der Anfangsbedingung tun solltest, wäre statt Exit Sub entweder ein Sprung zu diesem letzten Befehl (mit Marke, z.B. GoTo ex und ex: am Anfang dieser letzten Zeile) oder die entsprechende Ausweitung der If...Then- zu einer If...Then...Else...-Konstruktion angebracht.
Übrigens, falls du mal eine umfangreichere Ereignisprozedur schreiben solltest, wäre es zweckmäßig, diese quasi als Verteiler zu konstruieren. D.h., nur Gültigkeitsabfragen reinnehmen und davon abhängig zu ausführenden "normalen" Subroutinen verzweigen, also diese dann aufrufen, Call prozedurname. (Ich schreibe nämlich auch Funktionen, die automatische Ereignisprozedur-Ergänzungen vornehmen... ;-))
Gruß + Guten Rutsch!
Luc :-?

Anzeige
AW: VBA aktivieren bei Änderung in mehreren Zellen
30.12.2007 08:22:00
Erich
Hallo Daniel (oder Richard?),
probier mal

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lngZ As Long
If Intersect(Target, Range("M7,M12:M16")) Is Nothing Then Exit Sub
For lngZ = 20 To 58              ' in Zeilen 20:58
Select Case Cells(lngZ, 16)   ' prüfe Spalte P
Case 0:     Rows(lngZ).Hidden = True
Case 1:     Rows(lngZ).Hidden = False
Case Else:  ' nichts tun
End Select
Next lngZ
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: VBA aktivieren bei Änderung in mehreren Zellen
30.12.2007 08:40:00
Erich
Hi nochmal,
da fehlte etwas: Wenn eine Zelle in Spalte P leer ist, wurde auch die Zeile ausgeblendet (wie bei 0).
Die folgende Prozedur tut das nicht:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lngZ As Long
If Intersect(Target, Range("M7,M12:M16")) Is Nothing Then Exit Sub
For lngZ = 20 To 58              ' in Zeilen 20:58
Select Case Cells(lngZ, 16)   ' prüfe Spalte P
Case "":    ' nichts tun
Case 0:     Rows(lngZ).Hidden = True
Case 1:     Rows(lngZ).Hidden = False
Case Else:  ' nichts tun
End Select
Next lngZ
End Sub

Zwei Zeilen könntest du noch erweitern. Wenn eine Zeile schon richtig aus- oder eingeblendet ist,
muss ja nichts getan werden:


Case 0:     If Not Rows(lngZ).Hidden Then Rows(lngZ).Hidden = True
Case 1:         If Rows(lngZ).Hidden Then Rows(lngZ).Hidden = False

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige

320 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige