Wenn Zellenwert = X, Zeile ausblenden

fiedlator

Commander
Registriert
Okt. 2002
Beiträge
2.192
Hallo zusammen,
wieder mal ein kleines Makroproblem meinerseits. Sofern eine Zelle den Wert Falsch annimmt, soll eine bestimmte Zeile versteckt werden. Ich hatte schon etwas zusammengeschustert, das funktionierte jedoch nicht wirklich, da die Überprüfung (insgesamt 30 Zellen) nach jeder Veränderung gestartet wurde. Es musste also nach jeder Veränderung im Tabellenblatt 3 sekunden gewartet werden, bis alle Makros durchgelaufen waren...was natürlich nicht praxistauglich ist. Es soll nur der Zellenwert überprüft werden, wenn eben auch die bestimmte Zelle tatsächlich verändert wurde.

Besten Dank :)
 
Du hast eine bestimmte Zelle die sich ändert, und dann soll eine bestimmte Zeile ausgeblendet werden?
Dann kommt dieses Makro in das Tabellenblatt (nicht in ein separates Modul!):
Code:
Sub Worksheet_Change(ByVal Target As Range)

Dim iZeile As Integer
Dim rZelle As Range

iZeile = 5 [COLOR="Green"]'auszublendende Zeile[/COLOR]
Set rZelle = Range("A1") [COLOR="green"]'zu überwachende Zelle[/COLOR]

If Target = rZelle Then Range("A" & iZeile).EntireRow.Hidden = True

End Sub
 
Könntest Du vielleicht im Makro prüfen, ob die entsprechende Zelle geändert wurde?
So in der Art (für A1 hier):
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) ="A1" Then
'...
end if
End Sub

Sont wäre gut, wenn Du postest, was Du schon "zusammengeschustert" hast

edit: grrr... ich war zu langsam...
 
Mensch Mr. Snoot,
dich müsste ich ja bald in der Danksagung meiner BA-Arbeit erwähnen ^^.

Aber wie so oft habe ich noch eine Frage: Wo schreibe ich nun den Wert hin, bei dem die Zeile versteckt werden soll? Ist das dieses "A"?

Merci :)
 
Ach so, nur wenn die Zelle einen bestimmten Wert hat, soll die Zeile ausgeblendet werden? Ich dachte das soll generell bei einer Änderung passieren. Demnach soll die Zeile wohl auch wieder eingeblendet werden, wenn der Wert ein anderer ist?
Code:
Sub Worksheet_Change(ByVal Target As Range)

Dim iZeile As Integer
Dim rZelle As Range
Dim sWert As String

sWert = "XY" [COLOR="Green"]'Wert, bei dem die Zeile ausgebldent werden soll[/COLOR]
iZeile = 5 [COLOR="green"]'auszublendende Zeile[/COLOR]
Set rZelle = Range("A1") [COLOR="green"]'zu überwachende Zelle[/COLOR]

If Target = rZelle And Target.Value = sWert Then [COLOR="green"]'wenn die Zelle rZelle geändert wird, und der Wert  = sWert ist, dann[/COLOR]
  Range("A" & iZeile).EntireRow.Hidden = True [COLOR="green"]'blende die Zeile iZeile aus[/COLOR]
ElseIf Target = rZelle And Target.Value <> sWert Then [COLOR="green"]'sonst wenn der Wert ungleich sWert, dann[/COLOR]
  Range("A" & iZeile).EntireRow.Hidden = False [COLOR="Green"]'blende die Zeile ein[/COLOR]
End If

End Sub


Wo schreibe ich nun den Wert hin [..] Ist das dieses "A"?
Ich nehme mal an, du meinst das "A" in Range("A" & iZeile)? Nein, das ist es nicht. Das "A" ist die Spalte "A" - im Grunde ist es überflüssig und man könnte auch jede x-beliebige andere Spalte reinschreiben. Das Range-Objekt erwartet einfach eine Zellenangabe (Range("A5"), Range("X723")), auch wenn ich dann mit EntireRow nur die Zeile in der diese Zelle steht ausblenden möchte. Theoretisch ginge auch Range("5:5") um die 5. Zeile anzusprechen, aber das finde ich nicht schön (bzw. analog Range("A:A") um Spalte A anzusprechen).

fiedlator schrieb:
dich müsste ich ja bald in der Danksagung meiner BA-Arbeit erwähnen ^^.
Davon geh ich doch aus :D
 
Zuletzt bearbeitet:
Merci.

