So erhalten Sie einen Zellbereich als Funktionsargument

So erhalten Sie einen Zellbereich als Funktionsargument

Ich versuche, ein einfaches Makro zu erstellen, das einen bestimmten Zellbereich durchläuft und eine Zelle neben einer Zelle zurückgibt, die einem bestimmten Inhalt entspricht.

In einigen Foren habe ich eine Zeile gefunden, die für Zellobjekte funktionieren soll:

someCell.Offset(0,colIndex)

Beim Debuggen kann ich jedoch erkennen, dass es sich bei den Eingabedaten aus der Auswahl um einen Satz von Varianten/Zeichenfolgen und nicht um ein „Zellen“-Objekt handelt.

Gibt es eine Möglichkeit, mit meiner Funktion einen Zellbereich statt Varianten/Zeichenfolgen zu erhalten?

Auch mein vollständiger Code:

Function RVLOOKUP(target, criteriaCellRange, colIndex)

    Dim found as Boolean
    Dim resultCell as Variant

    For Each cell In criteriaCellRange
        matchPosition = instr(target,cell)
        If matchPosition > 0 Then
            found = True
            resultCell = cell
            Exit For
        end if
    Next cell

    If found Then
        ' Here resultCell seems to be just a String not an actual cell object
        RVLOOKUP = resultCell.Offset(0,colIndex)
    else
        RVLOOKUP = "#NoMatch"
    end if

End Function

AKTUALISIERT: Der Code soll eine Zelle aus CriteriaCellRange finden, die eine exakte oder teilweise Übereinstimmung mit einem Text in der Zielzelle ist, und die Zelle mit einem horizontalen Versatz von colIndex von der übereinstimmenden Zelle aus CriteriaCellRange zurückgeben. Also im Grunde ein SVERWEIS, der auch mit teilweisem Text übereinstimmt.

Also...HIERwir haben das gleiche Problem und die Antwort dort bestätigt meinen Verdacht:

Wenn ich einen Zellbereich als Parameter einer Funktion übergebe, nehme ich an, dass die Funktion entweder Zeichenfolgen oder Werte empfängt. Die Null ist nur der Wert der leeren Zelle. Ohne Ihren Code zu sehen, ist es schwierig, eine Lösung für Ihr Problem vorzuschlagen.

Übrigens verwende ich Libreoffice 5.4.4.2.

Antwort1

Nur ein paar Verbesserungen:

Function RVLOOKUP(target, criteriaCellRange, colIndex)

    Dim found As Boolean
    Dim resultCell As Range

    For Each cell In criteriaCellRange
        matchPosition = InStr(cell, target)
        If matchPosition > 0 Then
            found = True
            Set resultCell = cell
            Exit For
        End If
    Next cell

    If found Then
        ' Here resultCell seems to be just a String not an actual cell object
        RVLOOKUP = resultCell.Offset(0, colIndex)
    Else
        RVLOOKUP = "#NoMatch"
    End If

End Function

Ich habe die InStr()Argumente umgekehrt undresultCellReichweite

Antwort2

Von demOO-Dokumentation:

Argumente werden als Werte übergeben

Argumente, die von Calc an ein Makro übergeben werden, sind immer Werte. Es ist nicht möglich, zu wissen, welche Zellen (sofern überhaupt welche) verwendet werden. Beispielsweise übergibt =PositiveSum(A3) den Wert der Zelle A3, und PositiveSum kann nicht wissen, dass Zelle A3 verwendet wurde. Wenn Sie wissen müssen, auf welche Zellen verwiesen wird, und nicht die Werte in den Zellen, übergeben Sie den Bereich als Zeichenfolge, analysieren Sie die Zeichenfolge und ermitteln Sie die Werte in den referenzierten Zellen.

Also ist das, was ich erreichen möchte, nicht möglich. :(

verwandte Informationen