Como usar um cursor para inserir formulas em um intervalo indefinido?

Tenho um arquivo no qual necessito inserir uma fórmula em uma coluna inteira, de modo que que a mesma seja preenchida somente até onde o vão os dados.

Creio que a linha de código que desejo alterar é a do comando de repetição For…Next, porém, estou tendo dificuldades em aplicar um cursor, p. ex., para fazer isso. Eu acho que é com cursor, mas não consegui desenvolver a ideia até o final.

Segue macro:

Sub InsereFormula
Dim oDoc as Object, oSheet as Object, targetCell as Object
Dim nRow as Long, oCursor as Object
oDoc = ThisComponent
oSheet = oDoc.getCurrentController.getActiveSheet()
For nRow = 2 To 500
targetCell = oSheet.getCellByPosition(2, nRow-1)
targetCell.setFormula("=CONCAT(A"+nRow+";"+CHR$(34)+ _
" “+CHR$(34)+”;B"+nRow+")")
Next nRow
End Sub

Segue arquivo exemplo:
ArquivoExemplo.ods (25,5,KB)

@FelipeAle , veja se te atende:
exemplo-macro-formula.ods (29.3 KB)

Sub InsereFormula
Dim oDoc as Object, oSheet as Object, targetCell as Object
Dim nRow as Long, oCursor as Object

oDoc = ThisComponent
oSheet = oDoc.getCurrentController.getActiveSheet()

nRow = 2
For nRow = 2 To UltimaLinha
targetCell = oSheet.getCellByPosition(2, nRow-1)
targetCell.setFormula("=CONCAT(A"+nRow+";"+CHR$(34)+ _
" “+CHR$(34)+”;B"+nRow+")")
Next nRow
end Sub

Function UltimaLinha
oDoc = ThisComponent
oSheet = oDoc.getCurrentController.getActiveSheet()

fServico = CreateUnoService(“com.sun.star.sheet.FunctionAccess”)
nLinha = fServico.CallFunction(“COUNTA” , array(oSheet.getCellRangeByName(“A:A”)))
UltimaLinha = nLinha
End Function

1 Like

Muito obrigado @WBastos !

Eu estava tentando aplicar o cursor com base no livro do Mauricio Baeza, só que não tava casando.

Não cheguei a fazer os exercícios do livro dele, mas estou começando a achar que deveria começar logo :smiley:

É um caminho um tanto árduo o aprendizado da linguagem OOoBasic, mas devagar estamos indo.

Só uma sugestão, não seria melhor inserir os valores nas células ao invés das fórmulas?
Segue um exemplo:
exemplo-macro-formula.ods (22.8 KB)

1 Like

Sim, mas para vc ter uma ideia eu levei umas 3h para montar por mim mesmo essa macro que tu viu. Hahahaha

E lê, pesquisa, testa… Fiquei dando murro em ponta de faca de teimosia em querer montar o negocio sem copiar de ninguem. E evitando usar o dispatcher pra entender o raciocínio. Hahahaha

O caminho é arduo mesmo. Ai acerta um negocio, empaca em outro. Rs

Enfim, muito obrigado irmão!

Dica: Para ter a ultima linha, podes usar uma das bibliotecas internas no LibreOffice. Veja GetLastUsedRow() nesta página:

https://help.libreoffice.org/7.3/pt-BR/text/sbasic/shared/03/lib_tools.html?&DbPAR=BASIC&System=UNIX#misc_module

1 Like

Ola @ohallot, existe em algum lugar, ou você pode fornecer uma macro usando esta função.
Conheço estas Bibliotecas, não não encontrei exemplos de uso.
É provável que para Programador, seja simples, mas para leigo, não. Grato.

No topo da página da ajuda tem a dica:

GlobalScope.BasicLibraries.LoadLibrary("Tools")

dai vc tem

Sub Main
GlobalScope.BasicLibraries.LoadLibrary("Tools")
oSheet = ThisComponent.Sheets(0)
Print GetLastUsedRow(oSheet)
End Sub
2 Likes

@ohallot , especialmente no caso da função > GetLastUsedRow < percebo que ela considera qualquer alteração de propriedade dentro da planilha como sendo uma linha utilizada, como, por exemplo, uma formatação condicional ou até mesmo uma simples formatação com bordas.

Existe uma forma de restringir o reconhecimento de tais alterações pela função acima?

Por esse motivo que prefiro encontrar a última linha utilizando a função COUNTA nos meus códigos.

O código Basic dessa função é curto e pode ser lido pelo editor do Basic na biblioteca indicada acima.

Para entender como é uma planilha: Uma célula é um objeto criado e alocado numa lista encadeada ou coleção de células no instante que esta célula ganha um dado ou um formato. Se vc formatou a célula $Z$100000, ela é parte da planilha, mesmo estando sem dados.

2 Likes