Wenn ich das ganze auf mehrere Zeilen anwenden möchte, verfahre ich so wie im angehängten Code? Oder ist da schon wieder ein Fehler drin? :D

Code:
Sub Worksheet_Change(ByVal Target As Range)

Dim iZeile As Integer
Dim rZelle As Range
Dim sWert As String

sWert = "nein" 'Wert, bei dem die Zeile ausgebldent werden soll
iZeile = 3 'auszublendende Zeile
Set rZelle = Range("B3") 'zu überwachende Zelle

sWert = "nein" 'Wert, bei dem die Zeile ausgebldent werden soll
iZeile = 4 'auszublendende Zeile
Set rZelle = Range("B4") 'zu überwachende Zelle

sWert = "nein" 'Wert, bei dem die Zeile ausgebldent werden soll
iZeile = 5 'auszublendende Zeile
Set rZelle = Range("B5") 'zu überwachende Zelle

sWert = "nein" 'Wert, bei dem die Zeile ausgebldent werden soll
iZeile = 6 'auszublendende Zeile
Set rZelle = Range("B6") 'zu überwachende Zelle

sWert = "nein" 'Wert, bei dem die Zeile ausgebldent werden soll
iZeile = 7 'auszublendende Zeile
Set rZelle = Range("B7") 'zu überwachende Zelle

sWert = "nein" 'Wert, bei dem die Zeile ausgebldent werden soll
iZeile = 8 'auszublendende Zeile
Set rZelle = Range("B8") 'zu überwachende Zelle

sWert = "nein" 'Wert, bei dem die Zeile ausgebldent werden soll
iZeile = 9 'auszublendende Zeile
Set rZelle = Range("B9") 'zu überwachende Zelle

sWert = "nein" 'Wert, bei dem die Zeile ausgebldent werden soll
iZeile = 10 'auszublendende Zeile
Set rZelle = Range("B10") 'zu überwachende Zelle

If Target = rZelle And Target.Value = sWert Then 'wenn die Zelle rZelle geändert wird, und der Wert  = sWert ist, dann
  Range("A" & iZeile).EntireRow.Hidden = True 'blende die Zeile iZeile aus
ElseIf Target = rZelle And Target.Value <> sWert Then 'sonst wenn der Wert ungleich sWert, dann
  Range("A" & iZeile).EntireRow.Hidden = False 'blende die Zeile ein
End If

End Sub
 
Das funktioniert nicht. Denn was macht dein Makro? Es arbeitet den Code von oben nach unten ab.

Bevor also deine If-Anweisungen ganz unten beginnt, wird 10mal der Wert der Variable sWert geändert (bzw. bei dir jedesmal "nein" zugewiesen), 10mal der Wert der Variable iZeile und 10mal der Bereich von rZelle.

Letztendlich arbeitet dein Makro also nur mit den zuletzt zugewiesenen Werten:
Code:
sWert = "nein"
iZeile = 10
Set rZelle = Range("B10")
Außerdem blendet das Makro genau die Zeile (iZeile = 10) aus, in der du dein "nein" eingegeben hast (rZelle = Range("B10")) - damit wird Einblenden durch Ändern des Wertes schwer ;)

Du hast also mehrere Zellen, die jede für sich eine bestimmte, jeweils andere Zeile ausblenden sollen?

Bspw. soll ein "nein" in Zelle A1 Zeile 5, und ein "nein" in Zelle A2 die Zeile 6 ausblenden?
 
Oh..danke :D
Die Zuweisung ist schon korrekt. Die Zelle B3 gibt letztendlich den Wert einer anderen Zelle in einem anderen Tabellenblatt wieder. Diese andere Zelle könnte man also auch nehmen. Ich dachte mir nur, dass es die Sache nicht gerade einfacher macht, wenn auch noch das Tabellenblatt ein anderes ist.

Also insgesamt geht das runter bis B30. Immer, wenn in Bx "nein" steht, soll Zeile x ausgeblendet werden.
 
Wenn ich keinen Denkfehler drin hab:
Code:
Sub Worksheet_Change(ByVal Target As Range)

Dim rBereich As Range
Dim sWert As String

Set rBereich = Range("B3:B30")
sWert = "nein"

If Not Intersect(Target, rBereich) Is Nothing And Target = sWert Then Target.EntireRow.Hidden = True

End Sub
Nur mit dem Einblenden klappt das nicht so recht. Dann müsste man es so lösen:
Code:
Sub Worksheet_Change(ByVal Target As Range)

Dim rBereich As Range
Dim rzelle As Range
Dim sWert As String

