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

function - Filter

function - Filter
11.12.2008 12:03:00
Rocky
Hallo Excelfreunde,
Ich hab mir Function erstellt die nur die angezeigten gefilterten Inhalte anzeigt.

Private Function Gefiltert(Bereich As Range, Zeile As Integer) As Variant
Dim b As Long
For Each Row In Bereich
If Cells(Row, Bereich.Column).EntireRow.Hidden = False Then
b = b + 1
If b = Zeile Then
Gefiltert = Cells(Row, Bereich.Column)
Exit Function
End If
End If
Next
End Function


Wenn ich aber die Formel [=Gefiltert(Test!$A$1:$A$105;ZEILE()) ] eingebe kommt immer nur #Wert!
Hier die Datei zum rumspielen : https://www.herber.de/bbs/user/57545.xls
Danke für eure Hilfe
Gruß Rocky

26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: function - Filter
11.12.2008 12:52:00
Tino
Hallo,
mit solchen Funktionen kannst Du in Excel auch nichts verändern.
Eine Funktion aus einer Zelle aufgerufen, kann seine Umgebung nicht verändern!
Du müsstest also auf ein Event (Worksheet_Change, Worksheet_Calculate usw.) ausweichen und die Funktion aus einer Sub aufrufen.
Gruß Tino
AW: function - Filter
11.12.2008 12:56:00
Rocky
Hallo Tino,
im Prizip funktioniert das schon. Wenn ich statt A1 auf A2 ändere
=Gefiltert(Test!$A$2:$A$105;ZEILE())
bekomm ich auch nen Ergebnis. nur um ein Verschoben. Aber ich krieg es nicht hin das es auch mit A1 funst.
Gruß Rocky
AW: function - Filter
11.12.2008 13:08:05
Tino
Hallo,
habe mir Deine Tabelle mal angesehen,
bin mir aber nicht sicher ob ich Dein vorhaben richtig verstanden habe.
Versuche es mal mit diesem Code.
Private Function Gefiltert(Bereich As Range, Zeile As Integer) As Variant

   Dim b As Long
   Dim Zelle As Range
   
      If Bereich(Zeile).EntireRow.Hidden = False Then
            Gefiltert = Bereich(Zeile)
            Exit Function
      End If

   Gefiltert = ""
   
End Function


Gruß Tino

Anzeige
Die Zeile "Dim Zelle As Range" rausschmeißen oT.
11.12.2008 13:21:00
Tino
Perfekt. owT
11.12.2008 13:44:11
Rocky
Danke
Gruß Rocky
@Tino - doch nicht Perfekt
11.12.2008 14:07:00
Rocky
Hallo Tino,
die Daten sollten ab untereinander aufgelistet werden, Wenn du jetzt filterst, dann hast du ja leerzeilen.
Gibt es da ne Lösung?
Gruß Rocky
AW: @Tino - doch nicht Perfekt
11.12.2008 14:19:34
Tino
Hallo,
mach es doch ohne solch eine Funktion.
kommt als Code in die Tabelle1
Option Explicit 
 
Private Sub Worksheet_Activate() 
Dim Bereich As Range 
Set Bereich = Sheets("Test").Range("A:A").SpecialCells(xlCellTypeVisible) 
 Bereich.Copy Tabelle1.Range("A1") 
End Sub 


Gruß Tino

Anzeige
AW: @Tino - doch nicht Perfekt
11.12.2008 14:29:00
Rocky
Das will ich ja gerade nicht. ich will es als Addin machen, da hab ich kein Worksheet_Activate. Ne Function kann ich aber dann immer anwenden wenn ich es will.
Meine Funktion hat ja schon fast geklappt, doch da muss irgendein denkfehler drin sein.
Kannst du nicht noch mal gucken ob du ne Function Lösung hinbekommst. Bitte Bitte
Gruß Rocky
AW: @Tino - doch nicht Perfekt
11.12.2008 15:38:41
Tino
Hallo,
ich muss bei dieser Aufgabenstellung passen, die Prüfung wird mir zu aufwendig.
Man müsste immer die vorangegangenen Ergebnisse in die Prüfung mit einbeziehen, sonst bekommt man doppelte Ergebnisse.
Sorry, ich lass die Frage auf offen stehen.
Gruß Tino
Anzeige
AW: @Tino - doch nicht Perfekt
11.12.2008 15:44:00
Reinhard
Ho Rocky,
rechts über dem Eiingabefeld ist ein Kästchen, hak das an wie ich jetzt, damit ist die Frage als noch offen gekennzeichnet.
Kopiere beide prozeduren in ein Modul, ggfs. bennene die vorhandene Gefiltert um in Gefilltert2 o.ä. weil Namen dafür nicht doppelt vergeben dürfen.
Dann filtere in Test und starte dann Lade, sind die Anzeigen dann das was du willst? Also Reihenfolge und Inhalt? Soll das so dann in Tabelle1 gelistet sein ?
Dann kopiere dir beliebogen Text mit Strg+C , gehe zu Tabelle1!A1, drücke F2 und Enter, ggfs. bei den anderen Zellen in A wiederholen, Excel ist da ncht eindeutig.
Irgednwie wurde der Copy Befehl in der Funktioon nicht ausgeführt sondern das ausgegeben was man zuvor reinkopiert hatte.
Ich stehe da vor einem Rätsel warum das in lade funktioniert und in der Funktion nicht, vielleicht kriegst du bzw. Tino das hin, muß jetzt mal abschalten davon, genug ausprobiert :-)
Gruß
Reinhard

Option Explicit
Private Function Gefiltert(Bereich As Range, Zeile As Long) As Variant
Dim MyData As New DataObject, Spalte, s
Worksheets("Test").Range("A1:A105").SpecialCells(xlCellTypeVisible).Copy
MyData.GetFromClipboard
Spalte = MyData.GetText(1)
Spalte = Left(Spalte, Len(Spalte) - 2)
s = Split(Spalte, Chr(13) & Chr(10))
If Zeile 


Anzeige
AW: @Tino - doch nicht Perfekt
11.12.2008 16:59:30
Tino
Hallo,
mir hat es jetzt keine Ruhe gelassen, hier mein Ergebnis.
Private Function Gefiltert(Bereich As Range, Zeile As Integer) As Variant
Dim lngCounter As Long
Dim Zelle As Range
For Each Zelle In Bereich
 
     If Zelle.EntireRow.Hidden = False Then
      lngCounter = lngCounter + 1
     End If
      
      If lngCounter = Zeile Then
        Gefiltert = Zelle
        Exit Function
      ElseIf lngCounter > Zeile Then
        Exit For
      End If
    
    Next Zelle
Gefiltert = ""
End Function


Was mir eben nicht gefällt, dass man immer alle Zellen durcheiern muss.
(also Bereich möglichst klein halten)
Leider sind in einer Funktion die Möglichkeiten stark eingeschränkt und man kann z. Bsp. nicht nur die Sichtbaren Zellen an ein Rangeobjekt übergeben um.:-(
Gruß Tino

Anzeige
Was meinst du damit,...
11.12.2008 17:18:36
Luc:-?
...Tino:
Leider sind in einer Funktion die Möglichkeiten stark eingeschränkt und man kann z. Bsp. nicht nur die Sichtbaren Zellen an ein Rangeobjekt übergeben um. Um... was...?
Ist mir leider unverständlich...
Gruß Luc :-?
Mir ist der Saft ausgegangen...
11.12.2008 17:49:00
Tino
Hallo,
na Du musst immer alle Zellen durchlaufen von A1 bis zur letzten.
In einer Sub, brauche ich diesen Bereich nur einmal durchlaufen.
Dim a As Long
Dim Bereich As Range

For Each Bereich In Sheets("Test").Range("A1:A40").SpecialCells(xlCellTypeVisible)
 a = a + 1
 Cells(a, 1) = Bereich
Next Bereich


Ist nur ein Beispiel, dies würde ich über Copy machen und überhaupt keine Schleife verwenden
Etwas Besseres ist mir auch nicht eingefallen.
Gruß Tino

Anzeige
Das erklärt zwar nicht die etwas krude Syntax...
11.12.2008 18:11:00
Luc:-?
...und Logik des zitierten Satzes, Tino,
aber wenigstens das, was du meinst... ;-)
Tja, das hat eine udF nun mal mit allen anderen xlFktt gemein - wird ein Bereichsbezug angegeben, müssen alle Zellen desselben behandelt wdn. Nur die eingesetzten Methoden sind da wohl unterschiedlich...
Aber das ist eigentlich keine Einschränkung! Die Einschränkungen liegen woanders, sonst würde ja jede Formelzelle wie eine Subroutine fkt und das womöglich auch noch automatisch (nicht manuell), quasi wie eine sich stets und ständig vielfach selbstauslösende Ereignisprozedur! Das könnte natürlich, je nach Fktsinhalt, schnell zur Katastrophe führen.
Gruß Luc :-?
Anzeige
Wie gesagt, Saft war aus ;-)
11.12.2008 19:02:00
Tino
Hallo,
hier noch ein Beispiel dafür, dass es bei Funktionen Einschränkungen gibt.
Im Beispiel machen beide eigentlich dasselbe, aber der Funktion ist es einfach mal egal ob Zellen ausgeblendet sind!
Es werden die Gleichen Zellbereiche übergeben in denen mehrere Zeilen ausgeblendet sind.
Option Explicit

'hier wird aus dem gleichen Zellbereich 
'nur die Adressen der Sichtbaren Zellen wiedergegeben 
Sub Test_Sub()
Dim Bereich As Range
Set Bereich = Sheets("Test").Range("A1:A40")

Debug.Print Bereich.SpecialCells(xlCellTypeVisible).Address


End Sub

'vom Prinzip her macht diese Funktion das gleiche wie die Sub 
'Dieser Funktion ist es aber Wurscht ob da Zellen ausgeblendet sind! 
Function Funktion(Bereich As Range) As String

 Funktion = Bereich.SpecialCells(xlCellTypeVisible).Address


End Function


Gruß Tino

Anzeige
AW: Das erklärt zwar nicht die etwas krude Syntax...
11.12.2008 20:39:55
Reinhard
Hallo Luc,
wo die Begriffsstutzigkeit ausgeteilt wurde habe ich mich wohl mehrmals in die erste Reihe vorgedrängt.
Ich habe, wohl wie Tino auch, immens zeit und Mühe in das Problem gesteckt. In dieser Beitragsfolge mehrmals die Beiträge, gerade die unteren mehrfach gelesen.
Warum die Prozedur Lade klappt und das mit der Funktion Gefiltert nicht ist mir leider immer noch unklar.
Ich sehe da nichts was eine Funktion nicht dürfte, was übersehe/weiß ich nicht?

Option Explicit
Private Function Gefiltert(Bereich As Range, Zeile As Long) As Variant
Dim MyData As New DataObject, Spalte, s
Worksheets("Test").Range("A1:A105").SpecialCells(xlCellTypeVisible).Copy
MyData.GetFromClipboard
Spalte = MyData.GetText(1)
Spalte = Left(Spalte, Len(Spalte) - 2)
s = Split(Spalte, Chr(13) & Chr(10))
If Zeile 


Danke ^ Gruß
Reinhard

Anzeige
Funktionen haben Einschränkungen!
11.12.2008 20:58:00
Tino
Hallo,
wie schon gesagt, Funktionen haben einige Einschränkungen.
Habe mal eine Zeile eingebaut die den ersten Unterschied im Direktfenster ersichtlich macht.
Zum zweiten kann die Funktion auch nicht seine Umgebung verändern, dazu gehört auch das kopieren.
Private Function Gefiltert(Bereich As Range, Zeile As Long) As Variant
Dim MyData As New DataObject, Spalte, s

'hier sollte schon mal der 1. unterschied ersichlich werden 
Debug.Print Worksheets("Test").Range("A1:A105").SpecialCells(xlCellTypeVisible).Address

