395 Aufrufe
Gefragt in Tabellenkalkulation von addeguddi Experte (2.5k Punkte)
Hallo und einen schönen guten Tag

bezugnehmend auf meine letzte Frage habe ich eine Teilweise Lösung für Spalten ausblenden erstellt. Spalten  werden ausgeblendet doch ich habe einen Fehler und zwar wenn alle Spalten wieder sichtbar gemacht werden sollen geht das nur mit einer 2, soll aber eine 1 sein. ich weiß nicht wo ich die eins einsetzen soll.

Zweitens ist es möglich über die Eingabe des Spin Button die Befehle zu übernehmen? So müsste ich immer händig die Zahlen eingeben. Die Anzeige erfolgt über die Zelle IG1. Also wenn die 1 durch Spin Button ausgegeben wird sollen alle Spalten sichtbar sein wenn dann die 4 erscheint sollen die Spalten KX:LH ausgeblendet werden Usw.

Das ist das VBA

Private Sub Worksheet_Change(ByVal Target As Range)
With Target
  If .Address(0, 0) = "II2" Then
    Range("KX:MR").EntireColumn.Hidden = False
    Select Case .Value
      Case "", 19: Range("KX:Lh").EntireColumn.Hidden = True
      Case 4: Range("kx:Lh").EntireColumn.Hidden = True
      Case 7: Range("Lj:Lu").EntireColumn.Hidden = True
      Case 10: Range("Lw:Mh").EntireColumn.Hidden = True
      Case 13: Range("Mj:Mu").EntireColumn.Hidden = True
      Case 16: Range("Mw:nh").EntireColumn.Hidden = True
      Case 19: Range("nj:nt").EntireColumn.Hidden = True
      Case 22: Range("nv:OF").EntireColumn.Hidden = True
      Case Else
    End Select
  End If
   If .Address(0, 0) = "II2" Then
    Range("d:aa").EntireColumn.Hidden = False
    Select Case .Value
      Case "": Range("KX:MR").EntireColumn.Hidden = True
      Case 4: Range("KX:Lh").EntireColumn.Hidden = True
      Case 7: Range("LJ:Lu").EntireColumn.Hidden = True
      Case 10: Range("Lw:Lh").EntireColumn.Hidden = True
      Case 13: Range("mj:Mu").EntireColumn.Hidden = True
      Case 16: Range("Mw:nh").EntireColumn.Hidden = True
      Case 19: Range("nj:nt").EntireColumn.Hidden = True
      Case 22: Range("NV:OF").EntireColumn.Hidden = True
      Case Else
    End Select
  End If
   If .Address(0, 0) = "II2" Then
   Range("II:II").EntireColumn.Hidden = False
   Select Case .Value
      Case "": Range("KX:MR").EntireColumn.Hidden = True
      Case 1: Range("KX:MR").EntireColumn.Hidden = True
      Case Else
    End Select
 End If
End With
End Sub

In der Hoffnung, dass ich diesmal geholfen bekomme.

Grus Adde

5 Antworten

+1 Punkt
Beantwortet von xlking Experte (1.5k Punkte)

Hallo Adde,

was mir als Erstes auffällt: Du hast 3 If-Blocks die sich alle 3 auf dieselbe Zelle (II2) beziehen. Wozu das? Du kannst das doch auch in nur einem If-Block erledigen. Der zweite If-Block gleicht dem ersten und kann somit raus. Einziger Unterschied. Du blendest damit die Spalten d:aa ein. Warum? Die werden doch gar nicht ausgeblendet.

Zum Einblenden der auszublendenden Spalten nutzt du im ersten IF-Block den Befehl: Range("KX:MR").EntireColumn.Hidden = False Deine ausgeblendeten Spalten gehen aber bis OF. Du solltest den Bereich also erweitern.

Im ersten IF-Block hast du Case "", 19: Range("KX:Lh").EntireColumn.Hidden = True Das wird ausgeführt, wenn der Wert in der Zelle entweder leer ist oder den Wert 19 enthält. Der im selben Block angeführte Case 19 wird damit niemals angesprungen, weil ja die 19 bereits oben erfolgreich verarbeitet wurde. Willst du das so? 

Zweitens ist die Abfrage der Zelle, die den Wert des Spin-Buttons erhält, ein Schritt zu spät. Du kannst deinen IF-Block auch direkt in den Code des Spin-Buttons einfügen. Dann werden die Zeilen bereits ein-/ausgeblendet, sobald dieser benutzt wird.

Poste doch mal den Teilcode deines SpinButtons, der die Zahl in die Zelle schreibt. In etwa müsste dieser nach der Änderung dann so aussehen.

Sub SpinButton1_Change()

Range("II2").Value=SpinButton1.Value

Select Case SpinButton1.Value 'oder Select Case Range("II2").value
Case 0, 1
  Range("KX:OF").EntireColumn.Hidden = False
Case 4
  Range("KX:Lh").EntireColumn.Hidden = True
'usw.
Case Else
  Range("KX:OF").EntireColumn.Hidden = False
End Select

End Sub

Nochmal zur Erinnerung: .Hidden = True heißt ausblenden. Nicht zu verwechseln mit .Visible = True was anzeigen bedeutet. .Visible wird aber vom Range-Objekt nicht unterstützt. 

Gruß Mr. K.

0 Punkte
Beantwortet von addeguddi Experte (2.5k Punkte)
Vielen Dank für deine Antwort,

habe eben erst gelesen. Habe für mich schon gedacht, bekomme überhaupt keine Antwort. Habe ich etwas gemacht weil mir keiner helfen möchte.

Wie ich schon geschrieben habe; ich habe überhaupt keine Ahnung von dieser Materie. Daher suchte ich etwas im Forum das so ungefähr dem entspricht was ich brauche und habe dies nach meinen Gedanken verändert.

Kurze Erklärung zur Zelle II2 hier verändert sich die Zahlen: Für Runde 1 wird die 2 angezeigt, für Runde 2, die 4, für Runde 3 die 7 usw. Zum Ausblenden: ist für mich der Bezug auf diese Zelle II4. wenn die 4 Erscheint sollen alle Spalten für Runde 1 ausgeblendet werden. Wenn die Zahl 7 erscheint sollen die Spalten für Runde 1 und 2 ausgeblendet werden. Daher dachte ich, einmal für Runde 1 der 1. IF Block dann der zweite if Block für beide Runden usw. Es funktioniert auch so. Doch ich muss jetzt bei II4 immer einen Doppelklick machen das es funktioniert. daher war mein Gedanke wenn man das Über den SpinButton so generieren  kann wenn für Runde 2 Die 4 in II$ erscheint das dann automatisch die Spalten ausgeblendet werden können usw.

Das ist der Code

Private Sub SpinButton1_SpinDown()
ActiveSheet.Unprotect
If SpinButton1.Value + 1 < SpinButton1.Min Then SpinButton1.Value = SpinButton1.Max
ActiveSheet.Range("J1") = SpinButton1.Value

End Sub

Private Sub SpinButton1_SpinUp()
ActiveSheet.Unprotect
If SpinButton1.Value - 1 > SpinButton1.Max Then SpinButton1.Value = SpinButton1.Min
ActiveSheet.Range("J1") = SpinButton1.Value
ActiveSheet.Protect
End Sub

Gruß Adde
+1 Punkt
Beantwortet von xlking Experte (1.5k Punkte)

Hallo Adde,

Man will dir schon irgendwie helfen. Es ist nur so, dass deine Beschreibung (insbesondere im ersten Thread) für einen Außenstehenden nur schwer verständlich ist. Woher soll man wissen, wann du nun welche Spalte aus oder einblenden willst? Du beschreibst das jedesmal anders. Und leider auch etwas sehr vage.

wenn die 4 Erscheint sollen alle Spalten für Runde 1 ausgeblendet werden. 

Ich vermute mal anhand deines Codes weiter oben, dass mit Runde 1 die Spalten KX:LH gemeint sind. Was soll in dem Fall mit den anderen Spalten (Runden) passieren? bleiben die eingeblendet? Je höher die Zahl wird, desto mehr Runden (Spalten) werden ausgeblendet, Richtig? Wann sollen die Spalten wieder eingeblendet werden?

Du beziehst dich für das Ausblenden auf den Wert in II4. Aber der Spinbutton ändert den Wert in J1. Wo ist der Zusammenhang? Falls sich II4 per Formel auf Basis von J1 berechnet, musst du diese Berechnung auch in VBA nachstellen um zum gleichen Ergebnis zu kommen.

Wie gesagt sollte das Ganze dann innerhalb des SpinButton_Codes erfolgen. Also innerhalb von SpinDown, bzw. SpinUp. Daher nochmal. Bei welchem Wert des Spinbuttons wird in II4 die 4 angezeigt? bzw. bei welchem Wert des SpinButtons, willst du welche Spalten ausblenden?

Eine mögliche Idee:

Private Sub SpinButton1_SpinDown()
ActiveSheet.Unprotect
If SpinButton1.Value + 1 < SpinButton1.Min Then SpinButton1.Value = SpinButton1.Max
ActiveSheet.Range("J1") = SpinButton1.Value

Range("KX:OF").EntireColumn.Hidden = False
Select Case SpinButton1.Value
Case 1
Range("KX:LH").EntireColumn.Hidden = True
Case 2
Range("KX:LU").EntireColumn.Hidden = True
Case 3
Range("KX:MH").EntireColumn.Hidden = True
Case 4
Range("KX:MU").EntireColumn.Hidden = True
'usw.
End Select

End Sub

Das gleiche dann für SpinButton1_SpinUp oder du verwendest wie oben gezeigt, das SpinButton1_Change-Ereignis. Dann musst du den Code nur einmal schreiben.

PS: Viele haben keine Ahnung von VBA. In diesem Fall geht es aber um einfachste Befehle die selbst du verstehen müsstest. Falls nicht, kannst du natürlich gern jederzeit nachfragen.

Gruß Mr. K.

0 Punkte
Beantwortet von addeguddi Experte (2.5k Punkte)
Bearbeitet von addeguddi
Guten Morgen Mr. K.

erst einmal vielen lieb dank für die Unterstützung von dir.

Du hast das schon richtig verstanden. Wegen Der Zelle II4 ist für mich eine Hilfsspalte da ich das mit Spin Button nicht kann, wird von mir wieder gelöscht sowie das funktioniert was du mir erstellt hast..

Ich versuche es nochmal zu beschreiben, was ich möchte. Es ist ein Spiel das über 8 Runden für 3 Spieler geht.

Wenn die Runde 1, ein Spieler gewonnen hat sollen die erst genannten Spalten ausgeblendet werden, wenn in J1 die Zahl  4 erscheint. In J 1 wird, wie du sicherlich weist, bei klick immer vor oder zurück geklickt. Wenn also das 1te Spiel zu ende ist, klicke ich bis zur 4  dann die genannten Spalten für die erste Runde ausblenden, dann bei 7 die für die 2te. Runde usw. und wenn ich wieder auf die 1 zurück klicke sollen alle Spalten wieder eingeblendet werden.

Hoffe, das es verständlich besser ausgedrückt wurde. Ich kann es nicht anders beschreiben.

Jetzt hast du einen Code erstellt in dem steht Case 1, 2 , usw. bedeutet das , Dass Case 1 die Zahl 4 ersetzt und Case 2 die 7 usw. und das ist das was ich nicht zuordnen kann. ich weiß jetzt nicht, bedeutet wenn in J1 die 1 ist werden die Zellen ausgeblendet, oder?

Ich probiere es aus und melde mich mich noch einmal.

Nochmals herzlichen Dank.

Gruß Adde
0 Punkte
Beantwortet von addeguddi Experte (2.5k Punkte)
Bearbeitet von addeguddi

Hallo Mr. K. ich nochmal,

habe deinen Code probiert, hat leider nicht so funktioniert aber ich habe Veränderungen vorgenommen und siehe da, ich habe es geschafft und habe verstanden was Case 1, 2 usw. bedeutet. 

Nochmals vielen lieben Dank für deine TOLLE Unterstützungyes

Der Code mit den Veränderungen:

Private Sub SpinButton1_Change()
ActiveSheet.Unprotect
If SpinButton1.Value < 1 Then SpinButton1.Value = ActiveSheet.Range("J1")
If SpinButton1.Value > ActiveSheet.Range("J1") Then SpinButton1.Value = 1
Range("KX:OF").EntireColumn.Hidden = False
Select Case SpinButton1.Value
Case 4
Range("KX:LH").EntireColumn.Hidden = True
Case 5
Range("kx:Lh").EntireColumn.Hidden = True
Case 6
Range("KX:LH").EntireColumn.Hidden = True
Case 7
Range("KX:LU").EntireColumn.Hidden = True
Case 8
Range("KX:LU").EntireColumn.Hidden = True
Case 9
Range("kx:LU").EntireColumn.Hidden = True
Case 10
Range("KX:MH").EntireColumn.Hidden = True
Case 11
Range("KX:MH").EntireColumn.Hidden = True
Case 12
Range("KX:MH").EntireColumn.Hidden = True
Case 13
Range("KX:MU").EntireColumn.Hidden = True
Case 14
Range("kx:MU").EntireColumn.Hidden = True
Case 15
Range("KX:MU").EntireColumn.Hidden = True
Case 16
Range("KX:NH").EntireColumn.Hidden = True
Case 17
Range("KX:NH").EntireColumn.Hidden = True
Case 18
Range("kx:NH").EntireColumn.Hidden = True
Case 19
Range("KX:NT").EntireColumn.Hidden = True
Case 20
Range("KX:NT").EntireColumn.Hidden = True
Case 21
Range("KX:NT").EntireColumn.Hidden = True
Case 22
Range("kx:OF").EntireColumn.Hidden = True
Case 23
Range("KX:OF").EntireColumn.Hidden = True
Case 24
Range("KX:OF").EntireColumn.Hidden = True

End Select

ActiveSheet.Range("g1") = SpinButton1.Value

End Sub

Bis irgendwann wenn ich wieder einmal eine Frage habe.

Gruß Adde

Wenn du einmal sehen möchtest was ich da erstellt habe; lade ich die Liste hoch.

...