Set rBereich = Range("B3:B30")
sWert = "nein"

For Each rzelle In rBereich.Cells
If rzelle.Value = sWert Then
  rzelle.EntireRow.Hidden = True
Else
  rzelle.EntireRow.Hidden = False
End If
Next rzelle

End Sub
Is aber leider nicht sehr elegant; kA ob's auch schöner ginge.
 
Zuletzt bearbeitet:
Vielen Dank, da bin ich wieder. :)
Das Macro funktioniert...theoretisch. Praktisch leider nicht. Da es nur reagiert, wenn ich manuell "nein" eintrage. Wird es nur aufgrund der Formel geändert (was ja der Fall ist), reagiert das Macro leider nicht :(.
Kurz noch zur Anordnung:

Die Veränderung selbst wird durch eine Checkbox herbeigeführt. Diese gibt WAHR/Falsch in einer Bezugszelle wieder. Aufgrund des Wertes der Bezugszelle wird dann durch verschiedene Wenn, und, oder Funktionen in der finalen Zelle ja oder nein ausgegeben.
 
Kann man davon ausgehen, dass eine deaktivierte Checkbox gleich "nein" bedeutet?

Wenn nicht, wie wird ermittelt, ob eine (de)aktivierte Checkbox "ja" oder "nein" ergibt?


Bzw. spielt es eine Rolle, ob das Makro nur die jeweils angeklickte Checkbox registriert? theoretisch könnten doch alle Zellen, in denen "nein" steht ausgeblendet werden - egal, welche Checkbox tatsächlich gewählt wurde!?
 
Zuletzt bearbeitet:
Genau das ist auch der Plan, doch reagiert das Makro nicht auf die Veränderung, die durch die Check-box ausgeführt wird...das meinte ich damit. Er kontrolliert den Zellinhalt nur, wenn ich ihn händisch in "nein" ändere.
 
Das Problem ist, dass durch Formeln veränderte Zellen bzw. Neuberechnungen nicht durch Worksheet_Change sondern nur durch Worksheet_Calculate abgefangen werden können. Das bezieht sich aber auf das gesamte Arbeitsblatt, nicht nur auf einen bestimmten Bereich. D.h. das Makro läuft bei jeder Änderung in deiner Tabelle.

Ich würde allen Checkboxen folgendes Makro zuweisen:
Code:
Sub chkbx()

For Each zelle In Range("B3:B30").Cells

If zelle.Value = "nein" Then
  zelle.EntireRow.Hidden = True
Else
  zelle.EntireRow.Hidden = False
End If

Next

End Sub
Ist zwar auch nicht so schön, weil bei einer Checkbox alle Zellen in B3:B30 abgearbeitet werden, aber besser als Worksheet_Calculate und wohl auch besser als für jede Checkbox ein einzelnes Makro nach obigem Muster zu verwenden.
 
Danke abermals,
ich hab den eingefügten Code in den Editor des Tabellenblattes eingefügt. Es passiert jedoch nichts :(. Hast du eine Idee, woran das nun wieder liegt?
 
Achso .. das Makro kannst du jetzt in ein Modul packen; wobei es theoretisch auch im Arbeitsblatt gehen sollte. (Checkbox dem Makro zugewiesen?)
 
Sooo klappts. Merci :)

Solltest dir mal nen flattr-Acc anlegen :)
 
Neues Problem :(.
das Makro funktioniert plötzlich nicht mehr. Ich erhalte immer einen Laufzeitfehler 13 und die folgende Programmzeile ist gelb markiert: If zelle.Value = "nein" Then . Puh...und nun? :(
 
kannst du die tabelle mal hochladen? ich schau dann nach dem Länderspiel mal rein ;)
 
Also ehrlich gesagt nicht...Unternehmensdokument...:(

Mir ist gerade aufgefallen, dass unter der 13 noch Typenfehler steht. Ich kann mir das nicht erklären...das Makro lief ja bis vor kurzem noch problemlos :(
 
Kannst ja alle sensiblen Daten rauslöschen.

Der Fehler kann alles mögliche bedeuten, da kann man blind nur raten. Vermutlich stimmt hierbei etwas nicht:
For Each zelle In Range("B3:B30").Cells

Schreib mal:
For Each zelle In Range("B3:B30").Cells
MsgBox zelle
...
Next
Dann muss er dir den Wert jeder Zelle des Bereichs ausspucken. Steht in der Zelle vielleicht irgendwas "merkwürdiges"?
 
Zurück
Oben