nur die vorher ausgeblendete Sheets wieder einblenden

  • Excel

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von mumpel.

    nur die vorher ausgeblendete Sheets wieder einblenden

    Hallo Community,

    ich habe ein kleines Problem mit einer Druckfunktion, wo ich nicht ganz weiterkomme.
    In dier Druckfunktionen muss man vorher auswählen was man konkret drucken möchte (relevante Maschinen etc.).
    Draufhin schaut die Funktion welche Zellen gefüllt sind in dem Bereich und blendet die anderen Spalten/Zeilen aus,
    dass der Druckbereich nicht so groß ist.
    Im Anschluss kommt eine Funktion, welche alle Zeilen/Spalten wieder einblenden und da liegt das Problem.
    Jede Nutzer kann, je nachdem was für Ihn relevant ist, Spalten ausblenden. Nach betätigten des Druckbuttons
    wird jedoch zum Schluss alle ausgeblendeten Spalten wieder eingeblenden und damit auch die Spalten, welcher er vorher manuell ausgeblendet hat.

    Da jeder Nutzer andere Spalten ausblendet, kann ich nicht vorher festlegen welche Spalten wieder ausgeblendet werden sollen.
    Ich hatte überlegt, ob es möglich ist, dass die Funktion sich merkt, welche Spalten Sie ausgeblendet hat und nur diese wieder einblendet?

    Hier die groben Funktionen in Kurz:
    Hoffe Ihr könnte mir helfen:


    Druck-Button

    Visual Basic-Quellcode

    1. Private Sub CommandButton_Drucken_Click()
    2. ' diese Methode wird ausgefuehrt, wenn der Benutzer auf "Drucken" geklickt hat
    3. ' schliesse UserForm
    4. UserForm1.Hide
    5. ' Startposition des Cursors merken
    6. Dim Start As String
    7. Start = ActiveCell.Address
    8. ' Ausblenden
    9. If Not Ausblenden Then
    10. GoTo Startposition_setzen
    11. End If
    12. ' Dateiname erstellen und in Zwischenablage kopieren/einfuegen
    13. Call Dateiname_Erstellen
    14. ' Ausdrucken markieren
    15. If Not Drucken Then
    16. GoTo Startposition_setzen
    17. End If
    18. ' Cursour auf Anfangsposition setzen
    19. GoTo Startposition_setzen
    20. Exit Sub
    21. Startposition_setzen:
    22. ' alle Zeilen und alle Spalten wieder einblenden
    23. Call Einblenden
    24. ' Cursour auf Anfangsposition setzen
    25. Range("J1").Select
    26. Range(Start).Select
    27. End Sub


    Funktion Ausblenden:

    Visual Basic-Quellcode

    1. Private Function Ausblenden() As Boolean
    2. ' mit dieser Funktion werden alle Zeilen und Spalten ausgeblendet, welche nicht benoetigt werden
    3. ' true -> kein Fehler , false -> Fehler
    4. On Error GoTo Fehler
    5. ' Zelle mit ausgewaehltem Verteilungsnamen markieren und merken
    6. Range("J8").Select
    7. ActiveCell.Offset(0, ComboBox_Verteilungen.ListIndex * 2).Select
    8. Verteilung = ActiveCell.Address
    9. ' alle Verteilungen links von der gewaehlten Verteilung ausblenden
    10. ActiveCell.Offset(1, 0).Select
    11. With ActiveCell
    12. Range(Cells(.Row, 4), Cells(.Row, .Column - 1)).Select
    13. End With
    14. Selection.EntireColumn.Hidden = True
    15. ' Zelle mit Verteilungsnamen wieder markieren
    16. Range(Verteilung).Select
    17. ' Zelle mit dem Preis der ersten Angebotsposition auswaehlen
    18. ActiveCell.Offset(3, 0).Select
    19. ActiveCell.Offset(0, 1).Select
    20. ' alle Zeilen des Angebots durchlaufen bis kein Wert mehr drin steht
    21. While ActiveCell.Value <> ""
    22. ' Zeilen ausblenden wenn Wert '0' ist
    23. If ActiveCell = "0" Then
    24. ActiveCell.EntireRow.Hidden = True
    25. End If
    26. ' nächste Zeile markieren
    27. ActiveCell.Offset(1, 0).Select
    28. Wend
    29. ' da die Zelle in der Zeile "Nachtraege" leer ist, muss diese uebersprungen werden
    30. ActiveCell.Offset(1, 0).Select
    31. ' alle Zeilen des Nachtrags durchlaufen bis kein Wert mehr drin steht
    32. While ActiveCell.Value <> ""
    33. ' Zeilen ausblenden wenn Wert '0' ist
    34. If ActiveCell = "0" Then
    35. ActiveCell.EntireRow.Hidden = True
    36. End If
    37. ' nächste Zeile markieren
    38. ActiveCell.Offset(1, 0).Select
    39. Wend
    40. ' === da es vorkommen kann, dass keine Nachtraege vorhanden sind, so kann die Zeile mit der Position "Nachtraege" auch ausgeblendet werden ==
    41. ' vorletzte Zeile wieder markieren
    42. ActiveCell.Offset(-2, 0).Select
    43. ' alle Zeilen des Nachtrags rueckwaerts durchlaufen, solange dort der Wert '0' drin steht (diese Zelle ist bereits ausgeblendet)
    44. While ActiveCell.Value = "0" And ActiveCell.Row > 8
    45. ' vorherige Zeile markieren
    46. ActiveCell.Offset(-1, 0).Select
    47. Wend
    48. ' wenn die aktuelle Zelle leer ist, ist dies die Zeile mit der Text "Nachtraege" und
    49. ' kann somit auch ausgeblendet werden, da keine Nachtragspositionen vorhanden sind
    50. If ActiveCell.Value = "" Then
    51. ActiveCell.EntireRow.Hidden = True
    52. End If
    53. ' letzte Zeile markieren
    54. ActiveCell.Offset(1, 0).Select
    55. While ActiveCell.Value <> ""
    56. ' nächste Zeile markieren
    57. ActiveCell.Offset(1, 0).Select
    58. Wend
    59. ' Rueckgabe der Funktion, true -> kein Fehler
    60. Ausblenden = True
    61. Exit Function
    62. Fehler:
    63. ' Rueckgabe der Funktion, false -> Fehler
    64. Ausblenden = False
    65. ' Fehlerausgabe fuer den Benutzer
    66. MsgBox "Beim Ausblenden ist ein Fehler aufgetreten.", VbMsgBoxStyle.vbCritical, "Fehler"
    67. End Function 'Ausblenden


    Funktion Einblenden

    Visual Basic-Quellcode

    1. Private Function Einblenden() As Boolean
    2. ' mit dieser Funktion werden alle Zeilen und alle Spalten wieder eingeblendet
    3. ' true -> kein Fehler , false -> Fehler
    4. On Error GoTo Fehler
    5. ' alle Spalten wieder einblenden
    6. Cells.EntireColumn.Hidden = False
    7. ' alle Zeilen wieder einblenden
    8. Cells.EntireRow.Hidden = False
    9. ' Rueckgabe der Funktion, true -> kein Fehler
    10. Einblenden = True
    11. Exit Function
    12. Fehler:
    13. ' Rueckgabe der Funktion, false -> Fehler
    14. Einblenden = False
    15. ' Fehlerausgabe fuer den Benutzer
    16. MsgBox "Beim Einblenden ist ein Fehler aufgetreten.", VbMsgBoxStyle.vbCritical, "Fehler"
    17. End Function 'Einblenden
    Eine Variante:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim HiddenRange As Range
    3. Sub SaveHiddenRange()
    4. Dim c As Range
    5. Set HiddenRange = Nothing
    6. For Each c In UsedRange.Rows
    7. If c.EntireRow.Hidden Then
    8. If HiddenRange Is Nothing Then Set HiddenRange = c.EntireRow Else Set HiddenRange = Union(HiddenRange, c.EntireRow)
    9. End If
    10. Next
    11. For Each c In UsedRange.Columns
    12. If c.EntireColumn.Hidden Then
    13. If HiddenRange Is Nothing Then Set HiddenRange = c.EntireColumn Else Set HiddenRange = Union(HiddenRange, c.EntireColumn)
    14. End If
    15. Next
    16. End Sub
    17. Sub RestoreHiddenRange()
    18. Dim c As Range
    19. For Each c In Intersect(HiddenRange.Rows, UsedRange)
    20. If c.Columns.Count = UsedRange.Columns.Count Then c.EntireRow.Hidden = True
    21. Next
    22. For Each c In Intersect(HiddenRange.Columns, UsedRange)
    23. If c.Rows.Count = UsedRange.Rows.Count Then c.EntireColumn.Hidden = True
    24. Next
    25. End Sub

    Du kannst es noch etwas geschwindigkeitsoptimieren, wenn du dir Zeile und Spalten getrennt merkst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Wenn ich aber die Funktionen im Sheet habe und diese dann im Modul aufrufen will,
    bekomme ich gleich die Fehlermeldung, dass die Sub oder Function nicht definiert ist.

    Ich habe die Funktion im Sheet eingefügt und könnte diese im Modul 1 aufrufen, aber dann kommt der Fehler
    Schon allein die Tatsache, dass du mit Modulen arbeitest, zeugt nicht von objektorientiertem Denken.

    Aber du kannst auch aus dem Modul aufrufen, indem du das Sheet-Objekt mit angibst.
    z.B. Tabelle1.SaveHiddenRange
    Wenn du jetzt das Sheet-Objekt noch vernünftig benennst, hast du sogar lesbaren Code.

    Ich lasse mich jetzt nicht darüber aus, dass Objekte wie ActiveCell oder ActiveSheet und Methoden wie .Activate oder .Select sowie GoTo Statements in brauchbarem Code eigentlich nichts verloren habe.
    Aber ich will jetzt nicht ein Fass aufmachen, sonst musst du deinen Code komplett neu schreiben.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hmm also ich also egal ob ich es im Modul oder im Userform einbinde, die Funktion blendet die vorher ausgeblendeten Spalten nicht wieder aus.

    Hier ist die Funktion im Modul, welche die oben bereits aufgeführten Funktionen ausführt. --> Funktioniert nicht.
    Wenn ich in den oberen Funktionen die diese einbinde:
    - bei Funktion Ausblenden habe ich "Tabelle2.SaveHiddenRange"
    - bei Funktion Einlenden habe ich "Tabelle2.RestoreHiddenRange"
    eingebunden, aber auch das führt nicht zum Erfolg.

    Wo könnte der Fehler liegen?

    Vielen Dank für die Hilfestellung
    Aber ich muss die Funktionen doch irgendwie abrufen oder?
    Die komplette Funktion steht im entsprechenden Worksheet drin.
    Wenn ich nun in der Excel bin, dann ist oben ein Button für das drucken. Durch diesen wird das Userform
    zum drucken aufgerufen, wo ich entsprechend den Druckbereich wähle etc.) Dafür wird dann
    die Spalten zuerst ausgeblendet und nach dem Druck wieder alle eingeblendet.
    Hier habe ich doch aber nirgends die Funktionen aufgerufen die im Worksheet stehen.
    Ich muss doch irgendwo sagen, jetzt merken und jetzt wieder einblenden.
    Oder wie kann ich das verstehen?
    Hättest du hier den zielführenden Hinweis für die Umsetung, weil irgendwie funktioniert es nicht so recht.
    Habe schon alles mögliche versucht.

    Ich habe im Worksheet deinen Code eingebunden und darunter den Druckbefehl genacht und da deine Funktionen eingebunden,
    aber auch das funktioniert nicht. Die Spalten werden immer wieder eingeblendet.

    Visual Basic-Quellcode

    1. Sub Drucken()
    2. SaveHiddenRange
    3. Ausdrucken
    4. RestoreHiddenRange
    5. End Sub


    Visual Basic-Quellcode

    1. Public Sub Ausdrucken()
    2. ' Tastenkombination: Strg+d
    3. 'Blattschutz mit PW aufheben
    4. ActiveSheet.Unprotect "test"
    5. UserForm1.Show
    6. ActiveSheet.Protect "test", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowInsertingRows:=True, AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True
    7. End Sub


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „TeamBob“ ()

    Ich habe deine Funktion direkt im Worksheet eingefügt und den Code zum Aufrufen auch direkt im Worksheet,
    somit bräuchte ich doch nicht den Objektnamen.
    Ich glaube um das Abzukürzen, habe ich mal ein Beispiel eingefügt.
    Hier ist die Datei relativ runtergebrochen. Im sheet "test" findest du den Button "Drucken"
    Dort wird die Funktion "Drucken in der selbigen Tabelle aufgerufen.
    vielleicht könntest du kurz reinschauen wo der Fehler liegt.
    Vielen Dank für deine Hilfe

    Datei von filehorst.de laden
    Hallo!

    petaod schrieb:

    Pack den Code in den Code-Bereich des entsprechende Sheets

    Man kann das auch in ein allgemeines Modul packen, muss dann aber richtig referenzieren.

    Visual Basic-Quellcode

    1. Option Private Module
    2. Option Explicit
    3. Public HiddenRange As Range
    4. Public Sub SaveHiddenRange(Optional strSheet As String = "Tabelle1")
    5. Dim c As Range
    6. Dim shSheet As Worksheet
    7. Set shSheet = Sheets(strSheet)
    8. Set HiddenRange = Nothing
    9. For Each c In shSheet.UsedRange.Rows
    10. If c.EntireRow.Hidden Then
    11. If HiddenRange Is Nothing Then Set HiddenRange = c.EntireRow Else Set HiddenRange = Application.Union(HiddenRange, c.EntireRow)
    12. End If
    13. Next
    14. For Each c In shSheet.UsedRange.Columns
    15. If c.EntireColumn.Hidden Then
    16. If HiddenRange Is Nothing Then Set HiddenRange = c.EntireColumn Else Set HiddenRange = Application.Union(HiddenRange, c.EntireColumn)
    17. End If
    18. Next
    19. End Sub
    20. Public Sub RestoreHiddenRange(Optional strSheet As String = "Tabelle1")
    21. Dim c As Range
    22. Dim shSheet As Worksheet
    23. Set shSheet = Sheets(strSheet)
    24. For Each c In Application.Intersect(HiddenRange.Rows, shSheet.UsedRange)
    25. If c.Columns.Count = shSheet.UsedRange.Columns.Count Then c.EntireRow.Hidden = True
    26. Next
    27. For Each c In Application.Intersect(HiddenRange.Columns, shSheet.UsedRange)
    28. If c.Rows.Count = shSheet.UsedRange.Rows.Count Then c.EntireColumn.Hidden = True
    29. Next
    30. End Sub


    Zum Aufrufen kann man den Namen der aktiven Tabelle übergeben. Übergibt man keinen Namen wird automatisch "Tabelle1" als Name genutzt.

    Visual Basic-Quellcode

    1. Sub Test()
    2. Call SaveHiddenRange ("Tabelle2")
    3. Call Ausdrucken
    4. Call RestoreHiddenRange("Tabelle2")
    5. End Sub


    TeamBob schrieb:


    (...) Jedoch erscheint zum Schluss doch wieder alle Spalten (...)

    Wenn Du es richtig machst dürfte das eigentlich nicht passieren. Bitte lade die Beispieldatei hier hoch, nicht extern ("Filehorst" wird von meinem AV-Programm als schädlich gemeldet).

    Gruß, René

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mumpel“ ()

    Ich habe Deinen Code mal durchgeschaut. Wo der Fehler leigt weiss ich nicht.

    Aber mal etwas Grundsätzliches:
    Du hast zuviele überflüssige "Select" und "Activate" drin. M.E. muss Dein ganzer Code mal neu geschrieben werden.
    Das scheint an Deinen beiden Tabellen zu liegen. Irgendetwas daran/darin verhindert die Ausführung der beiden Prozeduren bzw. die Prozeduren zeigen auf Deine Tabellenblätter keine Wirkung, ich kann aber nicht herausfinden was und weshalb. Wenn Du ein neues Tabellenblatt einfügst und die Prozeduren darin testest müsste es funktionieren. Da wirst Du Deine Datei wohl komplett neu aufbauen müssen.