Bedingte Spaltenausblendung bei Excel

Ist es bei Excel möglich (ggf. mit Makro), ganze Spalten auszublenden, wenn eine bestimmte Bedingung (Ergebnis) in einer Zelle erfüllt wird? Also meinetwegen, wenn A1=0 dann Spalte B tschüß.
Wo fände man ggf. fertige Makros?

Schönes Wochenende,
Raúl

Per Makro

Wo fände man ggf. fertige Makros?

Hier:

Sub Tschuess1
 If Range("A1").Value = 0 Then
 Columns("B:B").Hidden = True
 End If 'Range("A1").Value
End Sub 'Tschuess1

oder

Sub Tschuess2
 Columns("B:B").Hidden = (Range("A1").Value = 0)
End Sub 'Tschuess2

oder

Function Tschuess(Jupp As String) As Boolean
 Columns("B:B").Hidden = ((Range("A1").Value = 0) And (Jupp "00"))
 Tschuess = Columns("B:B").Hidden
End Function 'Tschuess

Die Subs müßtest Du direkt aufrufen. Die Funktion hingegen kannst Du einfach aufrufen, indem Du z.B. in A7 irgendwas reinschreibst und in A8 „=Tschuess(A7)“ hinterlegst. Solltest Du in A7 „00“ reinschreiben, ist Spalte B immer zu sehen. Ansonsten hängt´s vom Inhalt von A1 ab.

Alles klar?

Schönes Wochenende,

Danke, Dir auch.
Kristian

Puuuuh!
Hallo Kristian,

offen gestanden habe ich keine Ahnung von Makros. Ich weiß nicht einmal, wie man Excel ein Makro „einimpft“ und was man tun muß, damit es aktiviert wird.
Ich denke, die Funktion erledigt das, was ich machen will eher als die Geschichte mit den „Subs“. Könntest Du mir sagen, wie ich Deinen Lösungsvorschlag unten ans Laufen bekomme:

Function Tschuess(Jupp As String) As Boolean
Columns(„B:B“).Hidden = ((Range(„A1“).Value = 0) And (Jupp
„00“))
Tschuess = Columns(„B:B“).Hidden
End Function 'Tschuess

Die Funktion hingegen
kannst Du einfach aufrufen, indem Du z.B. in A7 irgendwas
reinschreibst und in A8 „=Tschuess(A7)“ hinterlegst. Solltest
Du in A7 „00“ reinschreiben, ist Spalte B immer zu sehen.

Das habe ich angesichts meiner mauen Makrokenntnisse natürlich nicht verstanden. Was haben A7 und A8 mit A1 zu tun?

Sorry, wenn die Fragen duselig klingen aber ich brauche so selten ein Makro, daß es mir nicht lohnenswert erscheint, Zeit in Makroprogrammierung zu investieren.

Vielen Dank für die schnelle Antwort,
Raúl

Hallo Kristian,

offen gestanden habe ich keine Ahnung von Makros.

Hm, die kannst du recht einfach bekommen.
Einfach mal Macros aufzeichnen (Extras—> Mcros—>Aufzeichenen)
und dir anschliessen das ergebnis anschauen unter Makros bearbeiten.

Ich weiß
nicht einmal, wie man Excel ein Makro „einimpft“ und was man
tun muß, damit es aktiviert wird.

Dann übe mal, das lohnt sich (keine blöde Anmache, es ist kinderleicht und du wirst staunen was man alles machen kannn)

Ich denke, die Funktion erledigt das, was ich machen will eher
als die Geschichte mit den „Subs“. Könntest Du mir sagen, wie
ich Deinen Lösungsvorschlag unten ans Laufen bekomme:

die Zeilen in eine Text Datei kopieren und importieren.

Function Tschuess(Jupp As String) As Boolean
Columns(„B:B“).Hidden = ((Range(„A1“).Value = 0) And (Jupp
„00“))
Tschuess = Columns(„B:B“).Hidden
End Function 'Tschuess

Das habe ich angesichts meiner mauen Makrokenntnisse natürlich
nicht verstanden. Was haben A7 und A8 mit A1 zu tun?

Sorry, wenn die Fragen duselig klingen aber ich brauche so
selten ein Makro, daß es mir nicht lohnenswert erscheint, Zeit
in Makroprogrammierung zu investieren.

Das ist ein grosser Irrtum, es lohnt sich wirklich die Zeit zu investieren, wenn du viel mit Excel arbeitest.
Gruss

Mike

Ich denke, die Funktion erledigt das, was ich machen will eher
als die Geschichte mit den „Subs“. Könntest Du mir sagen, wie
ich Deinen Lösungsvorschlag unten ans Laufen bekomme

Ja, Du mußt in den Makro-Editor gehen (Extras-Menü oder Alt-F11). Dort erscheint lnks der Projekt-Explorer, wo Du Dir die aktuelle Tabelle suchst. Auf die klickst Du doppelt und fügst in dem leeren weißen Feld, das dann im rechten Fenster erscheint, einfach die Funktion ein.

