M
MSCom
Neuer Benutzer
Threadstarter
- Dabei seit
- 20.09.2016
- Beiträge
- 1
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> $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 bisK19 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 bisK23 angezeigt.
Die Spalten M und L werden wieder nicht angezeigt, nur die neuen Zeilen. Auch wenn ich das Spiel wiederhole undalle 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
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> $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 bisK19 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 bisK23 angezeigt.
Die Spalten M und L werden wieder nicht angezeigt, nur die neuen Zeilen. Auch wenn ich das Spiel wiederhole undalle 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