
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 undresultCell
Reichweite
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. :(