Das habe ich angesichts meiner mauen Makrokenntnisse natürlich
nicht verstanden. Was haben A7 und A8 mit A1 zu tun?
Sorry, wenn die Fragen duselig klingen …

Nein, ich sage sorry. Also A7 und A8, das hatte ich wohl vergessen zu erwähnen, sind zwei Tabellenfelder, die ich zur Ausführung des Makros benutze. Ich habe sie beliebig gewählt. A7 beinhaltete dabei den Parameter für die Funktion (z.B. 00), und in A8 steht der Aufruf, also hier =Tschuess(A7).
Ich werde das mal zu einer Tabelle machen und Dir schicken, zumal es sich noch verbessern läßt.

aber ich brauche so selten ein Makro, daß es mir nicht lohnenswert erscheint, Zeit in Makroprogrammierung zu investieren.

Da hat mein „Nachredner“ recht, wenn er sagt, daß es einfach und sinnvoll ist. Zumindest das Aufzeichnen von Makros solltest Du Dir mal angucken und dann auch die aufgezeichneten Makros selbst (Alt-F11). Wirst sehen, wie einfach es sein kann.

Kristian

Nun aber richtig …
Hallo Raúl,

ganz so, wie ich es gesagt hatte, geht´s doch nicht. Ich hätte es vorher
probieren sollen. Den Code habe ich trotzdem mal so stehen lassen und
an der entsprechenden Stelle korrigiert.

  • Öffne ein Excel-Blatt.

  • Öffne den VBA-Editor (Alt-F11)

  • Klicke im Projekt-Explorer (inks oben) mit der rechten Maustaste auf den in Klammern stehenden fetten Namen der Excel-Datei und dann auf „Einfügen … Modul“.

  • Doppelklicke auf „Modul1“, das unten erschienen ist und füge den folgenden Code ein:

    Option Explicit

    ’ Diese Funktion kannst Du ganz normal aufrufen, wie alle anderen Excel-
    ’ Funktionen auch. Du kennst z.B. die Funktion „Runden“ ganz bestimmt.
    ’ Sie verlangt zwei Parameter: Zahl und Anzahl_Stellen. Wenn Du also
    ’ in das Feld A8 „=Runden(3,2458; 2)“ eingibst, dann wird dort „3,25“
    ’ erscheinen. Nun willst Du aber die Parameter nicht in der Formel
    ’ fixieren, sondern sie aus der Tabelle holen. Deshalb schreibst Du
    ’ nun „=Runden(A6; A7)“ in A8 hinein, gibst in A6 „3,2458“ und in A7
    ’ „2“ ein, und erhältst das gleiche Ergebnis.
    ’ Soweit nichts Neues, oder?
    ’ Nun zur Funktion „VersteckeSpalte“. Sie verlangt auch zwei Parameter,
    ’ die Du also analog irgendwo in die Tabelle schreiben mußt. Als Ergebnis
    ’ erscheint diesmal nicht der gerundete Wert, sondern ein Wahrheitswert
    ’ (Boolean), also „Wahr“ bzw. „Falsch“ in dem Feld. Eigentlich wäre das
    ’ überflüssig, weil wir das nicht wissen wollen, aber eine Funktion MUSS
    ’ irgendwas zurückliefern.
    ’ Und jetzt die Parameter. Der erste heißt „Bedingung“ und muß einen
    ’ Wahrheitswert darstellen. Dabei gelten alle Zahlen ungleich Null als
    ’ Wahr, die Null und „Nichts“ als Falsch. Das Feld, das diesen Parameter
    ’ enthält, muß also eine Vergleichs-Formel enthalten, die entweder „Wahr“
    ’ oder „Falsch“ ergibt. Beispiel: „=(A1>=0)“. Ist A1 also leer bzw. mit
    ’ einer Zahl größer Null gefüllt, wird „Wahr“ zurückgegeben.
    ’ Parameter zwei ist ein Text. Hier wird der Spaltenname verlangt.
    ’ In Deinem Beispiel reicht also ein „B“ aus, weil Du ja diese Spalte
    ’ verstecken wolltest.
    ’ Das verwirrende an dieser Funktion mag sein, daß das Ergebnis, das im
    ’ Feld erscheint, eben nur ein Nebenprodukt ist. Eigentlich führt sie ja
    ’ das Verstecken bzw. Einblenden der übergebenen Spalte aus.
    ’ Und genau das geht offenbar nicht. Da muß ich das alles zurückziehen.
    ’ Excel ignoriert einfach das Umstellen der Hidden-Eigenschaft, wenn
    ’ sie innerhalb einer Funktion gesetzt wird. Das funnktioniert nur in
    ’ Prozeduren (Sub´s), die man allerdings nicht in einer Excel-Zelle
    ’ aufrufen kann.
    ’ Damit sind die beiden unten stehenden Funktionen wirkungslos, und es
    ’ bleibt nur die Möglichkeit mit dem Change-Ereignis.
    Public Function VersteckeSpalte(Bedingung As Boolean, Spalte As String) As Boolean
    Columns(Spalte & „:“ & Spalte).Hidden = Bedingung
    VersteckeSpalte = Bedingung
    End Function 'VersteckeSpalte

    ’ Dies hier ist die gleiche Funktion, nur daß kein Wahrheitswert zurückgegeben
    ’ wird, sondern ein Text (String). Eine solche Funktion kann alles zurückgeben,
    ’ was in einem Tabellenfeld darstellbar ist.
    Function VersteckeSpalte2(Bedingung As Variant, Spalte As String) As String
    Columns(Spalte & „:“ & Spalte).Hidden = (Bedingung = True)
    If Bedingung = True Then
    VersteckeSpalte2 = „Spalte " & Spalte & " ist versteckt.“
    Else
    VersteckeSpalte2 = „Spalte " & Spalte & " ist sichtbar.“
    End If 'Bedingung = True
    End Function 'VersteckeSpalte2

    ’ Erster Nachteil der beiden oberen Funktionen ist, daß man zwei Felder benötigt,
    ’ welche die Parameter enthalten und eins für das Ergebnis (also den Funktions-
    ’ aufruf selbst). Zweiter Nachteil ist, daß sie natürlich nur dann ausgeführt
    ’ wird, wenn sich eins der Parameterfelder ändert. Das ist abei eigentlich egal,
    ’ da sie sich ja ändern, wenn Deine Bedingung sich ändert, wenn also z.B. der
    ’ Wert der Zelle A1 sich ändert.

