6.5k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo Leute!

Mich beschäftigt (mittlerweile zermürbt) folgende kleine Aufgabenstellung:

-Tabellenblatt "Kalkulation"
-Im Feld AC17 wird eine 1 oder eine 0 per Formel (Wenn/Dann) generiert.
-Bei einer 0 sollen die Zeilen 30-52 ausgeblendet werden.
-Bei einer 1 sollen die Zeilen 30-52 eingeblendet werden.
-Bei jeder automatischen Berechnung des Wertes in Feld AC17 soll das Ausblenden stattfinden.

Ich hab div. Ansätze versucht. Leider bisher ohne Ergebnis.

Wäre super wenn jemand einen Vorschlag hätte...
thx + lg
stefan

12 Antworten

0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Stefan,

eine Werteänderung einer Zelle durch eine Formel kann kein Ereignis auslösen
Man müsste also die Formel in AC17 kennen um das Makro anhand deren Quelle auslösen zu können.

Gruß
Rainer
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

eine benutzerdefinierte function kann zwar ein makro starten,aber auch hier ist ein rueckgabewert gefordert

eine aenderung der Tabelle ist nicht möglich

deine Problematik erfordert daher eine zelle die haendich befuellt wird,dann ist es möglich ein ereigniss abzufragen

gruss nighty
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

soweit ich mich erinnere gab es einige wenige ausnahmen die dem widersprechen *g*

ein ein und ausblenden gehörte aber nicht dazu O_o

gruss nighty
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Stefan,

versuch mal das folgende Makro im VBA-Projekt deiner Tabelle "Kalkulation":

Private Sub Worksheet_Calculate()

If Range("AC17") = 0 Then
Range("A30:A52").EntireRow.Hidden = True
Else
Range("A30:A52").EntireRow.Hidden = False
End If

End Sub


Die Zelle AC17 wird allerdings bei jedem Kalkulationsereignis in der Tabelle abgefragt und nicht nur, wenn diese Zelle neu berechnet wird.

Gruß

M.O.
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

das calczlate ereigniss ist sehr schwierig zu haendelm
aus diesem grunde meiden es auch Profis :-)

gruss nighty
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi mo ^^

die Laufzeit bricht gnadenlos zusammen nutze es lieber nicht :-)

gruss nighty
0 Punkte
Beantwortet von
danke für den Input...
Die Tabelle soll möglichst wenige Bedienereingaben erfordern, deshalb wird vieles automatisch berechnet bzw. in Abhängigkeit von anderen Zellen/Formeln ausgefüllt.

Info:
-Formel in AC17 lautet
=WENN(D48="Detaileingabe für Kalkulation nötig";1;0)

-im Feld D48 wird ebenfalls per Formel ein Text generiert
=WENN(D45=Vorteilsk.kalk!I9;"Detaileingabe für Kalkulation nötig";" ")

-Feld D48 ist von einer händischen Eingabe in D10 abhängig

-@M.O.
dein Makro funzt, leider nur einmal, dann hängt sich das Excel mit der Meldung auf "Excel reagiert nicht - neu starten..."

-@nighty
diesen Satz verstehe ich nicht: "eine benutzerdefinierte function kann zwar ein makro starten,aber auch hier ist ein rueckgabewert gefordert"
Rückgabewert?? Feld AC17 mit Wert 1 bzw. 0 reicht nicht aus?

-@all
kann anstatt des Calculate-Ereignisses nicht ein anderes verwendet werden welches nur bei refresh von Zelle AC17 reagiert??

danke schonmal für eure Denkansätze...
lg
stefan
0 Punkte
Beantwortet von
hier ein paar Ansätze die nicht funktionieren, habe mir diese aus dem Netz zusammengesucht, diese Ansätze sind NUR ALS MUSTER zu sehen, die Zelladressen usw. stimmen allesamt nicht, ICH HAB MIR DIESE NUR ALS DENKANSATZ KOPIERT.

mein VBA-Wissen reicht leider nicht aus die Formeln zu deuten oder an meine Tabelle anzupassen, vielleicht kann man eine der Formeln entsprechend anpassen, aber seht selbst...

'Zeilen automatisch ausblenden bzw. wieder einblenden bei Wert 1 bzw. 0
'div. Anleitungen...

Sub Ausblenden()
Dim intRow As Integer, intLastRow As Integer
intLastRow = Cells(Rows.Count, 1).End(xlUp).Row
For intRow = 1 To intLastRow
If IsEmpty(Cells(intRow, 1)) Then
Rows(intRow).Hidden = True
ElseIf Cells(intRow, 1) = 0 Then
Rows(intRow).Hidden = True
End If
Next intRow
End Sub

Sub BestimmteZeilenAusblenden()
'Zeilen automatisch ausblenden (bzw. einblenden), wenn in der Spalte B bestimmte Werte stehen ( _
bsp. All).
Dim rng As Range
For Each rng In Range(Cells(29, 17), Cells(29, 17).End(xlUp)) '2 = Spalte B
If LCase(rng) = "0" Then 'Kriterium = 0
Rows("30:52").EntireRow.Hidden = True
Else
Rows("30:52").EntireRow.Hidden = False
End If

End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim i As Long, laR As Long
laR = Cells(Rows.Count, 4).End(xlUp).Row
For i = laR To 1 Step -1
If Cells(i, 4).Text = "0:00" Then
Cells(i, 4).EntireRow.Hidden = True
End If
Next i
End Sub

Sub ausblendenms()

If .Range("AC21").Value = 1 Then
.Rows("30:52").EntireRow.Hidden = True

If .Range("AC21").Value = 0 Then
.Rows("30:52").EntireRow.Hidden = True
End If

End With

End Sub

Option Explicit

Sub Zeilen_ausblenden()
Dim Wiederholungen As Long
Application.ScreenUpdating = False
For Wiederholungen = 1 To 20
If Cells(Wiederholungen, 1).Value = "0" Then
Rows(Wiederholungen).Hidden = True
Else
Rows(Wiederholungen).Hidden = False
End If
Next
End Sub
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo,

wenn alles von einer Eingabe in Zelle D10 abhängt, dann frage doch die Zelle AC17 ab, sobald sich D10 ändert. Der Code gehört in das VBA-Projekt des betreffenden Arbeitsblattes:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Not Intersect(Target, Range("D10")) Is Nothing Then

If Range("AC17") = 0 Then
Range("A30:A52").EntireRow.Hidden = True
Else
Range("A30:A52").EntireRow.Hidden = False
End If

End If

End Sub


Bezüglich des Perfomance-Problems siehe Antwort 6 von Nighty (ich wußte ja nicht, wie komplex deine Mappe ist).

Gruß

M.O.

P.S.:Ich selbst habe das Calculate-Ereignis jedenfalls noch nicht genutzt ;-).
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi all ^^

zu

dein Makro funzt, leider nur einmal, dann hängt sich das Excel mit der Meldung auf "Excel reagiert nicht - neu starten..."

ist das Resultat des zusammenbruchs der Laufzeit,wie schon oben erwaehnt

zu

eine benutzerdefinierte function kann zwar ein makro starten,aber auch hier ist ein rueckgabewert gefordert

ziel war es in makro ueber eine Funktion zu starten und mit dieser auf 0 oder 1 zu reagieren und die zeilen ein/aus zu blenden
da auch hier ein rueckgabewert gefordert wird ist ein ein und ausblenden nicht moeglich

zu

Private Sub Worksheet_Change(ByVal Target As Excel.Range)



das makro nutzt das Worksheet_Change ereigniss das eine haendiche eingabe fordert,wie schon erwaehnt
das sollte deine erste Wahl sein

das makro muss aber noch mit einer ereigniss Ausschaltung ergaenzt werden um einen zirkelbezug zu vermeiden
der bei jedem zellenzugriff entstehen wuerde

Application.EnableEvents = False


schaltet das ereigniss aus und sollte am anfang des codes stehen

Application.EnableEvents = True


schaltet das ereigniss wieder ein und sollte am ende des codes stehen

der code der ereigniss abfrage ist einzu fuegen unter
alt+f11>projektexplorer>deineTabelle

und wird mit einer haendichen eingabe ausgeloest

gruss nighty
...