Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1156to1160
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Mehrere Zeilen gleichzeitig ausblenden in Wsht

Mehrere Zeilen gleichzeitig ausblenden in Wsht
Peter
Guten Abend
Kann ich ausgehend von einem String wie
25;39;42;51 resp.
25,39,42,51
nachdem ich den ersten String mit strAUS= WorksheetFunction.Substitute(strAUS, ";", ",")
die entsprechenden Zeilen in der Tabelle "Aufstellung" gleichzeitig ausblenden?
Wenn ich dies in Excel händisch mache, muss ich mit GEHEZU 25:25;39:39;42:42;51:51 anwählen und dann als zweite Aktion diese markerten Zeilen ausblenden.
Kann ich die Spalten in VBA z.B. C25,C39,C42,C51 auf einmal ansprechen (ohne zu markieren) und dann ausblenden?
Danke für jeden Hinweis.
Gruss, Peter
AW: Mehrere Zeilen gleichzeitig ausblenden in Wsht
19.05.2010 19:28:18
jowe
Hallo Peter,
Sub zeilen_ausblenden()
Dim strAus, i
strAus = Array(25, 39, 42, 51)
For i = LBound(strAus) To UBound(strAus)
Rows(strAus(i)).Hidden = True
Next
End Sub

Sub spalten_ausblenden()
Dim strAus, i
strAus = Array("C", "F", "H")
For i = LBound(strAus) To UBound(strAus)
Columns(strAus(i)).Hidden = True
Next
End Sub

Sub alle_Zeilen_einblenden()
Rows.Hidden = False
End Sub

Sub alle_Spalten_einblenden()
Rows.Hidden = False
End Sub
Gruß
Jochen
Anzeige
AW: Mehrere Zeilen gleichzeitig ausblenden in Wsht
19.05.2010 19:43:59
Peter
Hallo Peter
zum Beispiel so...
Sub Ausblenden()
Dim t As String
Dim i As Integer
Dim a As Variant
t = "1,2,3,25,39,42,51"
a = Split(t, ",", -1)
For i = 0 To UBound(a)
Rows(i + 1).EntireRow.Hidden = True
Next
End Sub
Gruß
Peter
AW: Mehrere Zeilen gleichzeitig ausblenden in Wsht
19.05.2010 22:27:44
Peter
Hallo zusammen
Danke für die Antworten
Ich habe nun den Code von jowe versucht umzusetzen:
Sub Zeilen_Ausblenden()
Dim strAus, i, strF As String, strSheet As String
strSheet = Range("AUS").Parent.Name
strF = ";"
strAus = Range("Null").Value   'i.d.R. ein String im Format "11;34;79"
If Not IsNumeric(Left(strAus, 1) * 1) Then Exit 

Sub  'falls erstes Zeichen keine Zahl
strAus = WorksheetFunction.Substitute(strAus, ";", ",")
strAus = Array(strAus)
With Sheets(strSheet)
For i = LBound(strAus) To UBound(strAus)
.Rows(strAus(i)).Hidden = True
Next
End With
End Sub

Auf der Zeile
.Rows(strAus(i)).Hidden = True
stoppt der Code. Weshalb wohl? Mein Code steht in einem Modul, die auszublendenden Zeilen in der gleichen Tabelle, in der der Range "Aus" zu finden ist.
Was habe ich da falsch umgesetzt?
Danke für eine Antwort.
Peter
PS.: Muss beim übergebenden String für den Array nach dem , (Komma) jeweils noch ein Leerschlag vorhanden sein?
Anzeige
Mehrere Zeilen gleichzeitig ausblenden
20.05.2010 00:42:29
Erich
Hi Peter,
hier zwei Möglichkeiten (eine ähnelt der vom anderen Peter):

Sub Zeilen_Ausblenden2()
Dim strAus As String, i, strF As String, strSheet As String, arrZ, rngAus As Range
strSheet = Range("AUS").Parent.Name
strF = ";"
strAus = Range("Null").Value                 'i.d.R. ein String im Format "11;34;79"
If Not IsNumeric(Left(strAus, 1) * 1) Then Exit Sub 'falls erstes Zeichen keine Zahl
arrZ = Split(strAus, strF)
With Sheets(strSheet)
Set rngAus = .Cells(arrZ(0), 1)
For i = 1 To UBound(arrZ)
Set rngAus = Union(rngAus, .Cells(arrZ(i), 1))
Next
End With
rngAus.EntireRow.Hidden = True
End Sub
Sub Zeilen_Ausblenden1()
Dim strAus As String, i, strF As String, strSheet As String, arrZ
strSheet = Range("AUS").Parent.Name
strF = ";"
strAus = Range("Null").Value                 'i.d.R. ein String im Format "11;34;79"
If Not IsNumeric(Left(strAus, 1) * 1) Then Exit Sub 'falls erstes Zeichen keine Zahl
arrZ = Split(strAus, strF)
With Sheets(strSheet)
For i = LBound(arrZ) To UBound(arrZ)
.Rows(arrZ(i)).Hidden = True
Next
End With
End Sub
Zeilen_Ausblenden2 blendet etwas "gleichzeitiger" aus - hier wird zunächst in einem Range gesammelt,
wo ausgeblendet werden soll, und dann werden am Ende alle Zeilen zusammen ausgeblendet.
Das flackert dann weniger.
Noch eine paar Bemerkungen zu deinem Code:
Mit strAus = Array(strAus)
machst du aus einem String "1,2,3" ein Array, das als einziges Element
strAus(0) = "1,2,3"
enthält. LBound(strAus) und UBound(strAus) sind beide 0.
Mit strAus = Array(strAus) wird nicht automatisch derString aufgespalten nach den Kommata,
es entsteht also so nicht Array(1, 2, 3). Dafür gibt es die Fkt. Split().
Du hast strAus als Variant deklariert und nutzt die Variable sowohl für den String als auch für ein Array.
Das würde ich nicht tun...
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Mehrere Zeilen gleichzeitig ausblenden
20.05.2010 08:00:25
Peter
Hallo Erich
Ich habe die Variante 2 genommen un das hat auf Anhieb geklappt. (sicher wirst du ja festgestellt haben, dass ich die mit deiner Hilfe implementierte Funktion - Zeilen mit Nullen in bestimmten Spalten - nun verwende, um diese auszublenden. Vielen Dank für diesen super Support.
Ich habe zwei Anschlussfragen:
Ich habe noch das Berechnen ausgeschaltet und die Bildschirmaktualisierung ausgeschaltet, deshalb habe ich einen Errorhandler eingebaut, da ich nicht einfach so mit ~fExit Sub~f aus diesem Code aussteigen kann. Das scheint so zu funktionieren, wäre aber froh, wenn du das auch noch kritisch ansehen könntest.
Da das Ausblenden so gut geklappt hat, dachte ich, dass auch das Gegenteil gut klappt. Deshalb habe ich auch noch ein Zeilen_Einblenden Code versucht abzuleiten. Dieser funktioniert noch nicht, und wohl deshalb, weil in der Zelle benannt mit "NichtNull" nicht nur die Zeilennummern sondern, Zellbezüge, z.B. H13;H19;H44 oder vielleicht nur H17 steht. Nun ist mir nicht kar, was ich sonst noch anpassen muss, dass dann - beispielsweise bei den erwähnten Bezügen - die Zeilen 13;19 und 44 eingeblendet werden esp. die Zeile 17 eingeblendet wird.
Danke für eine gelegentliche Antwort und beste Grüsse,
Peter
Sub Zeilen_Ausblenden()
On Error GoTo ErrHandler:
Dim strAus As String, i, strF As String, strSheet As String, arrZ, rngAus As Range
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
strSheet = Range("AUS").Parent.Name
strF = ";"
strAus = Range("Null").Value                 'i.d.R. ein String im Format "11;34;79"
If Not IsNumeric(Left(strAus, 1) * 1) Then GoTo ErrHandler 'falls erstes Zeichen keine Zahl
arrZ = Split(strAus, strF)
With Sheets(strSheet)
Set rngAus = .Cells(arrZ(0), 1)
For i = 1 To UBound(arrZ)
Set rngAus = Union(rngAus, .Cells(arrZ(i), 1))
Next
End With
rngAus.EntireRow.Hidden = True
GoTo ErrHandler
ErrHandler:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Exit Sub
End Sub

Sub Zeilen_Einblenden()
On Error GoTo ErrHandler:
Dim strEin As String, i, strF As String, strSheet As String, arrZ, RngEin As Range
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
strSheet = Range("EIN").Parent.Name
strF = ";"
strEin = Range("NichtNull").Value                 'i.d.R. ein String im Format "11;34;79"
If Not IsNumeric(Right(strEin, 1) * 1) Then GoTo ErrHandler 'falls erstes Zeichen keine Zahl
arrZ = Split(strEin, strF)
With Sheets(strSheet)
Set RngEin = .Cells(arrZ(0), 1)
For i = 1 To UBound(arrZ)
Set RngEin = Union(RngEin, .Cells(arrZ(i), 1))
Next
End With
RngEin.EntireRow.Hidden = False
GoTo ErrHandler
ErrHandler:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Exit Sub
End Sub

Anzeige
Kritischer Blick
20.05.2010 09:52:14
Erich
Hi Peter,
sorry, an deinem Code habe ich einige Dinge "anzumeckern" - ich hoffe, dass ich das darf...
Nur eine Konvention, aber wie ich glaube, recht sinnvoll:
Deklarationen ("Dim ..." ) sollten ganz oben in der Prozedur stehen, danach erst z. B. "On Error GoTo ErrHandler"
On Error GoTo ErrHandler braucht keinen Doppelpunkt am Ende. (Den könnte man hinter jede Anweisung schreiben.)
"If Not IsNumeric(Left(strAus, 1) * 1) Then": Die Prüfung ist nicht möglich - das erste Zeichen ist jetzt ein Buchstabe.
"IsNumeric(Left(strAus, 1) * 1)" mach keinen Sinn. Wenn Left(strAus, 1) z. B. = "#" ist, gibt "#" * 1 einen Laufzeitfehler.
IsNumeric() kommt gar nicht mehr dran. Das hatte ich bei meinem letzten Post noch nicht bemerkt...
Besser wäre:
If IsNumeric(Left(strAus, 1)) then
Das liefert True, wenn das erste Zeichen von strAus in eine Zahl umgewandelt werden kann.
Die Behandlung von Application.Calculation und ...ScreenUpdating halte ich hier für überflüssig.
Es gibt eine einzige Anweisung, die etwas in der Tabelle ändert, und die wird nur ein einziges Mal asugeführt,
nicht in einer Schleife. Da haben diese Beschleuniger keine Wirkung.
"GoTo ErrHandler" kurz vor Ende ist überflüssig, die Marke "ErrHandler:" kommt sofort dahinter.
"Exit Sub" kurz vor Ende ist überflüssig, "End Sub" ist ohnehin die nächste Anweisung.
So, nach dem vielen Gemecker nun mein Vorschlag:
Wenn in "NichtNull" eine Bereichsadresse (Adresse eines zusammengesetzten Bereichs) steht,
kann man diese Adresse direkt zum Aus- oder Einblenden verwenden:

Sub Zeilen_Einblenden2()
Dim strEin As String, wkSheet As Worksheet
On Error GoTo ErrHandler
Set wkSheet = Range("EIN").Parent
strEin = Range("NichtNull").Value               ' String im Format "A11;X34;CA79"
wkSheet.Range(Replace(strEin, ";", ",")).EntireRow.Hidden = False
Exit Sub                      ' hier nötig, damit Fehler-MsgBox übersprungen wird
ErrHandler:
MsgBox "Fehler " & Err.Number & vbLf & Err.Description & vbLf & "ist aufgetreten."
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Kritischer Blick
20.05.2010 10:22:39
Peter
Hallo Erich
Herzlichen Dank, solche Antworten sind sehr lehrreich!
Ich habe nun die Anpassungen vorgenommen und es klappt fast alles. Einzig folgendes kann ich noch nicht lösen.
Das Zeilen_Einblenden klappt einwandfrei, nur muss ich dann nach Ablauf des Markos noch F9 drücken, damit die im Sheet vorhandenen Funktionen aktualisiert werden.
Ich habe dann F9 mit dem MacroRecorder aufgezeichnet, was "Calculate" ergibt.
Wenn ich das Calculate in den Code integriere, ergibt dies eine Fehlermeldung ("Typen unverträglich").
Auch mit Sheets(wkSheet).Calculate komme ich nicht weiter.
Wie muss dieser "NeuBerechnen Befehl" für diese Tabelle in den Code einfliessen?
Danke für eine Antwort und freundlicher Gruss, Peter
Anzeige
etwas anders
20.05.2010 11:03:19
Erich
Hi Peter,
das mit dem Calculate könnte so funzen:
wkSheet.Calculate
oder
Application.Calculate
oder - "Application." kann man weglassen -
Calculate
Sheets(wkSheet) hat keinen Sinn - wkSheet ist ein Worksheet, und ein Sheet von einem Worksheet gibt es nicht.
Dazu müsste wkSheet eine Variable sein, der den Namen des Sheets oder seinen Indes enthält, also so:
Sheets(Blattname) oder Worksheets(ii)
Warum ist Calculate nötig? Ist die automatische Berechnung ausgeschaltet?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: etwas anders
20.05.2010 13:57:59
Peter
Hallo Erich
Danke für die Antworten.
Berechnen ist ganz normal eingeschaltet. Ich habe jedoch in der Taabelle wkSheet verschiedene UDFs, die nur gerechnet werden, wenn ich in dieser Tabelle explizit eine Eingabe mache oder F9 drücke. Wenn ich mittels Makor eine Zeile einblende (was dann in bestimmten UDFs ein anderes Ergebnis gibt), werden diese Zellen mit UDFs nicht neu berechnet, auch wenn im Code wkSheet.Calculate oder Calculate steht.
Man kann sich natürlich daran gewöhnen, routinemässig F9 zu drücken, aber das zu automatisieren wäre eleganter.
Gruss, Peter
Anzeige
AW: etwas anders
20.05.2010 23:11:38
Peter
Hallo Erich
Meine wirkliche Datei ist relativ gross, deshalb brauchte es etwas Zeit grosse Teile zu löschen, um das Problem demonstrieren zu können.
https://www.herber.de/bbs/user/69672.xls
Wenn du die hochgeladene Datei öffnest, siehst du eine einfache Tabelle, anhand welcher ich meine Fragestellung erklären kann:
Die gelben Bereiche sind mit "Zahlen_B" resp. "Zahlen_V" benannt und werden von Formeln im blauen Bereich ausgewertet.
Wenn du beispielsweise die Zeile 9 einblendest, sind auf dieser Zeile je zwei Nullen (grün markiert) ersichtlich; sonst passiert nichts. Wenn du dann F9 drückst, erscheint in Bereich E1:E18 eine rot-schwarze Schraffierung. Es handelt sich um eine bedingte Formatierung, die aktiv ist, wenn in Zelle F26 und/oder H26 nicht die Werte Null enthalten sind.
Nun kannst du über das benutzerdefinierte Menu "Tool" diese Zeile wieder ausblenden. Die Schraffierung bleibt, erst nach Betätigen der Taste F9 verschwindet die Schraffierung.
Jetzt kannst du die Zeilen 6 und 7 ausblenden. Es passiert nichts, bevor nicht wieder die Taste F9 betätigt wird. Nun kann über das benutzerdefinierte Menu "Tool" diese Zeilen wieder eingeblendet werden. Die Schraffierung bleibt und wird wieder mit der Taste F9 zum verschwinden gebracht.
Meine Frage in diesem Zusammenhang ist, ob man nicht beim Ein- resp. Ausblenden - zumindest, wenn es über den Code passiert, die Funktion der Taste F9 in den Code integrieren kann.
Vielleicht will ich ja zuviel? Dann will ich dich nicht weiter bemühen.
Danke und freundlicher Gruss, Peter
Anzeige
Calculate nach Einblenden und Ausblenden
21.05.2010 10:48:37
Erich
Hi Peter,
auf manuelles Ein-/Ausblenden per Makro zu reagieren, ist zumindest etwas komplizierter,
da müsste ich erst mal "wühlen", ob und wie das ginge.
Wenn aber das Ein-/Ausblenden per Makro passiert, dann geht das. Du hattest wohl das Calculate
nicht an die richtige Stelle platziert. Probier mal:

Sub Zeilen_Ausblenden()
Dim strAus As String, i, strF As String, strSheet As String, arrZ, rngAus As Range
strSheet = Range("AUS").Parent.Name
strF = ";"
strAus = Range("AUS").Value                 'i.d.R. ein String im Format "11;34;79"
If Not IsNumeric(Left(strAus, 1)) Then Exit Sub
arrZ = Split(strAus, strF)
With Sheets(strSheet)
Set rngAus = .Cells(arrZ(0), 1)
For i = 1 To UBound(arrZ)
Set rngAus = Union(rngAus, .Cells(arrZ(i), 1))
Next
End With
rngAus.EntireRow.Hidden = True
Calculate
End Sub
Sub Zeilen_Einblenden()
Dim strEin As String, wkSheet As Worksheet
On Error GoTo ErrHandler
Set wkSheet = Range("EIN").Parent
strEin = Range("EIN").Value               ' String im Format "A11;X34;CA79"
wkSheet.Range(Replace(strEin, ";", ",")).EntireRow.Hidden = False
Calculate
Exit Sub                      ' hier nötig, damit Fehler-MsgBox übersprungen wird
ErrHandler:
MsgBox "Fehler " & Err.Number & vbLf & Err.Description & vbLf & "ist aufgetreten."
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Calculate nach Einblenden und Ausblenden
21.05.2010 21:17:52
Peter
Hallo Erich
Danke für den wichtigen Hinweis: wenn das Calculate am richtigen Ort steht, dann geht es!
Zum Abfangen des Ereignisses Einblenden / Ausblenden habe ich mir noch folgende Überlegung gemacht.
Man könnte ja irgendwie über eine ganze Spalte abfragen, wieviele Zellen ausgeblendet sind. Jedesmal, wenn zusätzlich Zellen ausgeblendet oder wieder eingeblendet werden, wechselt das Resultat. Und das liesse sich vielleicht über ein Change Ereignis abfragen?
Gruss, Peter
AW: Calculate nach Einblenden und Ausblenden
21.05.2010 22:40:23
Peter
Hallo Erich
Ich habe nun festgestellt, dass beim manuellen Ein- oder Ausblenden von Zeilen die Berechnung auch erfolgt, und zwar wird nachfolgender Code angestossen (ausser wenn dem Namen "switch" False zugewiesen wurde, laufen die Events nicht).
Somit sind in dieser Problemstellung alle Probleme gelöst und ich danke dir (und den ersten beiden Antwortern) nochmals ganz herzlich.
Schöne Pfingsten!
Gruss, Peter
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim rngS As Range, lngS As Long, rngT As Range
If NameExists("switch") = False Then ThisWorkbook.Names.Add Name:="switch", RefersTo:="=True()"
If ThisWorkbook.Names("switch").Value = "=False()" Then Exit Sub

75 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige