Vlookup

  • Excel

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Hallo Zusammen, ich habe folgenden Code bisher.

    VB.NET-Quellcode

    1. Public Function Test( _
    2. dbl_F1 As Double, _
    3. dbl_F2 As Double, _
    4. dbl_F3 As Double, _
    5. dbl_F4 As Double, _
    6. dbl_F5 As Double, _
    7. dbl_F6 As Double, _
    8. dbl_F7 As Double) As Double
    9. ' Bilde 1 Value
    10. Dim NRFV_F1 As Double
    11. Dim NRFV_F2 As Double
    12. Dim NRFV_F3 As Double
    13. Dim NRFV_F4 As Double
    14. Dim NRFV_F5 As Double
    15. Dim NRFV_F6 As Double
    16. Dim NRFV_F7 As Double
    17. NRFV_F1 = (dbl_F1 - (-38.03)) / (81.26 - (-38.03))
    18. NRFV_F2 = (dbl_F2 - 0) / (49.02 - 0)
    19. NRFV_F3 = (dbl_F3 - 1.45) / (831.59 - 1.45)
    20. NRFV_F4 = (dbl_F4 - 0.02) / (181.84 - 0.02)
    21. NRFV_F5 =
    22. NRFV_F6 = (dbl_F6 - 23320) / (28762 - 23320)
    23. NRFV_F7 = (dbl_F7 - 90) / (2202423 - 90)
    24. 'summe und weiter rechnen mit ergebnis
    25. End Function



    Mein Problem ist, dass bei NRFV_F5 kein Wert direkt auslesbar ist, da der Wert F5 ein Wort/Buchstabe ist. Dieser Buchstabe/dieses Wort muss aus einer Tabelle ausgelesen werden, wo ein Wert zugeordnet ist. Daher brauche ich hier ein VLookup.
    Wie kann ich das machen, dass ich dann damit auch weiterrechnen kann? Die Tabelle liegt auf einem Datensheet extra Datensheet, oder soll man dies auch mit in das VBA bauen?

    Vielen Dank schon mal vorab!

    :)
    Was soll passieren, wenn der Wert nicht gefunden werden kann?
    Darf der Wert dann 0 sein?

    Ich würde in dem extra Datensheet eine Lookup-Funktion einbauen:

    Visual Basic-Quellcode

    1. Function FindWhateverYouNeed(ByVal Key as String) As Double
    2. On Error Goto Done
    3. FindWhateverYouNeed = Range("A:A").Find(Key).Offset(0,1).Value 'sinngemäss
    4. Done:
    5. End Function

    Aufruf über

    Visual Basic-Quellcode

    1. dbl_F5 = ExtraDatenSheet.FindWhateverYouNeed("DeinLookupKey")


    Aber bitte sinnvollere Namen vergeben ;)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hey. Der Wert dbl_F5 wird auf jeden fall bestückt. also kann der Wert nicht nicht gefunden werden.
    Das Problem ist zudem ,dass der Wert nicht immer in der gleichen Zelle, z.B. A:A steht. Daher hätte ic hda gerne eben dbl_F5 stehen. er führt allerdings nichts aus...
    und es kommt eine Fehlermeldung.

    VB.NET-Quellcode

    1. Public Function Test( _
    2. dbl_F1 As Double, _
    3. dbl_F2 As Double, _
    4. dbl_F3 As Double, _
    5. dbl_F4 As Double, _
    6. dbl_F5 As Double, _
    7. dbl_F6 As Double, _
    8. dbl_F7 As Double) as double ' Faktoren definiert
    9. ' Bilde NRF Value
    10. Dim NRFV_F1 As Double
    11. Dim NRFV_F2 As Double
    12. Dim NRFV_F3 As Double
    13. Dim NRFV_F4 As Double
    14. Dim NRFV_F5 As Double
    15. Dim NRFV_F6 As Double
    16. Dim NRFV_F7 As Double
    17. NRFV_F1 = (dbl_F1 + 38.03) / (81.26 + 38.03)
    18. NRFV_F2 = (dbl_F2 - 0) / (49.02 - 0)
    19. NRFV_F3 = (dbl_F3 - 1.45) / (831.59 - 1.45)
    20. NRFV_F4 = (dbl_F4 - 0.02) / (181.84 - 0.02)
    21. NRFV_F5 = Application.WorksheetFunction.VLookup(dbl_F5, Sheets("Rechenkern").["D37:J55"], 5, False)
    22. NRFV_F6 = (dbl_F6 - 23320) / (28762 - 23320)
    23. NRFV_F7 = (dbl_F7 - 90) / (2202423 - 90)
    24. Test = NRFV_F1 + NRFV_F2 + NRFV_F3 + NRFV_F4 + NRFV_F5 + NRFV_F6 + NRFV_F7
    25. End Function




    Ohne das F5 funktioniert es. also rechnet er wenigstens. Aber mit F5 nicht, weshalb ja ein Fehler in NRFV_F5 ist... aber ich leider nicht weiß warum...
    Wenn F5 ein String ist, kannst du ihn nicht einer Double-Variable zuweisen.
    Vielleicht habe ich auch deine Erklärungen nicht verstanden, in dem Fall versuch dein Programm mal auf das eigentliche Problem herunterzubrechen und näher zu erläutern, welcher Wert in welche Variable soll.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    ahh ich hab verstanden was du sagen willst. ich muss also dbl_F5 als string deklarieren weils ja nen Buchstabe ist... richtig?
    kann ich denn dann innerhalb der funktion zb. F1 als double, f5 als string, aber die ganze funktion als double deklarieren?

    habs mal probiert und wollte mir nur das ergebnis für f5 ausgeben lassen. funktioniert aber leider nicht:

    VB.NET-Quellcode

    1. Public Function Test(F5 As String) As Double
    2. Test = Application.WorksheetFunction.VLookup(F5, Sheets("Rechenkern").["D37:J55"], 5, False)
    3. End Function



    Hab dann einfach mal beim Aufurf der Funktion F5 = A gemacht, und in meiner Beispieltabelle steht A für 0,5. Allerdings kommt #Wert!
    mit variant geht auch nicht..

    weißt du warum?

    Vielen Dank nochmal!


    Vllt als Beispiel mal iwas:
    A
    .
    ...
    ...
    0,5
    B
    ..
    ..
    .
    0,75
    C
    ..
    ..
    ..
    1

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sabrina12345“ ()

    hey. danke! habs geändert aber funktioniert leider trotzdem nicht... hab nochmal geschaut, das Datensheet ist auch richtig geschrieben, die Tabelle ist auch genau in den Feldern.. und hab jetzt F5 als variant und die ganze funktion als double..

    hast du noch iene idee? Danke schonmal für deine HIlfe!

    Sabrina12345 schrieb:

    Public Function Test(F5 As String) As Double
    Das ist doch schon mal eine Aussage.
    Ich habe mir angewöhnt, Parameter grundsätzlich ByVal zu definieren, wenn sie nicht explizit modifiziert werden sollen (und das ist extrem selten der Fall).
    Aus gutem Grund.
    Irgendwann mit VB.Net hat Microsoft eingesehen, dass ByRef als Default idiotisch ist.
    Aber bei VBA ist es halt Standard.
    Deshalb:

    Visual Basic-Quellcode

    1. Public Function Test(ByVal F5 As String) As Double
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Aber eventuell kannst du mir schnell beim nächsten Schritt weiterhelfen.
    Wie baue ich in VBA eine Wenn funktion ein, die aber vorher eine Wennfehler ist. also normal in excel ca so:

    =WENNFEHLER((WENN(F5<0;0;WENN(F5>1;1;F5))

    hier ist F5 nicht die zelle, sondern mein wert aus der ersten Rechnung.
    wenn fehler ist ja schonmal iferror, aber weiter geht es ja mit IF...... else.... man kann es also nicht so schrieben wie es da steht und einfach in VBA umwandeln.

    Wie mach ich das?

    Danke :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sabrina12345“ ()

    Hallo,

    da fehlt noch der Wert, der im Fehlerfall angezeigt werden soll sowie eine Klammer. Z.B.

    Visual Basic-Quellcode

    1. =IFERROR((IF(F5<0,0,IF(F5>1,1,F5))),"Fehler")


    Einfach die gewünschte Formel in Excel eingeben und dann im VBA-Editor das Debugfenster sichtbar schalten und darin dann

    Visual Basic-Quellcode

    1. debug.print activesheet.cells(Reihe, Spalte).formula
    eingeben und ENTER drücken.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Hallo,

    wenn F5 eine Variable ist, dann müsste die Formel bei jeder Änderung von F5 neu gesetzt werden. Dann kann man es auch gleich per Makro direkt ins Tabellenblatt schreiben. Abhilfe schafft da z.B. eine eigene Funktion, welche dann den Wert von F5 bei jeder Aktualisierung berücksichtigt.
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    VB.NET-Quellcode

    1. Public Function Test(F5 As String) As Double
    2. Test = Application.WorksheetFunction.VLookup(F5, Sheets("Rechenkern").["D37:J55"], 5, False)
    3. End Function


    ich hatte ja am Anfang das Problem hier. Und hier war F5 ja der Wert der Funktion mit dem ich die FUnktion später füttern möchte. Davon hab ich insgesamt 7 werte.

    Jetzt muss ich mit den ergebnissen daraus weiter rechnen. sorry, ich muss mit den ergebnissen weiterrechnen, also vllt erg_F5, nicht F5.
    Daher ist der Wert in der ifError Formel keine Zelle, sondern das ergebnis von vorher.

    Danke euch! :)
    Ich hab mir grad was anderes überlegt. Ich könnte allgemeine Formeln aufstellen und sie später erst füttern.
    Ich könnte so beginnen:

    VB.NET-Quellcode

    1. Public Function Trafo(x As Double, a As Double, b As Double)
    2. Trafo = ((x - a) / (b - a))
    3. End Function



    Als nächstes würde ich die Errorfunction allgemein aufschrieben indem ich sie so aufstelle:
    Public Function ErrorF( ??????, AvgVal as double, epsilon as double)

    das was ich nicht weiß ist, wie ich an stelle der ????? die Funktion abgebe.

    Wenn ich schriebe ErrofF(Trafo as Double,...) dann denkt das VBA ja sicherlich, es ist eine _
    allgemeine Variable aber ich kann auch nicht schrieben Trafo as Function, das ist ei nFehler.

    Wie übergebe ich also in diese 2 Funktion, die erste Funktion?

    Ich denke, alles allgemein zu Formulieren und am ende die Funktion jeweils zu füttern, ist _
    einfacher und nicht so komplex. Und diese Frage ist sicher leichter zu beantworten als das verwirrende von vorher.

    Vielen Dank :) Schönen Feierabend schonmal!
    Warum machst du das Error-Handling nicht in der Funktion selbst?

    Visual Basic-Quellcode

    1. Public Function Trafo(ByVal x As Double, ByVal a As Double, ByVal b As Double) As Double
    2. On Error Goto Done
    3. Trafo = ((x - a) / (b - a))
    4. Done:
    5. If Err.Number <> 0 Then Trafo = 0 'oder was immer auch der Wert im Fehlerfall sein soll
    6. End Function
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --