Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
720to724
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
720to724
720to724
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

eigene funktion

eigene funktion
19.01.2006 10:09:00
ransi
HAllo
Ich möchte mir eine Funktion schreiben die mir in einer matrix gefundene werte verkettet.
Die versuchs tabelle sieht so aus.
Tabelle1
 ABC
1a1#WERT!
2h9 
3w8 
4v5 
5a3 
6b6 
7d7 
8g9 
9p4 
10n7 
11f8 
12j8 
13u10 
14q6 
15v1 
16m6 
17o3 
18e7 
19d9 
20g3 
21r4 
22z7 
23m6 
24f2 
25y1 
26a6 
27z10 
28z9 
29b8 
30p3 
Formeln der Tabelle
C1 : =sverweis2("a";A1:A30;1;",")
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
Der code zu der funktion sverweis2() ist dieser hier:


Public Function sverweis2(kriterium, bereich As Range, versatz As IntegerOptional trenner As StringAs String
Dim wert As String
Dim c
Dim firstaddress As String
wert = ""
With bereich
    Set c = .Find(what:=kriterium, LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByColumns, searchdirection:=xlNext)
    If Not c Is Nothing Then
        firstaddress = c.Address
        Do
            wert = wert & c.Offset(0, versatz) & trenner
            Set c = .FindNext(c)
            'hier wird die function einfach verlassen, wenn ich mit F8 durchgehe.
        Loop While Not c Is Nothing And c.Address <> firstaddress
    End If
End With
sverweis2 = wert
End Function


nur leider mag er nicht so wie ich es gerne hätte.
In der auskommentierten zeile wird die funtion einfach verlassen.
Das ganze vergleichsweise als sub() angelegt funktioniert.


Public Sub test()
Dim c As Range
Dim firstaddress As String
Dim trenner As String
Dim wert As String
Dim bereich As Range
Set bereich = Range("a1:a30")
trenner = ":"
wert = ""
With bereich
    Set c = .Find(what:="a", LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByColumns, searchdirection:=xlNext)
    If Not c Is Nothing Then
        firstaddress = c.Address
        Do
            wert = wert & c.Offset(0, 1) & trenner
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstaddress
    End If
End With
MsgBox wert
End Sub


Ich könnte den bereich auch mit:
For each zelle in bereich
if zelle=kriterium then...
next
abklappern, fürchte aber das das dann bei größeren bereichen zu langsam wird.
Kann mir da mal jemand hilfreich zur seite stehen und sagen was da in der funktion klemmt?
ransi

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: eigene funktion
19.01.2006 10:38:46
Reinhard
Hi ransi,
bei mir wird zu 95% nichts gefunden. Selten steht mal #Wert, ansonsten immer nichts in C1, da in
If Not c Is Nothing Then
c den Wert "nothing" hat.
Andrer Ansatz für die Funktion. Verweis benutzen um den ersten Eintrag zu finden, dann den Bereichsanfang
auf die Zelle unter der gefundenen Zelle setzen, dies in einer
Schleife bis nichts mehr gefunden wird bzw Bereichsanfang größer als Bereichsende, müßte auch bei großen datenmengen schnell sein.
Tabellenblattname: Tabelle1 A B C 1 a 1 2 g 2 3 v 3 4 f 4 5 r 5 6 a 6 7 d 7 8 a 8 9 v 9 10 b 10 Benutzte Formeln: C1: =sverweis2("a";A1:A10;1;",")</PRE> Gruß Reinhard
Anzeige
AW: eigene funktion
19.01.2006 11:52:57
u_
Hallo,
die schnellste aller Möglichkeiten: Den Suchbereich in ein Array einlesen.
Function SVERWEIS2(strKriterium As String, rngBereich As Range, iSuch As Integer, iErg As Integer, Optional strTrenner As String) As String 'strKriterium=Suchkriterium 'rngBereich=Bereich in dem gesucht wird 'iSuch=Spalte in rngBereich, in der strKriterium gesucht wird 'iErg=Spalte in rngBereich, aus der das Ergebnis geliefert wird 'strTrenner= optionales Trennzeichen 'sverweis2("x";G1:H100;2;1;"-") liefert alle Werte aus G, die in H ein x haben 'Somit auch svereis nach links möglich Dim arrTmp, i As Long arrTmp = rngBereich For i = 1 To UBound(arrTmp) If arrTmp(i, iSuch) = strKriterium Then SVERWEIS2 = SVERWEIS2 & arrTmp(i, iErg) & strTrenner Next SVERWEIS2 = Left(SVERWEIS2, Len(SVERWEIS2) - 1) End Function
Gruß
Geist ist geil!
Anzeige
starkes teil !!
ransi
Hallo Udo
Alle Achtung.
Das Teil ist schnell wie die Feuerwehr. .
Auch über mehrere komplette Spalten.
Außerdem eröffnet das ungeahnte Möglichkeiten.
Ich denke da an split() und join()
Habe das ganze ein wenig ergänzt.(was den Trenner angeht).


Option Explicit
Function SVERWEIS2(strKriterium As String, rngBereich As Range, iSuch As Integer, iErg As IntegerOptional strTrenner As StringAs String
'Original von UDO
    Dim arrTmp
    Dim L As Long
arrTmp = rngBereich
If strTrenner = "" Then strTrenner = ","
For L = 1 To UBound(arrTmp)
    If arrTmp(L, iSuch) = strKriterium Then SVERWEIS2 = SVERWEIS2 & arrTmp(L, iErg) & strTrenner
Next
SVERWEIS2 = Left(SVERWEIS2, Len(SVERWEIS2) - 1)
End Function


Auch dir rainhard vielen dank für deinen vorschlag, aber ich denke Udo's version ist nicht mehr zu toppen was die Performance angeht.
@ Udo und andere interessierte:
Nur der interessehalber.
Was haut da in meinem Ansatz mit .find() nicht hin?
ransi
Anzeige
AW: starkes teil !!
19.01.2006 12:57:34
u_
Hallo,
speziell bei größeren Bereichen lohnt es sich, diese in ein Array einzulesen. Auch Replace in einem Array und anschließendes Zurückschreiben in die Tabelle geht um ein vielfaches schneller als wenn man das direkt in Zellen macht.
Warum dein Ansatz nicht klappt, kann ich nicht nachvollziehen. Weiß der Teufel.
Gruß
Geist ist geil!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige