Microsoft Excel

Herbers Excel/VBA-Archiv

bestimmte Tabellen ein- resp. ausblenden SWITCH | Herbers Excel-Forum


Betrifft: bestimmte Tabellen ein- resp. ausblenden SWITCH von: Peter
Geschrieben am: 19.11.2009 17:13:07

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.

  

Betrifft: AW: bestimmte Tabellen ein- resp. ausblenden SWITCH von: F1
Geschrieben am: 19.11.2009 17:36:31

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


  

Betrifft: hier mein Vorschlag dazu. von: Tino
Geschrieben am: 19.11.2009 17:40:53

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


  

Betrifft: durchs Testen dauerts bei mir immer etwas ... von: Matthias L
Geschrieben am: 19.11.2009 17:45:42

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


  

Betrifft: und (i) würde ich as Long deklarieren kwT von: Matthias L
Geschrieben am: 19.11.2009 17:48:32




  

Betrifft: ??? von: F1
Geschrieben am: 19.11.2009 17:49:59

Mappe mit mehr als 32.000 Blättern?

F1


  

Betrifft: Ja, wo ist das Problem? (oT) von: Jens
Geschrieben am: 19.11.2009 18:13:47




  

Betrifft: Die möchte ich sehen! oT von: F1
Geschrieben am: 19.11.2009 19:45:22

oT


  

Betrifft: AW: Die möchte ich sehen! oT von: Jens
Geschrieben am: 19.11.2009 20:04:44

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


  

Betrifft: Boolesche Variablen von: Erich G.
Geschrieben am: 19.11.2009 20:40:46

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


  

Betrifft: AW: Boolesche Variablen von: Peter
Geschrieben am: 19.11.2009 22:01:20

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



  

Betrifft: ja ... von: Matthias L
Geschrieben am: 20.11.2009 16:57:33

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


  

Betrifft: @Matthias von: Erich G.
Geschrieben am: 20.11.2009 18:22:51

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


  

Betrifft: AW: @Erich von: Matthias L
Geschrieben am: 20.11.2009 18:40:40

Hallo Erich

Zitat:
Nur wenn wert1 False ist, spielen wert2 und wert3 eine Rolle.
Genau deshalb habe ich es ja so geschrieben!

Gruß Matthias


  

Betrifft: @Matthias: Sorry, ... von: Erich G.
Geschrieben am: 20.11.2009 19:35:55

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


  

Betrifft: AW: @Matthias: Sorry, ... von: Peter
Geschrieben am: 20.11.2009 22:36:16

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


  

Betrifft: Korrektur von: Erich G.
Geschrieben am: 21.11.2009 00:50:09

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


  

Betrifft: AW: Korrektur von: Peter
Geschrieben am: 21.11.2009 07:22:00

Hi Erich
Alles klar!
Danke und Grüsse aus Bern, Peter


  

Betrifft: @Erich Da war keine "Aufregung" ... von: Matthias L
Geschrieben am: 21.11.2009 12:25:52

Hallo Erich

Vielleicht hattest Du nur nicht verstanden, das ich es noch nicht verstanden hatte.
Aber jetzt ist alles klar, Danke :o)

Gru0 Matthias


Beiträge aus den Excel-Beispielen zum Thema "bestimmte Tabellen ein- resp. ausblenden SWITCH"