Clever-Excel-Forum

Normale Version: Makro führt zu unterschiedlichen Ergebnissen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich habe ein bißchen VBA Code, um in Excel Tabellenblätter bedingt einzublenden. Wenn ich den Code über die VBA-Benutzeroberfläche ausführe, funktioniert alles. Wenn ich das Makro einem Textfeld in der Exceldatei zuordne und auf das Textfeld klicke, werden andere Tabellenblätter eingeblendet  Huh .

Mein erster Gedanke war, dass ich das falsche Makro zugeordnet habe (nein, passt alles). Ich habe das Makro auch schon umbenannt / neu zugeordnet, ebenfalls ohne Erfolg. Irgendwie hat das Makro vom Textfeld ein Eigenleben.

Der Code soll folgendes durchführen (was auf der VBA-Programmieroberfläche auch funktioniert):
  • "Wenn eine Zeile eingeblendet ist und in der neunten Spalte ein "x" eingetragen ist, soll das Tabellenblatt eingeblendet werden, das als nächstes nach dem gefundenen Tabellenblatt folgt, dessen Tabellenblattbezeichnung in Spalte 1 steht" (Beispiel: in Spalte 1 steht "sheet_1" und in gleicher Zeile in Spalte 9 ist ein "x", dann soll "sheet_2" eingeblendet werden)
  • "Wenn Zeile eingeblendet ist und kein "x" in Spalte 9 steht, dann soll das Tabellenblatt eingeblendet werden, dessen Name in Spalte 1 steht"
Beim Start über das Textfeld führt der Code jedoch folgendes durch:
  • In der ersten eingeblendeten Zeile prüft er noch regulär, ob ein "x" in Spalte 9 steht; falls ja, sheet_2 eingeblendet; falls er kein "x" findet, wird sheet_1 eingeblendet -> so solls sein Exclamation
  • Ab der nächsten eingeblendeten Zeile blendet er nur noch Tabellenblätter ein, deren Name er in Spalte 1 findet; unabhängig davon, ob in Spalte 9 ein "x" steht.


Code:
Sub einblenden()
Dim i as Long
For i = 5 To 18 'Range A5:A18
    If Cells(i, 1).EntireRow.Hidden = False Then
        If Cells(i, 9).Value = "x" Then 'Range I5:I18
            ThisWorkbook.Sheets(ThisWorkbook.Sheets(ThisWorkbook.Sheets("Fortschritt").Cells(i, 1).Value).Next.Name).Visible = xlSheetVisible
        Else
            ThisWorkbook.Sheets(ThisWorkbook.Sheets(ThisWorkbook.Sheets("Fortschritt").Cells(i, 1).Value).Name).Visible = xlSheetVisible
        End If
    End If
Next i
End Sub

Bin ich einfach nur doof oder veräppelt mich hier Excel?

Gruß
Code:
Sub M_snb()
  Rows("5:18").Hidden = Not Rows("5:18").Hidden
End Sub
Hallo snb,

sorry ich kann dir nicht folgen. Kannst du das bitte für mich übersetzen?

Gruß
Moin,

hast du es schon mit Haltepunkten und dem Lokalfenster ausprobiert, was das Programm zur Laufzeit tatsächlich macht? Du solltest im übrigen darauf achten, dass du alle Rangeobjekte mit ihrem Elternelement ausreichend referenziert hast ( also mindestens das Tabellenblatt davor schreiben.
Im übrigen brauchst du nicht den Namen eines Blattes in der Collection suchen, sondern kannst das Objekt direkt ansprechen:
Worksheets("Heinz").Next.Visible = True 

Kannst du vielleicht auch noch kurz erläutern, was du inhaltlich tust? Mir scheint das Vorhalten von Blättern, die ein und ausgeblendet werden nicht sehr sinnvoll; erst Recht, wenn du dich auf das Glückslose .Next verlassen willst. ein Verchobenes Blatt und alles ist hinüber.

Viele Grüße
derHöpp
Hallo derHöpp,

danke für den Tipp "ergänzen des Tabellenblatts vor Rangeobjekten", damit klappt es jetzt. Das Textobjekt mit verknüpftem Makro ist auf dem gleichen Tabellenblatt wie die Daten, die es abfragt. Daher dachte ich, ich spar mir das. Vermutlich wandert die Auswahl des aktiven Tabellenblatts mit der Abarbeitung des Codes, dann findet es auf anderen Tabellenblättern kein "x" in Spalte 9.

Zum Hintergrund, warum ich den Code brauche: ein Anwender hat eine Excel Tabelle mit sehr sehr vielen Sheets. Gleichzeitig ist der Anwender ungeübt in Büro-Arbeit, daher kommt er mit den vielen verschiedenen Sheets nicht klar und meldet sich dann immer bei mir. Durch das Einblenden der tatsächlich benötigten Sheets hat der Anwender eine überschaubare Exceldatei und ich hab meine Ruhe.

Gruß