Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1116to1120
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

bestimmte Tabellen ein- resp. ausblenden SWITCH

bestimmte Tabellen ein- resp. ausblenden SWITCH
Peter
Guten Abend
In einer grösseren Datei habe ich einige Tabellen, deren Namen einer der Strings "_FA", "_FV" oder "_FF" enthält.
Nun möchte ich ein Makro, mit dem ich diese Tabellen identifiziere und die einzelnen Tabellen einblende, wenn sie ausgeblendet sind, resp. umgekehrt.
Fragen:
-Wie lautet die Abfrage, ob sheets(i).name einer der erwähnten Strings enthält?
- Wie muss die Codezeile lauten, die mit eine Tabelle jeweils in den anderen Zustand (eingeblendet, resp. ausgeblendet) versetzt (irgendwie sheets(i) not visible = visible ?
Sub SwitchEinAus()
Dim i As Integer
For i = 1 To Sheets.Count
'if sheets(i).name   'enthält String _FA, _FV oder _FF
Code für anderen Zustand (ein- / ausgeblendet)
Next i
End Sub
Danke für eine Antwort.
AW: bestimmte Tabellen ein- resp. ausblenden SWITCH
19.11.2009 17:36:31
F1

Sub SwitchEinAus()
Dim i As Integer
Application.ScreenUpdating = 0
For i = 1 To Sheets.Count
If Sheets(i).Name Like "*_FA*" Or _
Sheets(i).Name Like "*_FV*" Or _
Sheets(i).Name Like "*_FF*" Then
Sheets(i).Visible = Not Sheets(i).Visible
End If
Next
Application.ScreenUpdating = -1
End Sub

F1
hier mein Vorschlag dazu.
19.11.2009 17:40:53
Tino
Hallo,
geht es so?
Sub Test()
Dim oSH As Object
Dim iVisible As Integer
iVisible = -2
For Each oSH In ThisWorkbook.Sheets
If InStr(oSH.Name, "_FA") > 0 Or _
InStr(oSH.Name, "_FV") > 0 Or _
InStr(oSH.Name, "_FF") > 0 Then
If iVisible = -2 Then
iVisible = IIf(oSH.Visible = xlSheetVisible, xlSheetVeryHidden, xlSheetVisible)
End If
oSH.Visible = iVisible
End If
Next oSH
End Sub
Gruß Tino
Anzeige
durchs Testen dauerts bei mir immer etwas ...
19.11.2009 17:45:42
Matthias
Hallo
Sub SwitchEinAus()
Application.ScreenUpdating = False
Dim i As Integer
Dim wert1
Dim wert2
Dim wert3
For i = 1 To Sheets.Count
wert1 = Sheets(i).Name Like "*_FA*"
wert2 = Sheets(i).Name Like "*_FV*"
wert3 = Sheets(i).Name Like "*_FF*"
If wert1 = True Or wert2 = True Or wert3 = True Then
Sheets(i).Visible = Not Sheets(i).Visible
End If
Next i
Application.ScreenUpdating = True
End Sub
Gruß Matthias
und (i) würde ich as Long deklarieren kwT
19.11.2009 17:48:32
Matthias
?
19.11.2009 17:49:59
F1
Mappe mit mehr als 32.000 Blättern?
F1
Ja, wo ist das Problem? (oT)
19.11.2009 18:13:47
Jens
Die möchte ich sehen! oT
19.11.2009 19:45:22
F1
oT
AW: Die möchte ich sehen! oT
19.11.2009 20:04:44
Jens
Hallo
Die Anzahl der Arbeitsblätter ist nur durch den verfügbaren Speicher begrenzt.
Ob solch eine Datei Sinn macht/hat, ist eine andere Frage.
Gruß Jens
Anzeige
Boolesche Variablen
19.11.2009 20:40:46
Erich
Hi Matthias,
an deinem Code ist nichts falsch - aber mir sind doch drei Dinge aufgefallen:
Warum deklarierst du wert1,2,3 nicht genau?
Dim wert1 as Boolean, wert2 as Boolean, wert3 as Boolean,
Warum lässt du wert2 und wert3 für auch dann noch ermitteln, wenn wert1 True ist?
Das verschenkt Zeit.
Statt
If wert1 = True Or wert2 = True Or wert3 = True Then
wäre IMHO klarer und kürzer:
If wert1 Or wert2 Or wert3 Then
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Boolesche Variablen
19.11.2009 22:01:20
Peter
Guten Abend miteinander
Vielen Dank für die vielen Beiträge. Ich habe mir jetzt aus den verschiednene Lösungen etwas zusammen "gemixt".
Gruss, Peter
Sub SwitchEinAus()
Dim i As Long
Application.ScreenUpdating = False
For i = 1 To Sheets.Count
If InStr(Sheets(i).Name, "_FA") > 0 Or _
InStr(Sheets(i).Name, "_FV") > 0 Or _
InStr(Sheets(i).Name, "_FF") > 0 Then
Sheets(i).Visible = Not Sheets(i).Visible
End If
Next
Application.ScreenUpdating = True
End Sub

Anzeige
ja ...
20.11.2009 16:57:33
Matthias
Hallo Erich
Ja klar hätte ich auch wert1-3 deklarieren sollen. Da gebe ich Dir Recht
Mit ...
Warum lässt du wert2 und wert3 für auch dann noch ermitteln, wenn wert1 True ist?
Das verschenkt Zeit.
... versteh ich noch nicht ganz.
... weil Wert2 oder Wert3 doch auch True sein kann
bei wert1=True wird doch nur die Tabelle mit *_FA aus/eingeblendet.
oder verstehe ich da was falsch?
allerdings If wert1 Or wert2 Or wert3 Then ... (habe ich noch nicht probiert), sieht logisch aus.
aber Du schreibst ja selbst: an deinem Code ist nichts falsch
Ich bedanke mich für für Deine Rückmeldung :o)
Gruß Matthias
Anzeige
@Matthias
20.11.2009 18:22:51
Erich
Hi Matthias,
wenn wert1 True ist, wird Sheets(i).Visible umgeschaltet - egal, wie wert2 oder wert3 aussehen,
egal also, od auch "_FV" oder "_FF" im Namen vorkommen. Das braucht dann gar nicht mehr überprüft zu werden.
Nur wenn wert1 False ist, spielen wert2 und wert3 eine Rolle.
Zum Hinschreiben so eines logischen Ausdrucks:
wert1 ist einfach ein Wahrheitswert - wie auch z. B. intA = 7. Beides kann True oder False sein.
Man kann ja wert1 auch z. B. so belegen: wert1 = (intA = 7) oder kürzer: wert1 = intA = 7
Man käme gar nicht auf die Idee, zu schreiben: If (intA = 7) = True Then
Man schreibt immer: If intA = 7 Then
Dann muss man doch auch nicht schreiben: If wert1 = True Then
Einfacher ist: If wert1 Then
Dazu passt auch: "If wert1 = False" ist nichts anderes als "If Not wert1".
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: @Erich
20.11.2009 18:40:40
Matthias
Hallo Erich
Zitat:
Nur wenn wert1 False ist, spielen wert2 und wert3 eine Rolle.
Genau deshalb habe ich es ja so geschrieben!
Gruß Matthias
@Matthias: Sorry, ...
20.11.2009 19:35:55
Erich
Hi Matthias,
..,. die ganze Aufregung kann ich nicht so recht verstehen.
Dein Code - auf den ich mich bezog - sah so aus:

Sub SwitchEinAus()
Application.ScreenUpdating = False
Dim i As Integer
Dim wert1
Dim wert2
Dim wert3
For i = 1 To Sheets.Count
wert1 = Sheets(i).Name Like "*_FA*"
wert2 = Sheets(i).Name Like "*_FV*"
wert3 = Sheets(i).Name Like "*_FF*"
If wert1 = True Or wert2 = True Or wert3 = True Then
Sheets(i).Visible = Not Sheets(i).Visible
End If
Next i
Application.ScreenUpdating = True
End Sub
Dazu hatte ich angemerkt:
"Warum lässt du wert2 und wert3 für auch dann noch ermitteln, wenn wert1 True ist?
Das verschenkt Zeit."
wert2 und wert3 werden in deinem Code immer ermittelt - unabhängig von wert1.
Wenn wert1 True ist, brauchen wert2 uind wert3 nicht mehr berechnet zu werden - sie sind egal.
Man könnte das z. B. so schreiben:

Sub SwitchEinAus2()
Dim ii As Integer, blnSwitch As Boolean
Application.ScreenUpdating = False
For ii = 1 To Sheets.Count
If Sheets(ii).Name Like "*_FA*" Then
blnSwitch = True
ElseIf Sheets(ii).Name Like "*_FV*" Then
blnSwitch = True
ElseIf Sheets(ii).Name Like "*_FF*" Then
blnSwitch = True
End If
If blnSwitch Then Sheets(ii).Visible = Not Sheets(ii).Visible
Next ii
Application.ScreenUpdating = True
End Sub
Hier werden die Ausdrücke Sheets(ii).Name Like "*_FV*" und Sheets(ii).Name Like "*_FF*"
nicht mehr ausgewertet, wenn Sheets(ii).Name Like "*_FA*" ist.
Hier wird das noch deutlicher:

Sub SwitchEinAus3()
Dim ii As Integer, blnBleibt As Boolean
For ii = 1 To Sheets.Count
If Not Sheets(ii).Name Like "*_FA*" Then
If Not Sheets(ii).Name Like "*_FV*" Then
If Not Sheets(ii).Name Like "*_FF*" Then blnBleibt = True
End If
End If
If Not blnBleibt Then Sheets(ii).Visible = Not Sheets(ii).Visible
Next ii
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: @Matthias: Sorry, ...
20.11.2009 22:36:16
Peter
Hallo Erich
Vielen Dank für die interessanten Beiträge. Die beiden letzten Codes habe ich nochmals getestet und ich bin der Ansicht, dass SwitchEinAus3 nicht funktioniert. Ich habe allerdings auch nicht herausgefunden warum.. Die 3 hinterlegten Codes sind in einem sep. Excel Menü "PS" aufrufbar.
Gruss, Peter
https://www.herber.de/bbs/user/66069.xls
Korrektur
21.11.2009 00:50:09
Erich
Hi Peter,
stimmt - in der Variante fehlt etwas:
blnBleibt behielt einen einmal erhaltenen Wert True für die folgenden Schleifendurchläufe.
So sollte es aber laufen:

Sub SwitchEinAus3()
Dim ii As Integer, blnBleibt As Boolean
For ii = 1 To Sheets.Count
blnBleibt = False         ' ### Die Zeile ist neu ###
If Not Sheets(ii).Name Like "*_FA*" Then
If Not Sheets(ii).Name Like "*_FV*" Then
If Not Sheets(ii).Name Like "*_FF*" Then blnBleibt = True
End If
End If
If Not blnBleibt Then Sheets(ii).Visible = Not Sheets(ii).Visible
Next ii
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Korrektur
21.11.2009 07:22:00
Peter
Hi Erich
Alles klar!
Danke und Grüsse aus Bern, Peter
@Erich Da war keine "Aufregung" ...
21.11.2009 12:25:52
Matthias
Hallo Erich
Vielleicht hattest Du nur nicht verstanden, das ich es noch nicht verstanden hatte.
Aber jetzt ist alles klar, Danke :o)
Gru0 Matthias

168 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige