
Estoy intentando crear una macro simple que se supone recorra un rango determinado de celdas y devuelva una celda al lado de una celda que coincida con algún contenido.
En algunos foros encontré una línea que se supone que funciona para objetos de celda:
someCell.Offset(0,colIndex)
Pero desde la depuración puedo ver que los datos de entrada de la selección son un conjunto de Variante/Cadena y no un objeto de "celda".
¿Existe alguna manera de que mi función obtenga un rango de celdas en lugar de variantes/cadenas?
También mi código completo:
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
ACTUALIZADO: Se supone que el código busca una celda de criteriosCellRange que sea una coincidencia exacta o parcial de un texto en el destino de la celda y devuelve la celda con un desplazamiento horizontal de colIndex desde la celda coincidente de criteriosCellRange. Básicamente, una BUSCARV que también coincide con texto parcial.
Entonces...AQUÍTenemos el mismo problema y la respuesta confirma mis sospechas:
Al pasar un rango de celdas como parámetro de una función, creo que la función recibe cadenas o valores. El cero es sólo el valor de la celda en blanco. Sin ver su código, es difícil sugerir una solución a su problema.
Por cierto, estoy usando Libreoffice 5.4.4.2.
Respuesta1
Sólo un par de ajustes:
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
Invierto los InStr()
argumentos e hice resultCell
unaRango
Respuesta2
Desde eldocumentación orientada a objetos:
Los argumentos se pasan como valores.
Los argumentos pasados a una macro desde Calc son siempre valores. No es posible saber qué células se utilizan, si es que se utiliza alguna. Por ejemplo, =SumaPositiva(A3) pasa el valor de la celda A3 y SumaPositiva no tiene forma de saber que se usó la celda A3. Si necesita saber a qué celdas se hace referencia en lugar de los valores en las celdas, pase el rango como una cadena, analice la cadena y obtenga los valores en las celdas a las que se hace referencia.
Entonces lo que quiero lograr no es posible. :(