Excel VBA alle nicht verwendeten Spalten und Zeilen ausblenden und nur verwendete einblenden.

Diskutiere und helfe bei Excel VBA alle nicht verwendeten Spalten und Zeilen ausblenden und nur verwendete einblenden. im Bereich Microsoft Office im Windows Info bei einer Lösung; Hallo, ich beschäftige mich derzeit mit dem Buch "VBA mit Excel" Hier wird unteranderem erklärt wie man Spalten und Zeilen per Macro ein und... Dieses Thema im Forum "Microsoft Office" wurde erstellt von Armin Bral, 24. Dezember 2017.

  1. Armin Bral
    Armin Bral Gast

    Excel VBA alle nicht verwendeten Spalten und Zeilen ausblenden und nur verwendete einblenden.


    Hallo,



    ich beschäftige mich derzeit mit dem Buch "VBA mit Excel"

    Hier wird unteranderem erklärt wie man Spalten und Zeilen per Macro ein und ausblenden kann.



    Nun kam mir der Gedanke, dass man bei einer Tabelle alle Zeilen und Spalten - die unbenutzt sind - ausblenden lassen könnte.

    (Es geht hier um keinen konkreten Anwendungsfall, sondern lediglich um das Lernen, Üben und Ausprobieren.)

    Hier bietet sich "UsedRange.Address" an.



    Ich habe also ein Tabellenblatt angelegt und $A$1 bis $K$18 mit Nullen gefüllt.

    Wenn ich nun per >>Debug.Print UsedRange.Address<< den benutzten Bereich im Direktfenster ausgeben lasse, erscheint wie erwartet

    >> $A$1:$K$18



    Nun führe ich folgendes Macro aus:

    Sub ShowUsedCells()

    ' Bei Aufruf nach Änderung von Zellinhalten stimmt die Darstellung nicht immer.

    ' Hier hilft es (manchmal) erst einmal alle Zellen wieder einblenden zu lassen. (Seltsam)

    '' Alle Spalten einblenden

    Sheets("Test").Range("$A$1:$XFD$1048576").EntireColumn.Hidden = False

    '' Alle Zeilen einblenden

    Sheets("Test").Range("$A$1:$XFD$1048576").EntireRow.Hidden = False



    '' Ausgabe im Direktfenster "Uhrzeit $A$1:$K$18"
    Debug.Print Time & " " & UsedRange.Address

    '' Alle Spalten ausblenden
    Sheets("Test").Range("$A$1:$XFD$1048576").EntireColumn.Hidden = True

    '' Alle Zeilen ausblenden
    Sheets("Test").Range("$A$1:$XFD$1048576").EntireRow.Hidden = True


    '' Nur die benutzten Zeilen einblenden

    Sheets("Test").Range(UsedRange.Address).EntireRow.Hidden = False

    '' Nur die benutzten Spalten einblenden
    Sheets("Test").Range(UsedRange.Address).EntireColumn.Hidden = False


    '' Ausgabe im Direktfenster "Falsch"
    Debug.Print Sheets("Test").Range(UsedRange.Address).EntireColumn.Hidden

    '' Ausgabe im Direktfenster "Falsch"

    Debug.Print Sheets("Test").Range("A:A").EntireColumn.Hidden

    '' Ausgabe im Direktfenster "Wahr"
    Debug.Print Sheets("Test").Range("L:L").EntireColumn.Hidden

    ' (In der Ansicht ist meistens nichts zu sehen und man muss den Cursor per Pfeiltasten verschieben, damit man die

    ' sichtbaren Zellen sieht. Dies wird durch folgende Zeile automatisiert.

    '' Cursor in erste Zelle der benutzten Zellen setzen.

    Sheets("Test").Range(Left(UsedRange.Address, InStr(1, UsedRange.Address, ":", vbTextCompare) - 1)).Select
    End Sub



    Nun zu meinem Problem:

    Ich führe nun das Macro aus und es werden mir nur die Zellen A1 bis K18 angezeigt. Alle anderen Zeilen und Spalten werden wie gewollt ausgeblendet.

    Wenn ich nun die Nullen in der Spalte K lösche und das Macro erneut ausführe, wird nun richtigerweise A1 bis J18 angezeigt.

    Trage ich in der Spalte K (nach einblenden) die Nullen wieder ein und führe das Macro erneut aus, wird wieder nur A1 bis K18 angezeigt. (soweit Tiptop)



    Trage ich jetzt auf L19 eine Null ein und führe das Macro aus wird mir seltsamerweise A1 bis K19 angezeigt.

    Richtigerweise wir eine zusätzliche Zeile (19) angezeigt. Aber die Spalte L bleibt immer noch ausgeblendet. Auch die Ausgabe im Direktfenster für die Spalte L bestätigt dies mit der Ausgabe für die Eigenschaft Hidden = Wahr (ausblenden).

    Auch wenn ich nun allen Zellen in der Spalte L Werte zuweise ändert sich nichts an der Tatsache.

    Ebenso wenig wenn ich in Zeile 19 allen Zellen Werte zuweise. Es werden mir nach wie vor nur A1 bis K19 angezeigt und die Hidden-Eigenschaft für L bleibt "Wahr".



    Auch seltsam ist, wenn ich alle Werte aus Zeile 19 und Spalte L lösche und anschließend alle Werte aus Spalte K lösche, sodass nun nur noch Werte von A1:J18 enthalten sind, bekomme ich nach ausführen des Macros A1:K18 angezeigt. Erst wenn ich die Datei schließe und wieder öffne, bekomme ich eine korrekte Anzeige A1:J18 (was ja eingangs auch so wunderbar funktioniert hatte => (soweit Tiptop)). Genauso kann ich nun die Werte in K und J löschen und die Anzeige ist nun korrekt von A1 bis I18.



    Um das Ganze nochmal auf die Spitze zu treiben, schließe ich nun die Datei mit Werten in A1 bis I18.

    Öffne sie und trage in M23 eine Null ein. Nun speichere und schließe ich erneut. Nach dem Öffnen der Datei bekomme ich im Direktfenster für den UsedRange.Address $A$1:$M$23 angezeigt.

    Aber wie man schon vermuten könnte, stimmt die Anzeige in der Tabellenansicht nicht. Hier bekomme ich nun A1 bis K23 angezeigt.

    Die Spalten M und L werden wieder nicht angezeigt, nur die neuen Zeilen. Auch wenn ich das Spiel wiederhole und alle Zellen A1 bis M23 fülle, dasselbe Ergebnis (mit und ohne neu Öffnen der Datei).



    Liegt hier ein Bug vor oder befindet sich das Problem zwischen Tastatur und Stuhl?

    Warum verhält sich Excel bei gleichem VBA Code unterschiedlich?

    Betriebsystem: Windows 10 pro 64 bit

    Officesuit: MS Office 365 Home
     
  2. Claus Busch Win User

    Excel VBA alle nicht verwendeten Spalten und Zeilen ausblenden und nur verwendete einblenden.

    Hallo Armin,

    du machst das Ganze etwas zu kompliziert.

    Lese den UsedRange aus und splitte in auf in ein Array. Blende dann nur die nicht benutzten Zeilen und Spalten aus:

    Sub Ausblenden()
    
    Dim strUR As String
    
    Dim LRow As Long
    
    Dim LCol As Integer
    
    Dim varTmp As Variant
    With ActiveSheet
    
       strUR = .UsedRange.Address
    
       varTmp = Split(strUR, ":")
    
       LRow = Split(varTmp(1), "$")(2)
    
       LCol = Columns(Split(varTmp(1), "$")(1)).Column
    
       .Rows(LRow + 1 & ":1048576").Hidden = True
    
       .Range(.Cells(1, LCol + 1), .Cells(1048576, 16384)) _
    
          .EntireColumn.Hidden = True
    
    End With
    
    End Sub
    
    Sub Einblenden()
    
    With ActiveSheet.Range("A1:XFD1048576")
    
       .EntireRow.Hidden = False
    
       .EntireColumn.Hidden = False
    
    End With
    
    End Sub
    Claus
  3. Armin Bral Win User

    Excel VBA alle nicht verwendeten Spalten und Zeilen ausblenden und nur verwendete einblenden.

    Sheets("Test").Range(UsedRange.Address).EntireColumn.Hidden = False
    Mal 'ne blöde Frage:

    Du referenzierst hier explizit auf Sheets("Test"), aber den
    UsedRange nicht...

    Der Code geht sowieso nur in einem Codemodul einer Tabelle...

    Der Code ist nicht zufälligerweise in einem Codemodul einer anderen Tabelle?

    Ich tippe mal ja, denn das würde das beschriebene Verhalten erklären.

    Andreas.

    Ja du hast recht, dass ich einmal explizit referenziere und einmal nicht. Das find ich selbst ein wenig "seltsam", ist hier aber relativ trivial, da es nicht darum geht einen "perfekten" Code zu schreiben, sondern nur Übungszwecken dient. Ich finde es merkwürdig,
    dass ich Dinge explizit referenzieren kann, aber auch "Unterelemente" einfach direkt ansprechen kann. Da weiß man eigentlich nicht immer unbedingt direkt zu welchem "Überobjekt" das Element, das man anspricht, eigentlich gehört.

    Und nein, der Code steht im selben Sheet. Die richtige Lösung wäre - denke ich - wenn man Variablen erstellt und die Dinge die man anspricht diesen Variablen zuordnet. Das hab ich hier in der "QuickAndDirty" Variante jedoch bewusst ausgelassen. Und wie bereits
    erwähnt, war mein Fehler, dass das UsedRange.Address-Objekt seinen Wert zur Laufzeit ändert.

    Gruß Armin
  4. Andreas Killer Win User

    Excel VBA alle nicht verwendeten Spalten und Zeilen ausblenden und nur verwendete einblenden.

    Sheets("Test").Range(UsedRange.Address).EntireColumn.Hidden = False
    Mal 'ne blöde Frage:

    Du referenzierst hier explizit auf Sheets("Test"), aber den
    UsedRange nicht...

    Der Code geht sowieso nur in einem Codemodul einer Tabelle...

    Der Code ist nicht zufälligerweise in einem Codemodul einer anderen Tabelle?

    Ich tippe mal ja, denn das würde das beschriebene Verhalten erklären.

    Andreas.
  5. Armin Bral Win User

    Excel VBA alle nicht verwendeten Spalten und Zeilen ausblenden und nur verwendete einblenden.

    Hallo Claus,

    ich habe eben noch mal mit meinem ursprünglichen Code gespielt und auch eine zusätzliche Sub ausprobiert.

    Wenn ich den zu bearbeitenden Bereich direkt als String eingebe funktioniert alles wie gewollt. Sobald ich aber UsedRange.Address verwende, passieren wieder merkwürde Dinge.

    Also habe ich UsedRange.Address in eine eigene Variable am Code-Anfang meiner ursprünglichen Sub gepackt und siehe da, UsedRange.Address ändert sich zur Laufzeit.

    Hier ein Ausschnitt:

        Dim strUsedRangeAddress As String
    
        strUsedRangeAddress = Sheets("Test").UsedRange.Address
    
        [b]Debug.Print Time & " " & strUsedRangeAddress[/b]
    
        Sheets("Test").Range("$A$1:$XFD$1048576").EntireColumn.Hidden = False
    
        Sheets("Test").Range("$A$1:$XFD$1048576").EntireRow.Hidden = False
    
        [b]Debug.Print Time & " " & UsedRange.Address[/b]
    Ergebnis im Direktbereich:

    14:50:53 $A$1:$I$[b]30[/b]
    
    14:50:53 $A$1:$I$[b]18[/b]
    Die erste Zeile ist der Inhalt meiner Variablen und die zweite der von UsedRange.Address. (Am Inhalt der Zellen im Sheet wurde nichts geändert!)

    Das "Witzige" daran ist, dass ich den Code so oft hinter einander ausführen kann wie ich will. Ich erhalte immer dieselben Ergebnisse im Direktfenster (Außer für die Uhrzeit - die ist immer aktuell ;-) ).

    Also ja, ihr habt schon recht mit der Ermittlung des benutzten Bereiches. Die Quintessenz ist, dass man sich nicht auf UsedRange.Address verlassen darf, da dieses zur Laufzeit seinen Wert ändert und einen somit in die Irre führt.

    Problem solved. Danke für eure Zeit und eure Mühe.

    Zu deiner Meldung Claus.

    Genau deswegen (falsche Darstellung) blende ich erst alles ein und anschließend wieder aus. Wenn ich das nicht getan hatte, hatte ich ebenfalls Darstellungsfehler. Ich denke du hast nicht ganz Unrecht, wenn man die Bereiche richtig
    ermittelt und sich nicht - wie ich - auf UsedRange.Address verlässt, dann wird deine Variante wohl auch funktionierten. Wobei du bei deiner Variante noch berücksichtigen müsstest, dass auch Zellen über und links vom benutzten Bereich unbenutzt sein könnten.

    Gruß Armin.
  6. Armin Bral Win User

    Excel VBA alle nicht verwendeten Spalten und Zeilen ausblenden und nur verwendete einblenden.

    Hallo Andreas,

    ja das stimmt schon, dass UsedRange.Address nicht unbedingt den richtigen Inhalt hat.

    Darauf will ich aber auch gar nicht hinaus. Worauf ich hinaus will ist, wenn ich

        '' Nur die benutzten Zeilen einblenden    Sheets("Test").Range(UsedRange.Address).EntireRow.Hidden = False    '' Nur die benutzten Spalten einblenden
    
        Sheets("Test").Range(UsedRange.Address).EntireColumn.Hidden = False
    einen String mit gebe, der den genau zu bearbeiteten Bereich festlegt, dann erwarte ich von Excel, dass eben genau dieser Bereich entsprechend bearbeitet wird. Genau das passiert aber
    nicht immer.

    Ich könnte ja statt UsedRange.Address auch einfach selbst den String "$B$5:$J$13" eingeben.

    Dann müssten die Spalten B bis J und die Zeilen 5 bis 13 eingeblendet werden. So wie ich Excel erlebe könnte es funktionierten, vielleicht auch nicht und ich bekomme nur B5 bis E12 angezeigt.

    Du hast schon recht mit dem Argument, dass eine Zelle auch "leer" sein könnte und einfach nur eine Hintergrundfarbe hat. In dem Fall wäre das für mich auch eine benutzte Zelle. Aber auch dies ist für mich an der Stelle ersteinmal
    trivial. Mir geht es explizit darum, dass ich einem Funktionsaufruf ein eindeutiges Argument übergebe, eine bestimmte Erwartungshaltung an die Umsetzung habe und dies Mal geschieht und Mal nicht.

    Es ist mir an der Stelle völlig egal wie der String zustande kommt oder ob er den richtigen Bereich beschreibt, solange er das benötige Format hat.

    "$Spaltevon$Zeilevon:$Spaltebis$Zeilebis"

    Ob er den richtigen Bereich angibt ist wieder mein Problem. Aber ich erwarte von Excel, wenn ich sage, blende mir von hier bis da ein/aus, dass dann auch genau das getan wird.

    Ich vermute die Lösung des Problems liegt ganz einfach darin, dass man wirklich jede Spalte/Zeile einzeln auf Benutzung (welcher Art auch immer) überprüfen muss und dann einzeln ein und ausblenden lassen muss.

    Gruß Armin
  7. User Advert


    Hi,

    willkommen im Windows Forum!
Thema:

Excel VBA alle nicht verwendeten Spalten und Zeilen ausblenden und nur verwendete einblenden. - Microsoft Office

Die Seite wird geladen...

Excel VBA alle nicht verwendeten Spalten und Zeilen ausblenden und nur verwendete einblenden. - Similar Threads - Excel VBA verwendeten

Forum Datum

Excel- Einblenden von Spalten verhindern

Excel- Einblenden von Spalten verhindern: Hallo Zusammen,gibt es eine Möglichkeit wie ich verhindern kann, dass ausgeblendete Spalten eingeblendet werden?Vielen Dank!Viele GrüßeC.H.
Microsoft Office 8. Februar 2023

Excel Zeile ausblenden

Excel Zeile ausblenden: Guten Morgen zusammen,ich würde gerne eine Zeile ausblenden. Mir wird das Option "ausblenden" aber nicht angezeigt.Das Blatt ist aktuell nicht geschützt.Danke für die Hilfe im VorausViele Grüße...
Microsoft Office 29. Oktober 2022

Spalten einblenden

Spalten einblenden: Hallo,ich habe über eine Makroaufzeichnung Spalten nach rechts ausgeblendet.Aus irgendwelchen Gründen funktioniert das Makro nicht mehr und ich bekomme die Spalten nicht mehr eingeblendet.Der...
Microsoft Office 16. April 2022

Spalten und Zeilen gruppieren/ausblenden

Spalten und Zeilen gruppieren/ausblenden: Hallo, ich finde das Gruppieren von Spalten oder Zeilen damit die mit einem Plus oder Minus Zeichen ein- oder ausblenden kann nicht mehr. Das war im Start-Menuband... Wer kann mir helfen?...
Microsoft Office 25. November 2018

Wenn man bei Word Spalten verwendet, und man diese aktualisieren will. Was muss man...

Wenn man bei Word Spalten verwendet, und man diese aktualisieren will. Was muss man...: Kronbichler WA Kuf. Glas tausch Top 6 KW29 Rettenwander 1 Türelement UT431 X Element auf der Baustelle 2017 Kofler Fritz Bvh Kundl...
Microsoft Office 24. Juli 2018

gelöschte Gruppe aus "Häufig verwendet" ausblenden

gelöschte Gruppe aus "Häufig verwendet" ausblenden: Sehr geehrte Damen und Herren, obwohl ich vor einiger Zeit die Gruppe formularebsz gelöscht habe, wird mir diese im Onedrive und im Sharepoint unter "Häufig verwendet"angezeigt. Wenn man dann...
Microsoft Office 11. Dezember 2017

+/- Button zum Aus- und Einblenden von Zeilen in Excel

+/- Button zum Aus- und Einblenden von Zeilen in Excel: Guten Abend Kollegen, kann mir jemand erklären wie ich zu einem + / - Button komme welcher Zeilen ein und ausblendet - aber nicht die herkömmliche Gliederung sondern in folgendem Format: [IMG]...
Microsoft Office 23. Januar 2017
Excel VBA alle nicht verwendeten Spalten und Zeilen ausblenden und nur verwendete einblenden. solved
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.