Cómo obtener un rango de celdas como argumento de función

Cómo obtener un rango de celdas como argumento de función

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 resultCellunaRango

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

información relacionada