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

VBA zum Spaltenausblenden

VBA zum Spaltenausblenden
30.06.2015 13:33:46
Stefan
Schönen guten Tag wünsch ich,
ich hab ein problem mit einem VBA Code. Ich versuche Spalten auszublenden die leer sind. Ich habe mir dazu in der Excel Tabelle eine Krücke gebaut. In einer Zelle A32 bestimmt er den MAX Wert. Zellenformel =WENN(MAX(F5:F26)=0;0;1)im VBA soll er Spalte xx ausblenden wenn Zellwert 0 ansonsten nicht. Das Funktioniert auch wunderbar.
Nun versuch ich das aber auch für andere Spalten in dem sheet nur leider geht das nicht. Wie soll ich vor gehen? Oder was mach ich Falsch? Folgend der Code:
Private Sub Worksheet_Calculate()
Dim Spalte As Integer
Dim SpalteEnd As Integer
With Tabelle20
SpalteEnd = .UsedRange.Columns.Count
For Spalte = 5 To 6 'Für welche spalten gilt der befehl, welche spalten werden ausgeblendet
If .Cells(32, 1).Value = "0" Then 'Wenn zelle 32 in spalte 1 =0 dann
'.Columns(Spalte).Hidden = False 'spalte einblenden
.Columns(Spalte).Hidden = True 'spalte ausblenden
Else
.Columns(Spalte).Hidden = False
End If
Next Spalte
End With
End Sub

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA zum Spaltenausblenden
30.06.2015 14:21:38
Michael
Hi Stefan,
Du fragst ja nur die Spalte 1 ab: If .Cells(32, 1).Value; andere das mal auf
If .Cells(32, spalte).Value
dann sollte es so tun, wie Du es Dir vorstellst.
Schöne Grüße,
Michael

AW: VBA zum Spaltenausblenden
30.06.2015 14:32:44
Stefan
Hi,
vielleicht hab ich mich etwas ungeschickt ausgedrückt.
Der Code arbeitet wie er soll. Er blendet mir Spalte 5 + 6 aus wenn in Zelle "A32" eine 0 steht.
Alles gut soweit bin ich selber gekommen.
Nun Soll er aber zusätzlich Spalte 7 + 8 Ausblenden wenn in "A33" eine 0 steht
Dafür bin ich noch zu schwach auf dem Gebiet. Ich hätt ja einfach den Code kopiert und dadrunter eingefügt und die Pararmeter geändert das reicht aber wohl nicht.
Danke für die Hilfe bisher.

Anzeige
AW: VBA zum Spaltenausblenden
30.06.2015 15:15:56
Michael
Hallo Stefan,
naja, die simpelste Möglichkeit ist, die komplette For-Schleife zu kopieren und die betroffenen Werte zu ändern. Statt cells(32,1).value eben cells(33,1).value und in der Schleife von 7 bis 8 zählen.
Übrigens erwähnst Du nicht, welche Formel in A33 stehen soll!
Wenn sie analog wie die in A32 funktionieren soll, müßte sie so lauten:
=WENN(MAX(H5:H26)=0;0;1)
Probier das mal aus:
Option Explicit
Private Sub Worksheet_Calculate()
Dim Spalte As Integer
Dim SpalteEnd As Integer
Dim SpaltenString As String
Dim Tabelle20 As Worksheet         ' ** ist anscheinend global definiert **
Set Tabelle20 = Sheets("Tabelle1") ' ** ist anscheinend global definiert **
With Tabelle20                     ' ist anscheinend global definiert
For Spalte = 32 To 33
If Spalte = 32 Then SpaltenString = "E:F" Else SpaltenString = "G:H"
If Cells(Spalte, 1) = 0 Then ' ohne "", da Zahlenwert
.Columns(SpaltenString).Hidden = True 'spalte ausblenden
Else
.Columns(SpaltenString).Hidden = False
End If
Next Spalte
End With
End Sub
Die zwei Zeilen mit den ** im Kommentar habe ich eingefügt, damit das Makro bei mir ohne weitere Änderung funktioniert, die kannste komplett löschen.
Schöne Grüße,
Michael
P.S.: Ich finde es etwas unglücklich, die Funktionalität an das Worksheet_Calc zu hängen - das wird bei jeder Eingabe ausgeführt und ist meist unnütz. Außerdem würde ich mich als Anwender ärgern, wenn ich den "letzten" vorhandenen Wert in F gelöscht hätte, es mir anders überlege und die Spalte erst händisch wieder einblenden müßte, um das rückgängig zu machen.

Anzeige
AW: VBA zum Spaltenausblenden
01.07.2015 07:32:31
Stefan
Also erstmal vielen Dank, es funktioniert.
Du hast mir damit sehr geholfen.
Mit dem Worksheet_Calc ist das so, ich habe 19 Tabellenblätter vorgeschaltet wo Werte über ein Userform in die einzelnen Tabellenblätter eingetragen werden. Die letzte Seite fasst die Mittelwerte der einzelnen Tage in Wochenmittelwerte zusammen. Wenn nun in einer Tabelle Spalte nichts steht, weil in dieser Woche keine Werte zustande gekommen sind wird sie Ausgeblendet. Ich trage also händisch nichts in die Spalten ein. Die Werte kommen von den Tabellenblättern davor.
Wenn ich jetzt noch mehr Spalten ansprechen wollen würde, was müsst ich dann machen?
Zum Beispiel:
Blende zusätzlich noch Spalte 9+10 aus wenn in A34 eine 0 steht

Anzeige
AW: VBA zum Spaltenausblenden
01.07.2015 10:29:02
Stefan
Habs hin bekommen hatte das "End If" vergessen. Hier nochmal der Code
Vielen Dank für die Hilfe nochmals.
Gruß Stefan
Option Explicit
Private Sub Worksheet_Calculate()
Dim Spalte As Integer
Dim Spalte1 As Integer
Dim Spalte2 As Integer
Dim Spalte3 As Integer
Dim SpalteEnd As Integer
Dim SpaltenString As String
With Tabelle20                     ' ist anscheinend global definiert
For Spalte = 32 To 33
If Spalte = 32 Then SpaltenString = "E:F" Else SpaltenString = "G:H"
If Cells(Spalte, 1) = 0 Then ' ohne "", da Zahlenwert
.Columns(SpaltenString).Hidden = True 'spalte ausblenden
Else
.Columns(SpaltenString).Hidden = False
End If
For Spalte1 = 34 To 35
If Spalte1 = 34 Then SpaltenString = "I:J" Else SpaltenString = "K:L"
If Cells(Spalte1, 1) = 0 Then ' ohne "", da Zahlenwert
.Columns(SpaltenString).Hidden = True 'spalte ausblenden
Else
.Columns(SpaltenString).Hidden = False
End If
For Spalte2 = 36 To 37
If Spalte2 = 36 Then SpaltenString = "M:N" Else SpaltenString = "O:P"
If Cells(Spalte2, 1) = 0 Then ' ohne "", da Zahlenwert
.Columns(SpaltenString).Hidden = True 'spalte ausblenden
Else
.Columns(SpaltenString).Hidden = False
End If
For Spalte3 = 38 To 38
If Spalte3 = 38 Then SpaltenString = "Q:R" Else SpaltenString = "Q:R"
If Cells(Spalte3, 1) = 0 Then ' ohne "", da Zahlenwert
.Columns(SpaltenString).Hidden = True 'spalte ausblenden
Else
.Columns(SpaltenString).Hidden = False
End If
Next Spalte3
Next Spalte2
Next Spalte1
Next Spalte
End With
End Sub

Anzeige
Kleine Optimierung
01.07.2015 16:08:25
Michael
Hallo Stefan,
es freut mich, wenn es funktioniert, denn das ist die Hauptsache!
Allerdings hat mich das dringende Bedürfnis überkommen, Deinen Code etwas zu optimieren:
Private Sub Worksheet_Calculate()
Dim Spalte As Integer
Dim SpalteEnd As Integer, richtigeSpalte As Integer
Dim SpaltenString As String
Dim Tabelle20 As Worksheet         ' ** ist anscheinend global definiert **
Set Tabelle20 = Sheets("Tabelle1") ' ** ist anscheinend global definiert **
With Tabelle20                     ' ist anscheinend global definiert
richtigeSpalte = 0
For Spalte = 32 To 38
SpaltenString = Chr(Spalte + 37 + richtigeSpalte) & ":" & Chr(Spalte + 38 + richtigeSpalte)
richtigeSpalte = richtigeSpalte + 1
'  Debug.Print Spalte & ": " & SpaltenString
If Cells(Spalte, 1) = 0 Then ' ohne "", da Zahlenwert
.Columns(SpaltenString).Hidden = True 'spalte ausblenden
Else
.Columns(SpaltenString).Hidden = False
End If
Next Spalte
End With
End Sub

