Como obter um intervalo de células como argumento de função

Como obter um intervalo de células como argumento de função

Estou tentando criar uma macro simples que deve percorrer um determinado intervalo de células e retornar uma célula próxima a uma célula que corresponda a algum conteúdo.

Em alguns fóruns encontrei uma linha que supostamente funciona para objetos de célula:

someCell.Offset(0,colIndex)

Mas pela depuração posso ver que os dados de entrada da seleção são um conjunto de Variant/String e não um objeto de "célula".

Existe uma maneira de minha função obter um intervalo de células em vez de Variant/Strings?

Também meu 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

ATUALIZADO: O código deve encontrar uma célula de critériosCellRange que seja uma correspondência exata ou parcial de um texto na célula de destino e retornar a célula com um deslocamento horizontal de colIndex da célula correspondente de critériosCellRange. Então, basicamente, um VLOOKUP que também corresponde a texto parcial.

Então...AQUItemos o mesmo problema, e a resposta confirma minhas suspeitas:

Ao passar um intervalo de células como parâmetro de uma função, acredito que a função recebe strings ou valores. O zero é apenas o valor da célula em branco. Sem ver o seu código, é difícil sugerir uma solução para o seu problema.

Aliás, estou usando o Libreoffice 5.4.4.2.

Responder1

Apenas alguns 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

Inverti os InStr()argumentos e fiz resultCellumaFaixa

Responder2

DeDocumentação OO:

Argumentos são passados ​​como valores

Os argumentos passados ​​para uma macro do Calc são sempre valores. Não é possível saber quais células são utilizadas, se houver. Por exemplo, =PositiveSum(A3) passa o valor da célula A3 e PositiveSum não tem como saber que a célula A3 foi usada. Se você precisar saber quais células são referenciadas em vez dos valores nas células, passe o intervalo como uma sequência, analise a sequência e obtenha os valores nas células referenciadas.

Então, o que eu quero alcançar não é possível. :(

informação relacionada