
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 resultCell
umaFaixa
Responder2
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. :(