Ich hatte zum Testen die oben auskommentierte debug-Ausgabe (kennst Du die? Im VBA-Fenster unter "Ansicht" das "Direktfenster" anklicken) verwendet (und das komplette If auskommentiert), und ausgegeben wurde ...

32: E:F
33: G:H
34: I:J
35: K:L
36: M:N
37: O:P
38: Q:R
... nämlich genau das, was Du als "SpaltenString" benötigst.
Müßte auch bei Dir klaglos funktionieren, wenn Du (wie gehabt) die Zeilen mit den ** rausnimmst.
Schöne Grüße,
Michael
P.S.: Ich weiß ja nicht, wie Deine Tabelle aussieht, aber ich verwende in solchen Fällen gerne eine halb/halb-Lösung, d.h. simple Eingaben wie den SpaltenString kann ich genauso gut (wenn denn dort Platz ist, wenn nicht, eben woanders) in B32 bis B38 unterbringen und dort bei Bedarf händisch eingeben.
D.h., wenn Du dann etwas ändern möchtest, mußt Du nicht erst im Code nachsehen, sondern kannst beliebige Werte einfach direkt in der Tabelle ändern.
Angenommen, es sieht so aus ...
Userbild
dann schreibt sich der Code noch simpler:
Private Sub Worksheet_Calculate()
Dim Spalte As Integer
Dim SpalteEnd As Integer
Dim SpaltenString As String
Dim Tabelle20 As Worksheet         ' ** ist anscheinend global definiert **
Set Tabelle20 = Sheets("Tabelle1") ' ** ist anscheinend global definiert **
With Tabelle20                     ' ist anscheinend global definiert
For Spalte = 32 To 38
SpaltenString = Cells(Spalte, 2)
'  Debug.Print Spalte & ": " & SpaltenString
If Cells(Spalte, 1) = 0 Then ' ohne "", da Zahlenwert
.Columns(SpaltenString).Hidden = True 'spalte ausblenden
Else
.Columns(SpaltenString).Hidden = False
End If
Next Spalte
End With
End Sub

P.P.S.: Übrigens, wenn diese Funktionalität erwünscht ist, sobald Daten von anderen Makros aus dort hin kopiert wurden, warum dann nicht einfach das WorkSheet_Calc durch einen Funktionsnamen Ausblenden ersetzen und vom "letzten" Kopiermakro aus aufrufen?

Anzeige
AW: Kleine Optimierung
02.07.2015 13:05:10
Stefan
Danke für den Tip. Ich lass den Code aber erstmal wie er ist. weil sich an der Spaltenanzahl nichts ändern wird. Die Spalten sind in Kalenderwochen eingeteilt. Immer für einen Monat, deshalb werden keine hinzukommen. Aber für andere Funktionen dieser Art werde ich mir das merken.
Jetz wo alles zusammengebaut ist zeigt sich noch ein Problem.Wenn ich auf diesem Tabellenblatt einen Blattschutz einfüge zeigt er nen Laufzeitfehler an. Kann man das umgehen?

Nachtrag
30.06.2015 14:29:10
Michael
Ach so, nicht ganz richtig gelesen.
Das setzt voraus, daß Du in *jeder* Spalte in Zeile 32 die Formel hast, also beginnend bei Spalte A:
=WENN(MAX(A5:A26)=0;0;1)
und das dann so weit nach rechts kopieren, wie Du es eben benötigst.

AW: Nachtrag
30.06.2015 15:02:02
Stefan
Hi,
vielleicht hab ich mich etwas ungeschickt ausgedrückt.
Der Code arbeitet wie er soll. Er blendet mir Spalte 5 + 6 aus wenn in Zelle "A32" eine 0 steht.
Alles gut soweit bin ich selber gekommen.
Nun Soll er aber zusätzlich Spalte 7 + 8 Ausblenden wenn in "A33" eine 0 steht
Dafür bin ich noch zu schwach auf dem Gebiet. Ich hätt ja einfach den Code kopiert und dadrunter eingefügt und die Pararmeter geändert das reicht aber wohl nicht.
Danke für die Hilfe bisher.
Anzeige

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige