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

1

Estou tentando fazer uma macro simples que deve passar por um determinado intervalo de células e retornar uma célula ao lado de uma célula correspondente a algum conteúdo.

De alguns fóruns, encontrei uma linha que deveria funcionar para objetos de célula:

someCell.Offset(0,colIndex)

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

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

Além disso, 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 criteriaCellRange que seja uma correspondência exata ou parcial de um texto no destino da célula e retornar a célula com um deslocamento horizontal de colIndex da célula correspondente de criteriaCellRange. Então, basicamente, um VLOOKUP que também corresponde ao texto parcial.

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

When passing a cell range as a parameter of a function, I believe the function receives either strings or values. The zero is just the value of the blank cell. Without seeing your code, it is hard to suggest a solution to your problem.

BTW Estou usando o Libreoffice 5.4.4.2.

    
por danizmax 02.01.2018 / 21:28

2 respostas

-1

Na documentação da OO :

Os argumentos são passados como valores

Arguments passed to a macro from Calc are always values. It is not possible to know what cells, if any, are used. For example, =PositiveSum(A3) passes the value of cell A3, and PositiveSum has no way of knowing that cell A3 was used. If you must know which cells are referenced rather than the values in the cells, pass the range as a string, parse the string, and obtain the values in the referenced cells.

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

    
por 03.01.2018 / 19:03
1

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

Eu inverto os argumentos InStr() e fiz resultCell a Intervalo

    
por 02.01.2018 / 23:11