Dann doppelklicke auf „Tabelle1“ im Projekt-Explorer nud füge das hier ein:

' Eleganter ist es da, das Change-Ereignis der Tabelle zu nutzen,
' das bei jeder Änderung auf dem Blatt ausgelöst wird. Nachteil
' ist hier aber, daß man keine beliebigen Parameter übergeben
' kann. Man muß sie sozusagen fest verdrahten oder zumindest
' die Verweise auf die Parameterzellen im Blatt.
 
Private Sub Worksheet\_Change(ByVal Target As Range)
 ' Werte fixiert:
 Spalte = "B"
 Bedingung = (Range("A1").Value = 0)
 ' Verweise fixiert:
 'Spalte = Range("A7").Value ' Zelle A7 enthält "B".
 'Bedingung = Range("A6").Value ' Zelle A6 müßte dann "=(A1=0)" enthalten.

 Columns(Spalte & ":" & Spalte).Hidden = Bedingung
End Sub 'Worksheet\_Change
 
' Die Ereignisroutinen findest Du übrigens oben links in der Combobox,
' wenn rechts daneben "Worksheet" ausgewählt ist. Spiel mal mit herum
' und gib als Code einfach 'MsgBox "Hallo"' ein. Dann siehst Du, wann
' die Ereignisse auftreten.
' Die leere Routine wird automatisch hier in das Blatt geschrieben,
' wenn Du das entsprechende Ereignis oben auswählst.

Dann ändere bzw. lösche den Wert von A1 und beobachte Spalte B.

Kristian

1 „Gefällt mir“

Hallo Kristian,

herzlichen Dank für die Mühe, die Du Dir mit Deiner Antwort gegeben hast. Eine so umfangreiche Lösung inkl. VBA-Erklärung hätte ich nicht erwartet. Als Kenner der Materie hantierst Du allerdings mit diversen Begriffen, die für Dich normal für mich aber Neuland sind. Deshalb werde ich mir Deine Erklärung noch ein paar Mal durchlesen müssen, wie gesagt, mir fehlt absolut das Hintergrundwissen.
Jedenfalls funktioniert Dein Lösungsvorschlag wunderbar.

Vielen Dank,
Raúl

Hallo Kristian,

herzlichen Dank für die Mühe, die Du Dir mit Deiner Antwort
gegeben hast. Eine so umfangreiche Lösung inkl. VBA-Erklärung
hätte ich nicht erwartet.

Unverhofft kommt oft :wink:

Als Kenner der Materie hantierst Du allerdings mit diversen Begriffen, die für Dich normal, für mich aber Neuland sind.

Das war mir klar, und das war auch der Grund für den Umfang. Um ihn allerdings nicht allzu sehr wachsen zu lassen, mußte ich an der einen oder anderen Stelle was so im Raum stehen lassen.

Deshalb werde ich mir Deine Erklärung noch ein paar Mal durchlesen müssen, wie gesagt, mir fehlt absolut das Hintergrundwissen.

Und wenn das auch nicht hilft, einfach nochmal fragen.

Jedenfalls funktioniert Dein Lösungsvorschlag wunderbar.

Das freut mich.

Gruß aus Aachen,
Kristian