Hi, ich habe bereits ein VBA, wenn ein Satz in einer bestimmten Zelle auftaucht, dann soll die eine Spalte eingeblendet werden. Kann man das verkürzen?

2 Antworten


If Range("V2") = "SATZ A" Then
Columns("X:Y").Hidden = True
Columns("W").Hidden = False
End If

If Range("V2") = "SATZ B" Then
Columns("Y").Hidden = True
Columns("W").Hidden = True
Columns("X").Hidden = False
End If

If Range("V2") = "SATZ C" Then
Columns("W:X").Hidden = True
Columns("Y").Hidden = False
End If


So kannst du es einkürzen

Danke, aber ich möchte halt nicht mehr immer V2, V3 und so weiter bestimmen. Sondern das komplett die Spalte V abgesucht wird, und dann die jewielige Zeile aus- oder eingeblendet wird.

0

Ohne genauere Hintergründe kann ich es nicht noch kürzer machen, wäre aber je nach Code und funktion machbar. Aber denke das ist n Anfang für dich.

Sag mal, für welche Zellen gibt es diese Abfrage?
Das könnte man vermutlich schön in ne Schleife einbauen, dann wird das ganze um 2-3 Zeilen länger und alles ist erledigt ;)

If Range("V2") = "SATZ A" Then
Columns("W:Y").EntireColumn.Hidden = True
Columns("W").EntireColumn.Hidden = False
Range("W2").Select
ElseIf Range("V2") = "SATZ B" Then
Columns("W:Y").EntireColumn.Hidden = True
Columns("X").EntireColumn.Hidden = False
Range("X2").Select
ElseIf Range("V2") = "SATZ C" Then
Columns("W:Y").EntireColumn.Hidden = True
Columns("Y").EntireColumn.Hidden = False
Range("Y2").Select
End If

Hi, alle Sätze stehen immer in der Spalte V. Also V2, V3, V4 und so weiter. Kannst du da noch was optimieren?

0
@KaiserWilhelmXL

Und wenn in V2 nun SATZ A steht und in V3 SATZ B, was sollte dann passieren?! Zählt immer der letzte satz?

Denn die wiedersprechen sich ja sonst.
Satz A sagt "ZEIG MIR SPALTE W"
Satz B sagt "ZEIG MIR SPALTE X"

Wenn nun A und B vorkommt?! Soll er beides einblenden?
Oder immer nur die Zelle lesen, die gerade bearbeitet wurde?!

1
@verreisterNutzer

Danke für deine Bemühungen. Du hast natürlich Recht, ich habe mein Anliegen nicht genau geschildert.

Also:

Wenn Satz A -> dann nur Einblenden Spalte W

Wenn Satz B -> dann nur Einblenden Spalte X

Wenn Satz C -> dann nur Einblenden Spalte Y

Ansonsten sollen die Spalten W, X und Y standartmäßig ausgeblendet werden und nur dann eingeblendet werden, wenn der jeweilige Satz kommt. Des Weiteren soll das VBA permanent im Hintergrund laufen. Danke

0
@KaiserWilhelmXL

Ok, aber noch immer die Frage... Soll die Spalte nur auf die aktuell eingegebene Zelle reagieren?

Dann funktioniert es so:

Private Sub Worksheet_Change(ByVal Target As Range)

Columns("W:Y").EntireColumn.Hidden = True

If Cells(Target.Row, 22) = "SATZ A" Then
Columns("W").EntireColumn.Hidden = False
ElseIf Cells(Target.Row, 22) = "SATZ B" Then
Columns("X").EntireColumn.Hidden = False
ElseIf Cells(Target.Row, 22) = "SATZ C" Then
Columns("Y").EntireColumn.Hidden = False
End If

End Sub


Die Zellen W, X und Y werden immer ausgebelndet.
Nur wenn SATZ A, SATZ B oder SATZ C geschrieben wird, zeigt sich eine der Spalten.

Hoffe das wolltest du so?!

Kurz erklärt:
22 steht für Spalte V
Target.Row steht immer für die aktuell geänderte Zeile.
So wird nicht immer alles durchgerechnet, sondern NUR die Zelle, die aktuell bearbeitet wurde.

Wenn du möchtest, dass das Makro nur läuft, wenn spalte V bearbeitet wird, gib bescheid.
Sonst werden aktuell die Zellen alle ausgeblendet, wenn du woanders was machst.
kannst ja testen.

1
@KaiserWilhelmXL

Ich schließe aus der Antwort, dass es funktioniert hat?! :-)
Das freut mich.
Vllt gibst mir bzw. der Antwort dann ne gute Wertung und dann auch den Status der "hilfreichsten Antwort" :-)

Grüße

1
@verreisterNutzer

Ansich ja, aber wenn ich diese Tabellenblatt exportiere, dann bekomme ich mit identischen Code eine Fehlermeldung. Das verstehe ich nicht:

"Die Hidden-Eigenschaft des Range-Objektes kann nicht festgelegt werden".

Es sind die gleichen Daten, der gleiche Code, nur als exportierte Datei und es geht nicht mehr.

0
@KaiserWilhelmXL

Ah das kann an mein Passwort schutzt liegen, kann man das in dem Code einbinden, also erst Schutz aufheben und danach wieder Schutz aktivieren?

0
@KaiserWilhelmXL

Blattschutz mach ich immer in ein eigenes sub, das ich dann im code aufrufe. So etwa:

(So kann ich das Passwort einmal ändern und muss nicht in allen markos nachsehen, wo ich Blattschutz aktiviere und deaktiviere)

Private Sub BlattschutzAUS()
ActiveSheet.Unprotect Password:="DEIN PASSWORT"
End Sub
Private Sub BlattschutzEIN()
ActiveSheet.Protect Password:="DEINPASSWORT", DrawingObjects:=False, Contents:=True, Scenarios:=True
End Sub

Zum Aufrufen während eines Makros dann so:

...
Call BlattschutzAUS
...
Call BlattschutzEIN
...
1
@verreisterNutzer

So geht es jedefalls nicht :(


Private Sub Worksheet_Change(ByVal Target As Range)

ActiveSheet.Unprotect Password:=",,,,"

Columns("W:Y").EntireColumn.Hidden = True

If Cells(Target.Row, 22) = "SATZ A" Then
Columns("W").EntireColumn.Hidden = False
ElseIf Cells(Target.Row, 22) = "SATZ B" Then
Columns("X").EntireColumn.Hidden = False
ElseIf Cells(Target.Row, 22) = "SATZ C" Then
Columns("Y").EntireColumn.Hidden = False
End If

ActiveSheet.Protect Password:=",,,,"

End Sub

0
@verreisterNutzer

Das ist sehr schwierig zu beschriebn ohne zu detailiert zu werden.

Ich habe eine große Excel-Datei in dem viele Tabellenblätter enthalten sind. Diese werden per Makro exportiert und mit einen Blattschutz versehen um diese dann per E-Mail verschickt zu werden.

Und im Zuge dessen möchte ich viele Funktionien per VBA automatisieren. Einige habe ich gut gelöst, bei einigen anderen benötige ich Hilfe.

Unteranderen jetzt dies hier. Da funktioniert dein Code wunderbar, habe aber logischerweise dann MIT Blattschutz Probleme.

Danke für dein Engagement.

0
@KaiserWilhelmXL

Nutzt du einen Blattschutz oder einen Arbeitsmappen-Schutz?!
Denn wenn ich den Blattschutz aufhebe, dann mein makro laufen lasse und dann den BLattschutz neu setze, dann funktioniert es wie ich es will.

Wenn du das ganze in einer exportierten Mappe versuchst, ist dann gewährleistet, dass der VBA-Code auch mit in der exportierten mappe ist?!

1
@verreisterNutzer

Ja, der VBA Code ist auch in dem exportierten File genau so vorhanden.

Ich nutze einen Blattschutz.


Wie sieht dein Code mit Blattschutz dann aus?

0
@KaiserWilhelmXL

Getestet und geht auch:

EDIT: Also passt es bei dir und geht auch?
Tipp: Mach auf das VBA-Makro noch n Schutz, sonst kann jeder deinen Code sehen und auch das Passwort nachlesen ;)

