Wie kann man in Excel per VBA abhängig von einem Wert Spalten aus-/einblenden?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Dein Code sieht gar nicht so schlecht aus. Um den Wert einer Zelle anzusprechen, musst du aber Range("G6") schreiben, und nicht einfach "G6". Eigentlich wäre es sogar Range(“G6”).Value, aber wenn man das nicht dazuschreibt, ist es immer die Eigenschaft “Value”.

Wenn du nur ein Arbeitsblatt hast, ist Range eindeutig, sonst eventuell ActiveSheet.Range oder Sheets("Reitername").Range("G6")

Die Struktur mit den vielen End If am Ende ist nicht so schön, da kommt man durcheinander. Dafür gibt es “ElseIf”, wo man viele Bedingungen hintereinanderschreiben kann. Schau dir online mal Beispiele an wie das geht (suche "VBA IF ELSEIF" oder so)

Noch besser ist “Select Case”. Da brauchst du die Range nur einmal hinzuschreiben. Das geht so:

Select Case Range(“G6”)

  Case “1”

          Columns…

  Case “2”          

          Columns…

(…)

End Select

Lass es am besten erstmal so wie es ist, und bring es mit Range("G6") zum Laufen.

Den verbesserten Stil kannst du dann ja danach noch ausprobieren.

Geo700 
Fragesteller
 20.12.2019, 14:56

Hey. Danke erstmal, es funktioniert nun super. Weißt du auch, wie ich die Zelle G6 permanent überwachen lassen kann, so dass ich keine Tastenkombination oder keinen Command-Button mehr drücken muss?

1
User637236  20.12.2019, 15:11
@Geo700

Na klar. Da brauchst du diese voreingestellten "Events", die du im Object-Browser in dem Arbeitsblatt findest.

Wenn du links "Worksheet" und rechts "Change" auswählst, kommt automatisch eine solche Prozedur, die du nur noch ausfüllen musst. Das läuft, wenn eine Zelle geändert wird.

Private Sub Worksheet_Change(ByVal Target As Range)

End Sub

Da kann einfach der Name deines anderen Makros rein, damit es ausgeführt wird. Oder du fragst erst ab, ob es wirklich Zelle “G6” ist, die sich geändert hat, also: 

If Target Is Range(“G6”) Then...

3
Geo700 
Fragesteller
 20.12.2019, 23:01
@User637236

Guten Abend. Ich habe jetzt den Objektbrowser gefunden und Worksheet + Change ausgewählt. Wie ich das jetzt aber bei mir einfüge, weiß ich leider nicht.

Und wenn ich "Sub Ausblenden()" gegen "Private Sub Worksheet_Change(ByVal Target As Range)" tausche, funktioniert es nicht. Es wäre nett, wenn du mir da nochmal kurz helfen könntest. Danke :D

0
Iamiam  23.12.2019, 02:20
@Geo700

Sub Worksheet_Change(ByVal Target As Range)

If Target Is Range(“G6”) Then Sub Ausblenden()

end sub

diese 'einzeilige' Kurzfassung sollte gehen (weil in diesem Sub kein else vorhanden, man spart sich so end if), die Langfassung geht so

Sub Worksheet_Change(ByVal Target As Range)

If Target Is Range(“G6”) Then

Sub Ausblenden()

end if

end sub

das Private ist ebenfalls nicht zwingend erforderlich, gibt hier keinen Grund dafür, ausser dass es vllt in der Makroliste verborgen wird (hab ich nicht ausprobiert)

0

Hallo Geo700,

Wegen der Event-Steuerung muss ich nochmal eine neue Antwort aufmachen, damit ich ein Bild einfügen kann.

Der Makroname wird nicht ersetzt, sondern in die Event-Prozedur eingefügt wie gezeigt. "MyMacro" durch den richtigen Namen ersetzen.

“Sheet1” ist links ausgewählt.

Bild zum Beitrag

 - (Computer, programmieren, Microsoft Excel)
Geo700 
Fragesteller
 21.12.2019, 15:58

Hi nochmal. Wenn ich nerve dann lass es, aber danke erstmal bis hier her...

Mein Code im Sheet1 ist jetzt:

Private Sub Worksheet_Change(ByVal Target As Range)

  If Target Is Range("G6") Then

    Ausblenden

  End If

End Sub

Und darüber steht im linken Kästchen "Worksheet" und im rechten "Change". In Modul4 steht der Code

Sub Ausblenden()

'

' Ausblenden Makro

'

' Tastenkombination: Strg+a

'

  If "G6" = "1" Then

        Columns("v:bn").EntireColumn.Hidden = False

        Columns("v:bn").EntireColumn.Hidden = True

      Else

        If "G6" = "2" Then

          Columns("v:bn").EntireColumn.Hidden = False

          Columns("ae:bn").EntireColumn.Hidden = True

        Else

          If "G6" = "3" Then

            Columns("v:bn").EntireColumn.Hidden = False

            Columns("an:bn").EntireColumn.Hidden = True

          Else

            If "G6" = "4" Then

              Columns("v:bn").EntireColumn.Hidden = False

              Columns("aw:bn").EntireColumn.Hidden = True

            Else

              If "G6" = "5" Then

                Columns("v:bn").EntireColumn.Hidden = False

                Columns("bf:bn").EntireColumn.Hidden = True

              Else

                If "G6" = "6" Then

                  Columns("v:bn").EntireColumn.Hidden = False

                End If

              End If

            End If

          End If

        End If

  End If

End Sub

Nur jetzt passiert nichts mehr. Es wird nichts ausgeblendet. Vielleicht kannst du mir ja nochmal helfen. Vielen Dank nochmal für deine restlichen Antworten.

0
User637236  21.12.2019, 16:44
@Geo700

Da steht wieder nur “G6”. Eine Bedingung wie “G6”=”1” trifft natürlich nie zu… Da muss Range(“G6”) hin. Ansonsten sollte es passen.

0
Geo700 
Fragesteller
 21.12.2019, 17:08
@User637236

Stimmt ja... ich hatte da nochmal dran rum probiert. Nun funktioniert es wieder, wenn ich das Makro manuell starte. Automatisch leider nicht. Vielleicht ist noch wichtig zu sagen, dass die Zelle durch eine Formel geändert wird und nicht manuell. Ansonsten drücke ich halt immer auf den Command-Button. Wenn es nicht geht, dann gehts nicht.

0
Geo700 
Fragesteller
 21.12.2019, 17:29
@User637236

Ich habe mal ein bisschen im Netz gesucht. Vielleicht hilft das:

"das Change()-Event reagiert nicht auf Berechnungen sondern 'nur' auf Eingaben in die Zelle.

Bei Formeln verändert sich am Inhalt der Zelle ja nichts, da steht immer dieselbe Formel drin.

Verwende daher das Calculate()-Event. Hier hast Du dann allerdings kein Target-Objekt mehr zur Verfügung sondern musst die betreffende Zelle direkt prüfen." http://www.office-loesung.de/ftopic523332_0_0_asc.php

0
User637236  21.12.2019, 17:52
@Geo700

Probier's halt aus. Es gibt ja außer Change noch mehrere andere Events für Worksheet, die man auswählen kann. Das "Target" braucht man ja nicht unbedingt. Calculate sollte passen.

0