Excel Makro Zellen Ein/Ausblenden

Christian98

Ensign
Registriert
März 2014
Beiträge
226
Hi,

ich bin gerade dabei in eine Tabelle eine Funktion einzufügen, dass wenn ich auf Bestimmte Zellen Klicke, dann sollten die Zeilen darunter ein bzw. ausgeblendet werden.

Ich bin aktuell bereits so weit, dass es fürs erste funktionieren würde, jedoch habe ich noch ein Problem und zwar ist diese Funktion auf bestimmte Zellen bezogen, wenn ich also wine neue Zeile darüber einfüge, dann wird das ganze Makro um eine Zeile verschoben.

Hier der Code des Makros:
C:
Private Sub Beispiel1()
Application.ScreenUpdating = False
If Sheets("Tabelle2").Range("$H$3").Value = "Ausblenden" Then
For i = 1 To 100
If Cells(i, 2).Value = "1" Then
    Rows(i).Hidden = True
    Range("H3").Value = "Einblenden"
End If
Next i
Else
For i = 1 To 100
If Cells(i, 2).Value = "1" Then
    Rows(i).Hidden = False
    Range("H3").Value = "Ausblenden"
End If
Next i
End If

Application.ScreenUpdating = True
Range("A1").Select

End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$H$3" Then Call Beispiel1
End Sub

Hat jemand eine Idee?
 

Anhänge

Zuletzt bearbeitet: (Datei Angehängt)
Hi,
könntest du dein Problem nochmal genauer beschreiben?
Bei mir bleibt aktuell "H3" als Trigger-Zelle für das Ausblenden/Einblenden fest. Egal wie viele Zeilen ich darüber oder darunter einfüge.
Was sich aber "verschiebt" ist der Inhalt von H3, der natürlich nach unten wandert, wenn ich über H3 eine neue Zeile einfüge.
Beste Grüße

P.S.: ich habe dein angehängtes Excel-File aus Sicherheitsgründen nicht geöffnet, sondern versucht mir alles mit Hilfe des Codes abzuleiten.
 
  • Gefällt mir
Reaktionen: Christian98
OK, in der angehängten datei befindet sich wirklich nur die Excel datei, da man keine Excelmakro datei hochladen kann.

Ja genau das ist das Problem, wenn sich der Inhalt verschiebt, dann soll sich auch die Triggerzelle mitverschieben.

Wenn ich also 3 zeilen darüber einfüge, dann sollte die Zelle nicht mehr H3 sein sondern H6 sein, ist das irgendwie möglich, dass das automatisch funktioniert oder muss ich das immer per Hand ändern. Das Problem ist hald, dass es nicht bei dieser einen Zelle bleibt, es sollte irgendwann mehr als 10 solche Zellen geben, da sich die Zeilen, die ein und ausgeblendet werden immer auf die Zeile beziehen, die darüber sind. Die ein und ausblendbaren Zeilen sollten somit eine Art Log darstellen, der auch desöfteren erweitert wird, deshalb verschiebt sich dann alles.

Ich hoffe ich konnte es ein bisschen erklären.
 
Arbeite doch mit Namen.
Gib der Trigger-Zelle einen Namen, z.B. TRIGGER

Und im Code sprichst du die Zelle dann mit Namen an: Range(„TRIGGER").Value
Dadurch kann die sich verschieben und wird trotzdem immer wieder gefunden.

Allgemein:
Ich bin gerade nur am Handy und kann daher die Datei nicht angucken.
Ich denke aber, dass ich grob verstehe, was du vorhast.
Persönlich würde ich dein Vorhaben vermutlich anders lösen (LOG-File, ListView, Gruppierung oder sowas), da deine Methode doch sehr Fehler anfällig zu sein scheint.
 
  • Gefällt mir
Reaktionen: Christian98 und aroxx
Auf jedenfall sollte es ein und ausblendbar sein, da es sonst zu unübersichtlich wird, an Gruppierungen habe ich auch schon gedacht, jedoch gefällt mir das auch nicht ganz so gut, da dies auch unübersichtlich werden kann, ich schaue mir das nochmal an, muss es evtl mit Namen probieren.
 
Bemme90 schrieb:
Arbeite doch mit Namen.
Gib der Trigger-Zelle einen Namen, z.B. TRIGGER

Und im Code sprichst du die Zelle dann mit Namen an: Range(„TRIGGER").Value
Dadurch kann die sich verschieben und wird trotzdem immer wieder gefunden.

Ich wusste nicht, dass das geht... Hab es gleich getestet und funktioniert wie erwartet. Wieder was gelernt :) Danke!

C-ähnlich:
Private Sub Beispiel1()
Application.ScreenUpdating = False
If Range("TRIGGER").Value = "Ausblenden" Then
    For i = 1 To 100
        If Cells(i, 2).Value = "1" Then
            Rows(i).Hidden = True
            Range("TRIGGER").Value = "Einblenden"
        End If
    Next i
Else
    For i = 1 To 100
        If Cells(i, 2).Value = "1" Then
            Rows(i).Hidden = False
            Range("TRIGGER").Value = "Ausblenden"
        End If
    Next i
End If

Application.ScreenUpdating = True
Range("A1").Select

End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = Range("TRIGGER").Address Then Call Beispiel1
End Sub
 
  • Gefällt mir
Reaktionen: Bemme90 und Christian98
Funktioniert das auch wenn ich mehrere Triggerzellen habe?

Und auf welche Information bezieht sich dann das TRIGGER?
Bin ich dann so richtig?

Ich muss also in meine Excel Tabelle gehen und dann die gewünschte Zelle zum Beispiel TRIGGER nennen, dann bezieht sich das Makro immer auf diese Zelle.

Wenn ich also eine weitere Triggerzelle habe, dann füge ich den Code nochmal ein und ersetze das TRIGGER durch z.B. TRIGGER2, dann benenne ich die zweite Zelle auf TRIGGER2 um.

Vielen Dank, werde es morgen ausprobieren!

P.S. Excel fasziniert mich immer mehr, man hat da so viele Funktionen, da lernt man ständig was neues, echt cool!
 
@aroxx
Das mit den Namen im Code habe ich sicher erst nach 3 Jahren VBA erfahren. :-)
Seit dem nutze ich das für absolute Zellen nur noch.

Das ist zum Beispiel sehr hilfreich, wenn man wie ich, das Layout der Tabelle oft ändert.
Dann muss man im Code nicht die Bezüge andauernd mit anpassen.
Oft schreibe ich erst den Code und mache dann die Mappe benutzerfreundlich.

@Christian98
Du kannst natürlich auch weitere Zellen benennen.
Aber ich hatte gedacht, dass die Zelle immer die selbe ist, so wie @aroxx den Code geschrieben hat?
Gucke später mal in die Datei.

EDIT 1:
Hab mir jetzt deine Datei mal angeguckt.
Da braucht man einen anderen Ansatz. Hab auch schon eine Idee und melde mich gleich wieder.

EDIT 2:
Hier meine Lösung. Funktioniert, aber Performance ist leider nicht zufriedenstellend.
Code:
Option Explicit

Function Beispiel1(m_Zeile As Long, m_Spalte As Long)
On Error GoTo Err_Handler:

    'Variablen
    Dim i As Long
  
    'Einstellungen setzen
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With
  
    'Bedingung fuer Einblenden
    If UCase(Tabelle2.Cells(m_Zeile + i, m_Spalte).Value) = "EINBLENDEN" Then
  
        Tabelle2.Cells(m_Zeile + i, m_Spalte).Value = "Ausblenden"
        i = 1
        Do Until Tabelle2.Cells(m_Zeile + i, m_Spalte) <> "" Or Tabelle2.Cells(m_Zeile + i, m_Spalte - 6) = ""
            Tabelle2.Rows(m_Zeile + i).Hidden = False
        i = i + 1
        Loop
      
    'Bedingung fuer Ausblenden
    ElseIf UCase(Tabelle2.Cells(m_Zeile + i, m_Spalte).Value) = "AUSBLENDEN" Then
  
        Tabelle2.Cells(m_Zeile + i, m_Spalte).Value = "Einblenden"
        i = 1
        Do Until Tabelle2.Cells(m_Zeile + i, m_Spalte) <> "" Or Tabelle2.Cells(m_Zeile + i, m_Spalte - 6) = ""
            Tabelle2.Rows(m_Zeile + i).Hidden = True
        i = i + 1
        Loop
      
    End If
  
    'Einstellungen entfernen
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
    End With
    Range("A1").Select
  
    Exit Function

'Fehlerbehandlung
Err_Handler:
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
    End With
    Range("A1").Select
    MsgBox "Fehler beim Ausführen der Funktion!", vbCritical + vbOKOnly, "Fehler!"
End Function

Sub Worksheet_SelectionChange(ByVal Target As Range)
  
    'Makro starten
    If UCase(Target.Text) = "EINBLENDEN" Or UCase(Target.Text) = "AUSBLENDEN" Then
        Call Beispiel1(Target.Row, Target.Column)
    End If
  
End Sub
 

Anhänge

Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Christian98
@Bemme90 Dein Vorschlag funktioniert eigentlich genauso, wie ich es mir vorgestellt habe, man muss jedoch, wenn man eine neue Zeile einfügt, die Ganze Zeile auswählen und nicht nur die Zeile in der Tabelle, sonst funktionierts wieder nicht mehr.
 
Zuletzt bearbeitet:
Habe nun noch diese Funktion eingebaut
Code:
Dim aktivespalte As Long

Dim aktivezeile As Long


aktivespalte = ActiveCell.Column

aktivezeile = ActiveCell.Row

Cells(zeile, spalte + 1).Activate

Nun springt er nicht immer auf die erste Zelle :D
 
Zwei Sachen fallen mir auf:

Statt:
Code:
Cells(zeile, spalte + 1).Activate

Probier:
Code:
Cells(zeile, spalte + 1).Select

Ansonsten, zeig gerne noch mal mehr vom Code / von der Mappe.
 
  • Gefällt mir
Reaktionen: Christian98
Gibt es eigentlich auch noch eine Möglichkeit, wie ich 2 oder noch mehr Tabellen zu einer Gesamttabelle zusammenführen kann, sodass sich die gesamttabelle auch erweitert, sobald in einer Einzeltabelle eine weitere Zeile eingefügt wird?

Hätte das ganze sonst manuell mit Sverweisen, wenn und summewenn- Abfragen gemacht, oder gibt es da eine bessere Lösung?

P.S. ich arbeite mit excel 2010
 

Anhänge

Zuletzt bearbeitet:
Zurück
Oben