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 ...
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?