Private Sub BlattschutzAUS()
ActiveSheet.Unprotect Password:="DEINPASSWORT"
End Sub

Private Sub BlattschutzEIN()
ActiveSheet.Protect Password:="DEINPASSWORT", DrawingObjects:=False, Contents:=True, Scenarios:=True
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

Call BlattschutzAUS

Columns("W:Y").EntireColumn.Hidden = True

If Cells(Target.Row, 22) = "SATZ A" Then
Columns("W").EntireColumn.Hidden = False
ElseIf Cells(Target.Row, 22) = "SATZ B" Then
Columns("X").EntireColumn.Hidden = False
ElseIf Cells(Target.Row, 22) = "SATZ C" Then
Columns("Y").EntireColumn.Hidden = False
End If

Call BlattschutzEIN

End Sub

1
@KaiserWilhelmXL

Ja. VBA-Codes musst du extra schützen.
Dazu auf das VBA-Projekt rechtsklick machen und in den Eigenschaften den Schutz aktivieren (Haken bei "für die Anzeige sperren" ist wichtig)

0
@KaiserWilhelmXL

Unsere Antworten überschneiden sich dauernd :D


Ja. VBA-Codes musst du extra schützen.
Dazu auf das VBA-Projekt
rechtsklick machen und in den Eigenschaften den Schutz aktivieren (Haken bei "für die Anzeige sperren" ist wichtig)

0
@verreisterNutzer

Stimmt xD

Kann ich das automatisiert mit in einem Code einbinden? Per Makro aufnehmen hat irgendwie nicht geklappt.

0
@KaiserWilhelmXL

Das wird nicht gehen.
Schau mal nach, ob der VBA-Code nicht sowieso geschützt exportiert wird.
Da habe ich leider selbst keine Erfahrung mit.

0
@verreisterNutzer

OK, kein Ding. VIELEN DANK!!

Kennst du dich noch mit folgenden Sachen bzgl. VBA aus?

- letzte Zeile erkennen und alle darunter liegenden Zeilen ausblenden

- Versendete E-Mail aus Outlook in einem bestimmten Ordner auf mein Lautwerk exportieren

- Alle Tabellenblätter sortieren, außer Tabellenblatt A und Tabellenblatt B NICHT sortieren

0
@KaiserWilhelmXL

- letzte Zeile erkennen und alle darunter liegenden Zeilen ausblenden

Sub ausblenden()
'Alles unter dem letzten Wert in Spalte A ausblenden
Dim letztezeile As Integer
letztezeile = ActiveSheet.Cells(1048576, 1).End(xlUp).Offset(1, 0).Row 'Ab Excel 2007
Range(Rows(letztezeile), Selection.End(xlDown)).EntireRow.Hidden = True
End Sub

- Versendete E-Mail aus Outlook in einem bestimmten Ordner auf mein Lautwerk exportieren

Verstehe nicht ganz was du willst :-)

- Alle Tabellenblätter sortieren, außer Tabellenblatt A und Tabellenblatt B NICHT sortieren

Wie soll hier nach was sortiert werden?!
Hast du eine Ausgangsdarstellung und sortierung?
0
@verreisterNutzer

- letzte Zeile erkennen und alle darunter liegenden Zeilen ausblenden

Funktioniert gut, nur leider erkennt er auch eine Formel als befüllt. Obwohl die Zelle ansich leer ist. Kannst da noch was ändern?

- Versendete E-Mail aus Outlook in einem bestimmten Ordner auf mein Lautwerk exportieren

Naja, ich möchte das Ablegen von E-Mail auf meinem Laufwerk automatisieren. Das heißt, dass VBA soll Outlook aktivieren und die letzte verschickte E-Mail markieren exportieren und in den Ordner C:/... usw ablegen.

- Alle Tabellenblätter sortieren, außer Tabellenblatt A und Tabellenblatt B NICHT sortieren

Es soll einfach in Spalte A aufsteigend sortieren werden.

0
@KaiserWilhelmXL

- letzte Zeile erkennen und alle darunter liegenden Zeilen ausblenden


Muss ich mal testen. Wenn ich was finde melde ich mich

- Versendete E-Mail aus Outlook in einem bestimmten Ordner auf mein Lautwerk exportieren

Da kann ich dir leider nicht helfen. Sry

- Alle Tabellenblätter sortieren, außer Tabellenblatt A und Tabellenblatt B NICHT sortieren

Also willst du nicht Tabellenblätter sortieren, sondern in einem Tabellenblatt eine Tabelle?
Das geht prinzipiell so: (Hier im Test A1 bis B10. Kann beliebig erweitert werden)

Sub BereichSortieren()
With ActiveWorkbook.Worksheets("Tabelle1").Sort
.SetRange Range("A1:B10")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub



0
@verreisterNutzer

Zum thema letzte Zeile und darunter ausblenden (Auch formeln, die nichts anzeigen)

Erfolgreich getestet mit Excel 2007

Sub ausblenden()
'Alles unter dem letzten Wert in Spalte A ausblenden
Dim letztezeile As Integer
letztezeile = ActiveSheet.Cells(1048576, 1).End(xlUp).Offset(1, 0).Row 'Ab Excel 2007
'Wenn Formel enthalten, die aber Zelle nicht füllt, auch ausblenden
repeat:
If Cells(letztezeile, 1).Value = 0 Then
letztezeile = letztezeile - 1
GoTo repeat
End If
Range(Rows(letztezeile), Selection.End(xlDown)).EntireRow.Hidden = True
End Sub
1
@verreisterNutzer

Ich möchte ja alles Tabellenblätter von meiner Datei sortieren.

Da ich aber so viele Tabellenblätter habe, locker 30 oder so. Möchte ich ungerne alle einzeln im VBA bestimmen. Dazu kommt, dass es auch zwei Tabellenblätter gibt die nicht sortieret werden dürften.

0
@KaiserWilhelmXL

2007 und 2010 bauen meines Wissens nach gleich auf, was VBA Codierung angeht. Dürfte also keinen Unterschied machen.

1
@KaiserWilhelmXL

Dann hilft dir eine Schleife wie diese:
(Beim Code fügst du einfach einen Code ein, der in diesen Tabellenblättern ausgeführt werden soll. Kann auch mit Call xxx ein anderes Makro als Untermakro ausführen)

Sub test()

'On Error führt dazu, wenn weniger als 10000 Tabellenblätter sind, werden die Fehlermeldungen ignoriert die auftauchen würden.
On Error GoTo ende

'Schleife startet bei 3, weil du die ersten zwei Tabellenblätter ja nicht sortieren willst
For i = 3 To 10000
'Aktiviert das nächste Tabellenblatt
Worksheets(i).Select
'Hier den Code was dann au8f dem Tabellenblatt passieren soll

Next i

'Am Ende der Schleife eine Textbox die Zeigt wie viele Tabellenblätter durchlaufen wurden.
ende:
MsgBox "Die Schleife ist " & i - 3 & "x durchgelaufen."
End Sub
0

Wie kann ich in VBA-Excel einen Filter setzen über einer CheckBox?

Hi,

ich suche eine einfachere Lösung für meine UserForm um über CheckBoxen meine Tabelle zu Filtern.

Im grunde möchte ich also, wenn ich einen Wert ankreuze soll dieser Gefiltert werden.

Wie im Beispiel (unten):

FKEP und KKEP angekreuzt = FKEP und KKEP angezeigt.

Nur KKEP angekreuzt = nur KKEP angezeigt

"Wert" der gefiltert werden soll | CheckBox Name
 FKEP                              CBFilterFKEP
 KKEP                              CBFilterKKEP
 KfB                               CBFilterKfB
 ausgesch.                         CBFilterausgesch
 beendet                           CBFilterbeendet
 EQ - KfB                          CBFilterEQKfB
 EQ - FKEP                         CBFilterEQFKEP

Mein momentaner Code schaut wiefolgt aus:

    Private Sub CBFilterFKEP_Click()

If CBFilterFKEP = True Then

    Sheets("Gesamtdaten").Range("$A$2:$EQ$502").AutoFilter Field:=3, Criteria1:=Array( _
    "FKEP"), Operator:=xlFilterValues

If CBFilterKKEP = True Then

    Sheets("Gesamtdaten").Range("$A$2:$EQ$502").AutoFilter Field:=3, Criteria1:=Array( _
    "FKEP", "KKEP"), Operator:=xlFilterValues

End If
End If
End Sub

Private Sub CBFilterKKEP_Click()

    If CBFilterKKEP = True Then

        Sheets("Gesamtdaten").Range("$A$2:$EQ$502").AutoFilter Field:=3, Criteria1:=Array( _
        "KKEP"), Operator:=xlFilterValues

    If CBFilterFKEP = True Then

        Sheets("Gesamtdaten").Range("$A$2:$EQ$502").AutoFilter Field:=3, Criteria1:=Array( _
        "KKEP", "FKEP"), Operator:=xlFilterValues

    End If
    End If
    End Sub

Soweit so gut ... nun habe ich aber nur FKEP und KKEP "abgestimmt" ... muss ich nun alle 5 Werte auch "abstimmen" ? Das wird nämlich ein SEHR langer code ... und ich könnte wetten das es in VBA viel leichter geht ...

Hat wer eine Idee von euch?

MfG Tim

...zur Frage

Wie kann man in Access mehrere Filter per ODER verknüpfen?

Ich habe eine Access Datenbank-Tabelle mit den Einträgen Ersatzteilnummer, Materialtext, Typennummer, Sonstige Nummer und Kommentar.

Über ein Formular mit Suchfeld möchte ich mir Alle Datensätze anzeigen lassen, bei denen mindestens eine der Spalten meiner Datenbank den Suchbegriff enthält. Es sollen also alle Datensätze angezeigt werden bei denen die Eingabe im Materialtext vorkommt ODER in der Typennummer ODER im Kommentar usw.

Der Filter wie unten eingefügt funktioniert mehr oder weniger, jedoch habe ich so keine ODER Verknüpfung. Hat vielleicht jemand eine Idee, wie ich das realisieren könnte?

Vielen lieben Dank!! Max

If Len(Me!txtQSf) > 0 Then

Me.Filter = ""
       If Ersatzteilenummer Like "" & Me!txtQSf & "" Then
       Me.Filter = "Ersatzteilenummer LIKE '" & Me!txtQSf & "'"
       Me.FilterOn = True
    Else
        If Materialtext Like "*" & Me!txtQSf & "*" Then
            Me.Filter = "Materialtext LIKE '*" & Me!txtQSf & "*'"
            Me.FilterOn = True
        Else
                If Typennummer Like "*" & Me!txtQSf & "*" Then
                     Me.Filter = "Typennummer LIKE '*" & Me!txtQSf & "*'"
                     Me.FilterOn = True
                Else
                  If Kommentar Like "*" & Me!txtQSf & "*" Then
                      Me.Filter = "Kommentar LIKE '*" & Me!txtQSf & "*'"
                      Me.FilterOn = True
                  Else
                    If Sonstige_Nummer Like "*" & Me!txtQSf & "*" Then
                            Me.Filter = "Sonstige_Nummer LIKE '*" & Me!txtQSf & "*'"
                            Me.FilterOn = True
                    Else
                        Me.Filter = "Materialtext LIKE '*" & Me!txtQSf & "*'"
                        Me.FilterOn = True                              
     End If
     End If
     End If
     End If
     End If
Else
Me.Filter = ""
Me.FilterOn = False
End If

End Sub

...zur Frage

Was möchtest Du wissen?