Worksheets("Test").Range("A1:A105").SpecialCells(xlCellTypeVisible).Copy
MyData.GetFromClipboard
Spalte = MyData.GetText(1)
Spalte = Left(Spalte, Len(Spalte) - 2)
s = Split(Spalte, Chr(13) & Chr(10))
If Zeile <= (Ubound(s) + 1) Then Gefiltert = s(Zeile - 1)
End Function
' 
Sub Lade()
' Verweis auf MS Forms 2.0 Object Library setzen! 
Dim MyData As New DataObject, Spalte, s, n

'hier sollte schon mal der 1. unterschied ersichlich werden 
Debug.Print Worksheets("Test").Range("A1:A105").SpecialCells(xlCellTypeVisible).Address

Worksheets("Test").Range("A1:A105").SpecialCells(xlCellTypeVisible).Copy
MyData.GetFromClipboard
Spalte = MyData.GetText(1)
Spalte = Left(Spalte, Len(Spalte) - 2)
s = Split(Spalte, Chr(13) & Chr(10))
For n = 0 To Ubound(s)
   MsgBox s(n)
Next n
End Sub


Gruß Tino

AW: Funktionen haben Einschränkungen!
12.12.2008 09:02:49
Rocky
Hallo Leute,
entschuldigt meine Leihenhafte Frage, doch kann mein Nicht "Daten" von einer Function in ein SUB übergeben und wieder zurück. Wenn function also einschränkungen haben, warum nicht alles was eingeschrängt wird von ner Sub erledigen lassen.
Oder geht das nicht?
Gruß Rocky
AW: Funktionen haben Einschränkungen!
12.12.2008 09:26:43
Tino
Hallo,
wen Du die Funktion von einer Sub aus ausführst geht es wie Normal,
aber die Funktion aus einer Zelle aufgerufen (Formel), dann kommen eben diese Einschränkungen.
Dies liegt nicht an der Sub oder an der Funktion Ansicht, sondern wie diese aufgerufen wird.
Kannst ja mal mit einem Simplen Beispiel selbst Testen.
Soll die Hintergrundfarbefarbe in A1 ändern.
Sub Test()
 Farbe 3
End Sub

Function Farbe(intFarbe As Integer)
 Range("A1").Interior.ColorIndex = intFarbe
End Function


Gebe ich nun in eine Zelle =Farbe(3) ein, die Funktion wird aufgerufen aber die Farbe in A1 bleibt unverändert.
Rufe ich die Funktion aus der Sub Test auf, wird die Hintergrundfarbe geändert.
Gruß Tino

AW: Funktionen haben Einschränkungen!
12.12.2008 10:36:36
Rocky
Achso,
danke für die Lehrstunde.
Gruß Rocky
Die Gründe dafür meine ich...
12.12.2008 12:48:00
Luc:-?
...hier bereits erläutert zu haben, Rocky...
Gruß Luc :-?
AW: Die Gründe dafür meine ich...
12.12.2008 20:03:00
Rocky
das war mir auch nen bissel zu hoch. aber mit dem jetzigen hintergrundwissen ergibt es nen sinn.

Gruß Rocky


Wenn unter den Blinden der Einäugige König ist, dann findet man hier die Herren der Ringe!

Na siehste, wieder ein Fortschritt! Gruß owT
13.12.2008 02:53:05
Luc:-?
:-?
AW:Perfekt
11.12.2008 18:11:00
Rocky
Hallo Tino,
so ist es echt OK. Mehr wollte ich gar nicht. Wenn jemand etwas enderes bietet, schau ich mir das natürlich gern an.
Nen riesen dank von mir

Gruß Rocky


Wenn unter den Blinden der Einäugige König ist, dann findet man hier die Herren der Ringe!

bedingt OT: Frage am Rande
12.12.2008 16:56:00
Luc:-?
Hat Angela was mit dir zu tun, Rocky,
oder hat sie nur abgekupfert?
Merkwürdig... das Sortieren...?!
Gruß Luc :-?
Pardon, war im falschen Thread! owT
12.12.2008 17:01:00
Luc:-?
:-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige