830 Aufrufe
Gefragt in Tabellenkalkulation von robbi58 Mitglied (999 Punkte)
Bearbeitet von robbi58

Liebe Leute!
Ich habe im WEB folgenden Code für das Ein- und Ausblenden von Spalten gefunden:

Sub MultiSelectHidden()

   Const csHidden As String = "Spalten ausblenden"

   Const csVisible As String = "Spalten einblenden"

   With ActiveSheet.Buttons(1)

      If .Caption = csHidden Then

         Selection.EntireColumn.Hidden = True

         .Caption = csVisible

      Else

         Columns.Hidden = False

         .Caption = csHidden

      End If

   End With

End Sub

Dieser funktioniert einwandfrei. Ich kann durch einen Klick auf eine Zelle (auch mehrere sind möglich) und dem anschließenden Klick auf die Schaltfläche einzelne oder mehrere Spalten ein- und ausblenden.
Der Haken dabei: wenn ich Eintragungen in Zellen vornehme, dann werden diese automatisch übernommen.
Wie kann ich dies verhindern oder anders gefragt: wie muss ich den Code verändern, damit ich nur vorher genau definierte Spalten (oder auch Zeilen) ein- und ausblenden kann.

Es handelt sich nämlich um einen Test, wo nach den Eintragungen die Lösungen ein-bzw. ausgeblendet werden sollen.

Danke und Grüße von Robert

17 Antworten

+1 Punkt
Beantwortet von m-o Profi (22.9k Punkte)

Hallo Robert,

wenn du immer die gleichen Spalten ausblenden willst, dann musst du diese direkt ansprechen:

ActiveSheet.Columns("A").EntireColumn.Hidden = True


So wird die Spalte A ausgeblendet und so die Spalten A bis C:

ActiveSheet.Columns("A:C").EntireColumn.Hidden = True

Willst du mehrere nicht zusammenhängende Spalten ausblenden, dann so:

Sub spalten_ausblenden()

Dim varSpalten As Variant
Dim i As Integer

varSpalten = Array("A:A", "C:C", "E:F")
For i = 0 To 2
  ActiveSheet.Range(varSpalten(i)).EntireColumn.Hidden = True
Next i

End Sub

Gruß

M.O.

0 Punkte
Beantwortet von steffen2 Experte (6.4k Punkte)

flexibler wird der Code mit

For i = 0 To UBound(varSpalten)

anstatt

For i = 0 To 2

Denn dann ist die Anzahl der Einträge flexibel. Ansonsten muss die Zahl der Anzahl Kommas in der Zeile darüber entsprechen

Gruß Steffen2

0 Punkte
Beantwortet von robbi58 Mitglied (999 Punkte)

Hallo allerseits!

Zunächst recht herzlichen Dank an M.O. sowie Steffen 2.
Ich habe mithilfe eurer Anleitungen unterschiedliche Möglichkeiten ausprobiert und alles hat anstandslos funktioniert. Oder sagen wir fast. Ich habe den Code angepasst:

Sub MultiSelectHidden()

   Const csHidden As String = "Lösung ausblenden"

   Const csVisible As String = "Lösung einblenden"

   With ActiveSheet.Buttons(1)

      If .Caption = csHidden Then

ActiveSheet.Columns("AA:AC").EntireColumn.Hidden = True

         .Caption = csVisible

      Else

         Columns.Hidden = False

         .Caption = csHidden

      End If

   End With

End Sub

Das Aus- und Einblenden der gewünschten Spalten sowie die Umschaltung des Buttons (Lösung einblenden, Lösung ausblenden) funktioniert. Nur beim Einblenden werden nicht nur die angesprochenen Spalten eingeblendet (AA:AC), sondern auch alle anderen Spalten, die ich vorher von Hand ausgeblendet habe (Hilfsspalten zur Erstellung des Tests - bei mir B:Q). Wie kann ich dies verhindern?
Ich bedanke mich im Voraus für eure Hilfe.

LG Robert

0 Punkte
Beantwortet von robbi58 Mitglied (999 Punkte)
Einen angenehmen Nachmittag an die Runde!
Mittlerweile habe ich das Problem behoben. Der Fehler lag darin, dass ich natürlich beim Einblenden auch die entsprechenden Spalten ansprechen muss.

Der für mich richtige Code lautet daher:

Private Sub CommandButton5_Click()
   Const csHidden As String = "Lösung ausblenden"
   Const csVisible As String = "Lösung einblenden"
   With ActiveSheet.CommandButton5
      If .Caption = csHidden Then
ActiveSheet.Columns("AA:AC").EntireColumn.Hidden = True
         .Caption = csVisible
      Else
         ActiveSheet.Columns("AA:AC").EntireColumn.Hidden = False
         .Caption = csHidden
      End If
   End With
End Sub

Noch ein angenehmes Restwochenende ans Forum.
LG Robert
0 Punkte
Beantwortet von robbi58 Mitglied (999 Punkte)

Einen angenehmen Abend an die Runde!

Meine Masterdatei ist so gut wie fertiggestellt mit Generierung eines neuen Blattes mit neuen Angaben und Zahlen, ein Wechsel zwischen den Blättern und vieles mehr.
Das Problem mit dem Ein- und Ausblenden von definierten Spalten funktioniert mittlerweile auch dank des Forums.
Ein kleines Problem ist mir aber beim Durchspielen aufgefallen:

Beim Wechsel auf einen anderen Level bleiben die Spalten AM : AO eingeblendet, falls der Schüler "vergisst", diese auszublenden. Ich möchte aber erreichen, dass diese beim Wechsel auf ein anderes Arbeitsblatt (z. B. Level 2) automatisch ausgeblendet werden, um zu verhindern, dass beim erneuten Anwählen des Arbeitsblattes die Lösungen nicht sofort aufscheinen. Am "einfachsten" wäre eine Lösung, dass bei einem Wechsel der Arbeitsbätter die Spalten mit den Lösungen auf allen 4 Arbeitsblättern mit den Namen Level1-4 ausgeblendet werden. Habe einige Varianten probiert, aber irgendwie will es nicht funken.
Vielleicht hat jemand einen Vorschlag/eine Idee, wie man das lösen könnte?

Danke und lG von Robert

+1 Punkt
Beantwortet von m-o Profi (22.9k Punkte)

Hallo Robert,

kopiere den folgenden Code in das VBA-Projekt deiner Arbeitsmappe:

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

With ThisWorkbook.ActiveSheet
  .Columns("AM:AO").EntireColumn.Hidden = True
End With

End Sub

Damit wird immer, wenn ein Arbeitsblatt aktiviert wird, die Spalten AM bis AO ausgeblendet. Das funktioniert aber nicht, wenn die Datei geöffnet wird. Dann müsste man noch ein Workbook-Open Makro ergänzen (auch im VBA-Projekts der Arbeitsmappe):

Private Sub Workbook_Open()

With ThisWorkbook.ActiveSheet
  .Columns("AM:AO").EntireColumn.Hidden = True
End With

End Sub

Gruß

M.O.

0 Punkte
Beantwortet von robbi58 Mitglied (999 Punkte)
Hallo M.O.!

Wie gewohnt funktioniert dein Code und damit ist auch das letzte Problemchen meines Konzepts gelöst.
Ein kleiner Schönheitsfehler bleibt jedoch: der von mir gepostete Code und der von dir von heute morgen "stehen sich gegenseitig im Wege".
Wenn ich die Lösungen im Arbeitsblatt einschalte und dann den Level wechsle, so werden die Lösungsspalten wie gewünscht ausgeblendet. Kehre ich auf das Blatt zurück, sind die Spalten wie gewünscht ausgeblendet, aber der Button zeigt immer noch an "Lösung ausblenden". Durch zweimaliges Klicken auf diesen kann man dann wieder wie gewohnt die Lösungen einblenden.

Danke nochmals und liebe Grüße von Robert
+1 Punkt
Beantwortet von steffen2 Experte (6.4k Punkte)

ergänze an passender Stelle

if Columns("AM").EntireColumn.Hidden = True Then
    Button ... .Text = ...


so müsste es theoretisch gehen. Ungetestet.

0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)

Hallo Robert,

passe die Makros wie folgt an:

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim obj As Object

With ThisWorkbook.ActiveSheet
  .Columns("AM:AO").EntireColumn.Hidden = True
  'Text des CommandButtons ändern
  For Each obj In .OLEObjects
    If obj.Object.Caption = "Lösung ausblenden" Then obj.Object.Caption = "Lösung einblenden"
  Next obj

End With

End Sub


Das Auto-Open-Makro musst du entsprechend ändern.

Gruß

M.O.

0 Punkte
Beantwortet von robbi58 Mitglied (999 Punkte)
Ein herzliches Hallo an die Runde!
Dank an Steffen2 und M.O.
Nun ist auch dieses Problem mit eurer Hilfe gelöst und ich kann nun endlich meine Masterdatei mit anderen Inhalten füllen.

LG Robert
...