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

Superverweis

Superverweis
03.02.2015 13:04:25
Siggi
Hallo liebe Community!
Ich hab ein großes Problem:
Wir müssen eine Projektarbeit zur Vorlesung VBA machen und stehen total an!
Aufgabenstellung:
Erstelle einen "Superverweis"
- dh. man sollte eine Funktion in VBA erstellen, die alle Varianten des Verweises (SVerweis, Verweis, Suche nach rechts, nach links ) ermöglicht!
Bitte um HILFE!!!
LG
Siggi und Schorsch

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

Betreff
Datum
Anwender
Anzeige
AW: Superverweis
03.02.2015 13:07:45
Klaus
Hallo Siggi und Schorsch,
ihr habt den WVERWEIS vergessen. Ich würde das einfach mit einer UDF lösen, in der zwei INDEX-Funktionen die entsprechenden Werte gegeben werden. Bei Excelformeln.de mal nach "SVERWEIS nach links" suchen, dann wird die Funktionalität von INDEX klar.
Oder sollen wir eure Hausaufgaben für euch erledigen?
Grüße,
Klaus M.vdT.

Hausaufgaben
03.02.2015 13:11:35
Jack_d

Oder sollen wir eure Hausaufgaben für euch erledigen?
Hätt ich besser nicht sagen können Klaus =)

AW: Superverweis
03.02.2015 13:22:08
Siggi
Grüß euch nochmal!
Mit Excel haben wir ja nicht so das Problem. Aber des ins VBA zu bringen ? da stehen wir total an

AW: Superverweis
03.02.2015 13:30:43
yummi
hallo Ihr beiden,
dann fangt doch mal an und baut mal eine Beispielmappe und überlegt euch was und wie ihr es umsetzen wollt. Wenn ihr dann an konktreten Stellen probleme habt, dann findet sich hier bestimmt eine Lösung.
Ihr könnt aber nicht erwarten, dass wir hier von 0 auf 100 eure komplette Arbeit erledigen.
Gruß
yummi

Projektarbeit
03.02.2015 13:09:09
Jack_d
Hallo Siggi und Schorsch,
eine Projektarbeit hat ja nen tiefern Sinn. Und zwar das ihr euch mit der Materia VBA auseinander setzt.
Daher halte ich es für nicht Zielführend die komplette lösung runter zu schreiben.
Daher belest euch zum Thema "benutzerdefinierte Funktionen" (UDF-user defined function)
desweiteren werden euch im klaren wie der Verweis (die Verweise funktionieren)
und dann werdet ihr merken, dass es ganz einfach ist eine Matrix zu durchsuchen und dann die Position Ausgabezelle zu verändern (zB Offset)
Viel Erfolg.

Anzeige
AW: Superverweis
03.02.2015 13:19:01
Siggi
Wir stehen beide total auf der leitung

in der Vorlesung gepennt?
03.02.2015 13:30:26
Rudi
Hallo,
zusätzlich zu den Anmerkungen der anderen:
Die Aufgabenstellung ist ganz schön schwammig.
Gruß
Rudi

AW: Hausaufgaben
03.02.2015 13:43:17
Daniel
Zum Thema Hausaufgaben wurde ja schon einiges gesagt.
Ihr solltest also ersmal anfangen und wenn ihr dann nicht weiter kommt, das was ihr schon habt vorstellen und dazu konkrete Fragen stellen.
Schließlich sollt IHR ja die Aufgabe lösen und nicht wir.
desweitern solltet ihr noch sagen, wie eurer Kenntnisstand in VBA ist, dh was ihr schon alles gelernt habt (bzw gelernt haben solltet) und was davon in euren Köpfen hängen geblieben ist.
da die Funktion flexibel sein soll und verschiedne Parameterarten erwartet, müsstet ihr wahrscheinlich die eingabeparameter auf Variant und Optional setzen, und dann mit VarType(Eingabeparameter) prüfen, was vorliegt.
kleines Beispiel:
Wenn der 3. Parameter (Ergebnisspalte) eine positive Zahl ist, kann der normale SVerweis verwendet werden
Wenn der 3. Parameter ein Range-Objekt ist, kann die Verweis-Funktion verwendet werden
usw.
Gruß Daniel

Anzeige
AW: Superverweis
03.02.2015 14:23:52
Jack_d
Also ich hab mir mal ne Lösung zusammengesponnen.
Bei der man über ne interen Prüfung selbst den Wverweis und Sverweis differenzieren kann.
Es ist also gut Möglich =)
Grüße

AW: Superverweis
03.02.2015 14:35:52
siggi
.... na toll... wir stehen total auf der Leitung :-(

AW: Superverweis
03.02.2015 14:42:22
Jack_d
Habt ihr schonmal die Tips verfolgt?
Was ist euer Kentnissstand?
Was müsstet ihr kennen?
Es ist ein leichtes diese Funktion aufzusetzen. Wenn ihr es dann aber erklären müsst, und ihr versagt, weil ihr sie nicht versteht dann ist niemandem geholfen. Bei uns im Studium wurde dies, wenn nachweisbar nicht selber erstellt, mit nicht bestanden gewertet.
Grüße

Anzeige
du Fuchs :-) owT.
03.02.2015 15:36:08
Klaus
.

da gibt's noch Potenzial ;-)
03.02.2015 15:41:21
Rudi
Hallo,
eine Inputbox innerhalb einer Function finde ich suboptimal.
Gruß
Rudi

AW: da gibt's noch Potenzial ;-)
03.02.2015 15:44:54
Jack_d
Moin Rudi , Moin Klaus
Ich hatte es tatsächlich erst ohne IBox. Hab dann aber überlegt, wie man diese "Fehleingabe" abfängt, oder was man damit macht.
Und es war tatsächlich die einzige Idee die mir kam.
Bessere Vorschläge?
BEste Grüße

AW: da gibt's noch Potenzial ;-)
03.02.2015 16:09:35
Rudi
Hallo,
wenn der Bereich mehr Spalten als Zeilen hat dann Zeilensuche sonst Spaltensuche
Bei quadratischem Bereich einen Standard, z.B. Zeilensuche definieren.
Außerdem gibt die Fkt. immer den letzten gefundenen Wert zurück, da du die Suche bei Treffer nicht abbrichst.
z.B.
    'Suchrichtung
ZeilenOffset = Bereich.Columns.Count >= Bereich.Rows.Count
SpaltenOffset = Not ZeilenOffset
'eigentliche Suche
For Each Zelle In Bereich.Cells
If Zelle.Value = Suchbegriff Then
SuperVerweis = Zelle.Offset(-ZeilenOffset * Wiedergabe, -SpaltenOffset * Wiedergabe)
Exit Function
End If
Next Zelle
Gruß
Rudi

Anzeige
Wozu überhaupt eigenen Code, Rudi?
03.02.2015 17:00:42
Klaus
Hallo Rudi,
die verschiedenen Verweise gibt es doch schon alle. Also wozu das Rad neu erfinden? Hier meine Lösung:
Function Superverweis(ArtVerweis As Long, Kriterium As String, oMatrix As Range, oIndex As Long, _
BereichVerweis As Long)
'1 = sverweis
'2 = verweis
'3 = Sverweis links (Matrix = nur eine Spalte)
'4 = wverweis
'5 = wverweis oben (Matrix = nur eine Zeile)
Select Case ArtVerweis
Case 1
Superverweis = WorksheetFunction.VLookup(Kriterium, oMatrix, oIndex, BereichVerweis)
Case 2
Superverweis = WorksheetFunction.Lookup(Kriterium, oMatrix)
Case 3
Superverweis = oMatrix.Find(Kriterium).Offset(0, oIndex)
Case 4
Superverweis = WorksheetFunction.HLookup(Kriterium, oMatrix, oIndex, BereichVerweis)
Case 5
Superverweis = oMatrix.Find(Kriterium).Offset(oIndex, 0)
Case Else
Superverweis = "NA"
End Select
End Function
Wenn die Kollegen das abgeben, gibt's entweder eine 1 weils funktioniert oder eine 6 weil die Aufgabe im eigentlichen Sinne nicht erfüllt wurde :-)
Grüße,
Klaus M.vdT.

Anzeige
AW: da gibt's noch Potenzial ;-)
04.02.2015 09:01:09
Jack_d
Moin Rudi,
Dein Cade hat tatsächlich seinen Charme =)
Zu den Anmerkungen.:
Zu dem quadratischen Bereich. Das fand ich letztlich "langweilig" was das ganze vereinfacht wär quasi die übergabe der Suchrichtung als Parameter in der Formel.
UND
Ich wollte den letzten Treffer :-D
Aber du hast, und das muss ich neidlos anerkennen, den Code wesentlich knapper und schöner geschrieben.
Bis dahin, die TE´s sind eh ausgestiegen
Beste Grüße
jack

Mir ist der Superverweis nicht super genug, ...
03.02.2015 16:53:37
Luc:-?
…Jack;
vgl mal folgende Fmln:
{=SVERWEIS($H$12;""&$I$4:$J$10;2;0)} ⇒ C
{=SuperVerweis($H$12;""&$I$4:$I$10;H13)} ⇒ #WERT!
Deine UDF kann keine Datenfelder verarbeiten, SVERWEIS aber schon…
Wenn man so etwas wirklich und universell machen wollte, käme ein richtiges und ziemlich umfangreiches Pgm dabei heraus. Nun kommt's natürlich ganz darauf an, was sich der Dozent vorgestellt hat. Viell ist er ja genügsam. In diesem Fall kann die Truppe froh sein, dass nicht ich der Aufgabensteller bin… ;-]
Allerdings hätte ich eine solche Aufgabe nicht gestellt, denn die fasst ja nur zusammen, was bereits existiert, ist also nichts wirklich Neues und man kann selektierend auf die WorksheetFunctions zurückgreifen. Also eher ein neuer eingeschränkter Container ala diesem mit speziellem UserInterface (die UDF-KopfZeile), von dem aus dann die Aufgaben an die StandardFktt verteilt wdn.
Ich kann mir vorstellen, dass du das so gelöst hast, Jack. Die StanddFktt bekommen dann auch nur das, was diese Oberfläche durchlässt. Viell überprüfe ich das nachher auch noch…
Gruß, Luc :-?

Anzeige
AW: Mir ist der Superverweis nicht super genug, ...
04.02.2015 09:09:52
Jack_d
Moin Luc
AAALso
Ich habs nicht ganz verstanden. (Mal wieder)
Was meinst du mit Datenfeldern? Ich vermute mal das du mit ""& den Range "verstecken willst vor der Formel. Und aus dem Range ein Datenfeld machen?
Allerdings. ich hab es probiert, und ich hab 2 mal das #Wert sowohl beim Sverweis als auch beim Superverweis. (Also einfach deine Formeln Reinkopiert)... Wieso?
UND, was wäre die Abhilfe?
Bis dahin beste Grüße

Nee, wenn du SVERWEIS, wie bei mir zu sehen, ...
04.02.2015 16:03:51
Luc:-?
…als MatrixFml eingibst (das ist bei Datenfeldern fast immer erforderlich), Jack,
kommt auch C raus, bei deiner UDF SuperVerweis aber nicht, was daran liegen mag, dass du Datenfelder ausschließt wie das bspw auch die xlFktt RANG, SUMMEWENN u.Ä. im Ggsatz zu uralten xlFktt wie SUMME, SUMMENPRODUKT, ANZAHL, INDEX und eben die VerweisFktt.
Mit ""&bereich wird mit diesem FktsArgument erst eine Berechnung ausgeführt (bei Zahlen hätte ich -- genommen), wodurch die Werte von bereich von ihrem Standort getrennt wdn, der ZellBezug wird also aufgehoben. Die Werte wdn der Fkt dann also nicht mehr As Range (also als ObjektReferenz), sondern als reine WerteFolge, die man gemeinhin Datenfeld nennt, übergeben. Dazu muss das Argument aber As Variant (oder ohne DatenTypFestlegung) deklariert sein, sonst wird es nicht akzeptiert und es wird sofort ein Fehler generiert (ohne die Fkt erst abzuarbeiten, dafür sorgt schon die XlSteuerung, die das abprüft).
Wenn du bspw ein Argument einer Fkt As String deklarierst, wird alles als Argument akzeptiert, was entweder ein Text ist oder ggf in einen solchen umgewandelt wdn kann (kein Fehlerwert!), auch Bezüge auf eine EinzelZelle mit einem solchen Wert. Wird aber ein Zell(Bereichs)Bezug verlangt, wird hier auch nur eine ObjektReferenz auf einen ZellBereich akzeptiert, egal, was der Bereich enthält.
Ein As Variant deklariertes Argument kann dagg alles enthalten, sowohl ZellBezüge als auch direkt angegebene Einzelwerte oder gar Datenfelder wie sie aus der (idR zuerst erfolgenden) Berechnung von Ausdrücken als Argument resultieren.
Manche XlFktt sind auf die Angabe von Bereichsbezügen und Datenfeldern ausgerichtet. Diese kommen dann idR ohne Kennzeichnung als MatrixFml aus, es sei denn, eine Fkt in einem als Ausdruck notierten Argument verlangt das, um auch alle Werte und nicht nur den 1. des resultierenden Datenfeldes zurückzugeben wie es zB bei WENN der Fall ist. Willst du so etwas in einer eigenen UDF verwenden, musst du das Argument stets mit IsArray(argument) prüfen, um dann darauf eine zyklische Verarbeitung all seiner Werte aufzusetzen. Das gilt besonders auch bei Functions, die in der bzw zur ArgumentÜbergabe ein ParamArray verwenden. Das ist grdsätzl Optional Variant und seine einzelnen Elemente können folglich alles enthalten, auch Datenfelder, nichts oder fehlen (fehlen alle ergibt UBound(…) -1, LBound(…) aber stets 0!).
Aber auch bei BereichsBezügen gibt's noch einige Besonderheiten, auf die ich hier mal kurz eingehen will:
Bei solchen Bezügen können zusätzlich 3 OperationsZeichen verwendet wdn, : für von…bis-Bezüge (man kann auch .. schreiben, was sofort durch : ersetzt wird), ; für Aufzählungen (eigentl stets das lokale ListenTrennZeichen, im US-Original ,) und LeerZeichen (blank⇔Zeichen32) für SchnittmengenOperationen (vbFkt Intersect).
Eine Aufzählung muss dabei stets geklammert wdn. Allerdings können nicht alle XlFktt damit etwas anfangen, denn es entsteht dadurch ein unzusammenhängender Bereich, eine sog MehrfachAuswahl. INDEX kann das weitgehend (nicht alles ist auch zusammenhängend darstellbar), dafür steht das optionale 4.Argument, mit dem ggf eine Auswahl getroffen wdn kann. Demggüber verträgt INDIREKT nur Einzel- und BreichsAdressen, keine anderen Operationen. INDEX ist wohl auch die einzige Fkt, die mit einer BereichsAngabe wie (C34:D35;C37:D38) D35:E37 klar kommt. INDEX scheint hier anders zu ticken als normalerweise in Xl üblich, weil man keine Chance hat, das mit einer UDF nachzugestalten, da Xl diesen Ausdruck vorberechnet und der UDF dann nur eine TeilReferenz übergibt (das Ergebnis der Operation wäre eigentlich (D35;D37), die UDF erhält aber nur D35). Man müsste in diesen Fällen mit einer UDF auf einen BezugsText zurückgreifen (bzw auf den Inhalt der FmlStandortZelle, also die Fml selbst in der Fml als Text behandeln und dieses Argument dann als Text isolieren).
Damit weißt du nun, was mich ggw im Rahmen der Pgmierung einer universellen UDF zur Behandlung beliebiger Datenfelder (zB aus vbFkt Split: numerisches Element → echte Zahl, Text bleibt Text, FehlerWert/Text → FWert oder ErsatzWert, Text Wahr/Falsch/True/False → Wahrheitswert, Leer → LeerString oder -0 usw) inkl Indirekt-Option umtreibt.
Gruß, Luc :-?
Besser informiert mit …

Anzeige
o.O
04.02.2015 16:25:09
Jack_d
Moin Luc,
vielen Dank für deine ausführliche Antwort. Auch wenn ich ehrlich gesagt gestehen muss dass, ich das auch nach dem 5 mal durchlesen nur ansatzweise verstehe.
Aber ich denke doch ein paar Kernpunkte verstanden zu haben, auch wenn mir womöglich die relevanten Hintergrundinformationen fehlen.
DAs mit der Matrixformel, hab ich schlicht auch "überlesen" bzw. hab es für eine besondere Darstellung hier im Forum gehalten. Da hier bei operanten im Text gern mal rumgemeckert wird.
Ich werd es mir noch sicherlich ein 2 -12 mal durchlesen =) und hoffe nach und nach mehr davon zu verstehen.
Jedoch gebe ich (in dem Fall zu bedenken, dass wenn die TE´s selbst rudimentäre kentnisse in VBA nicht beherrschen, eine derartig komplexe Fragestellung (wie sie dich derzeitig umtreibt) wohl aus dem Fokus fallen kann. Unabhängig der Tatsache das sie überaus lehrreich ist.
Bis dahin möchte ich dir nochmals für deine Ausführung Danken und wünsche eine tolle Restwoch
Beste Grüße JAck

Anzeige
Ein UDF-Bsp für den von mir genannten ...
04.02.2015 17:28:49
mir
…UDF-Deklarationsunterschied findest du 2 Threads tiefer in dem von DirkR, Jack;
was hier mit VERKETTENWENN möglich ist, kann die andere UDF wg ihrer ArgumentDeklaration nicht leisten.
Ich deklariere ein Argument nur dann As Range, wenn die UDF definitiv andere ZellEigenschaften als nur .Value ermitteln/verwenden soll. Soll bei (impliziter) Deklaration As Variant zwischen Bereichsbezügen und Datenfeldern unterschieden wdn, frage ich den evtl BereichsBezug mit TypeName(bezug) = "Range" ab. Anschließend wandle ich häufig den Bereichsbezug mit (doppeltem) WorksheetFunction.Transpose in ein Datenfeld um, um in der Folge beide Varianten gleich behandeln und mit den L-/UBounds arbeiten zu können. Manchmal ist das auch unpraktisch, zB bei Umwandlung in Datenfelder, die aus einem Vektor, dessen Elemente ebenfalls Vektoren sind, bestehen. Hier mache ich das im BereichsFall gleich, bei bereits übergebenen Datenfeldern dann mit WorksheetFunction.Index. Das hat aber Grenzen in der maximalen 2Dimensionalität, n-dimensionale Tensoren lassen sich nicht mit INDEX behandeln. Da muss man dann einen anderen Weg wählen.
Das alles gehört natürlich nicht mehr unbedingt zum Ausgangsproblem, enthält aber nützliche Hinweise, die du bei tieferem Eindringen in die Problematik auch erkennen wirst.
Luc :-?

Morrn
05.02.2015 09:49:03
Jack_d
luc,
vielen Dank nochmals. So nach und nach ergibt das ein Bild. Aber wie du auch schon Dirk gesagt hast, so scheint es auch, dass ich mich mit den besonderheiten von UDF#s bzw. den notwendigen Deklarationen nur ungenügend auskenne.
Du sprachst von einem Beispiel / einer Beispiels UDF. Besteht die Möglichkeit mal eine solche einzusehen? Am liebsten eine kommentierte, damit auch für mich ersichtlich ist, warum wieso weshalb.
(Die eigentliche Funktion der UDF spielt amS eine eher untergeordnete Rolle, da es mir um die didaktik geht)
Beste Grüße
JAck

Mit Bsp-UDF meinte ich die beiden UDFs in ...
05.02.2015 15:04:13
Luc:-?
…von Dirk hochgeladenen Mappe, Jack;
sieh dir da mal den ArgumentDeklarationsUnterschied an! Der spricht, nebst der daraus folgenden Einsetzbarkeit doch für sich.
Meine eigenen UDFs im Archiv sind idR sparsam und überwiegend kopf-kommentiert.
Gruß, Luc :-?

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige