Busca parametrizada para copiar informações usando Macro

Nesse, definitivamente preciso de ajuda. Eu trabalho com registro imobiliário.

Todo mês subsequente a transação de um imóvel, eu tenho que efetuar comunicação ao Município para fins de alteração de propriedade no IPTU.

Tenho duas bases de dados geradas em arquivo CSV, uma com informações das pessoasque participaram da transação, e uma com os imóves.

Eu tenho tentado desenvolver uma macro para automatizar todo o processo de formatação e transformação em um relatório único, no calc, para efetuar a comunicação.

Inclusive, pedi ajuda aqui algumas vezes exatamente para me auxiliar no desenvolvimento disso.

Consegui criar algo funcional para a base de dados referente ao imóvel, mas preciso criar algo para a base de dados referente as pessoas, e estou tendo dificuldades pois é uma arquivo muito “bagunçado”.

O que preciso exatamente?

  1. Na base de dados de pessoas, necessito criar um mecanismo que busque exatamente o endereço da pessoa, com base no seu nome, por exemplo, e extraia essa informação para uma outra tabela ou planilha; ou
    1.1 Criar um mecanismo que busque o endereço e extraia essa informação para um outro local.
  2. No arquivo exemplo, existem marcadores para facilitar esta leitura, que são: a palavra ‘Residência’ e o caractere :(dois pontos).

Tive algumas ideias para fazer isso que ajudaram até eu empacar. Por exemplo, eu abro o arquivo CSV no calc usando uma macro com filtros determinados, e faço uma busca por informações que não preciso, excluindo as linhas onde se encontram, para diminuir minha base de dados.
Depois eu tive uma ideia para tentar limpar mais a base de dados e extrair as informações que eu preciso, copiando as informações já filtradas pela macro anterior e extrai-las para um clipboard ou um arquivo writer a fim de tentar pegar só o que preciso.

Foi exatamente onde empaquei porque ainda estou aprendendo a utilizar alguns comandos como o IF…End If por exemplo.

Meu objetivo, para esclarecer:

  1. Abrir o arquivo Csv e limpar as informações desnecessárias
  2. Copiar as informações semi-filtradas para um clipboard ou documento de texto para copiar apenas as informações que preciso (endereço), com base em dois critérios (palavra residencia, caractere dois pontos)
  3. Colar as informações copiadas no relatório organizado para receber essas informações

Obs.: Ao baixar os arquivos abaixo, para que abram corretamente é necessário trocar a extensão dos mesmos para .CSV, exceto o Relatorio

Arquivos exemplos:
Imovel:
DADOSMATRICULAexemplo.ods (41,7,KB)

Pessoas:
exemploCalc.ods (1,8,KB)
ExemploWriter.odt (17,2,KB)

Relatorio, onde está macro principal (não mudar extensão deste):
RelatorioExemplo.ods (26,6,KB)

Complemento:

Lendo posts em inglês entendi um pouco a incoerência do meu pedido. Se eu conseguir fazer o que descrevi acima usando apenas o calc, seria excelente.

Acontece que a ideia me veio por não conseguir usar direito o comando

.executeDispatch ( oFrame, “uno:SetInputMode”, “”, 0, Args() )

Para copiar a informação que necessito e transferir para outra célula.

Edit para conhecimento

Aprendi uma Função que faz exatamente o que precisava, de maneira mais simples.
Na solução apresentada, a qual me atendeu, foram aninhadas três funções do Calc:

DIREITA(NÚM.CARACT(intervalo)-LOCALIZAR(“Residência”;intervalo)-11)

In English:

RIGHT(LEN(Range)-SEARCH(“Residência”;Range)-11)

Porém, posso fazer o mesmo em apenas um Função, que utiliza expressões regulares:

EXPREG(intervalo;".*Residência: "; “”)

In English:

REGEX(Range;".*Residência: “;”")

Onde estudar:
https://helponline.libreoffice.org/latest/pt-BR/text/scalc/01/func_regex.html?DbPAR=CALC#bm_id831542233029549

Poste os arquivos originais em cvs, teoricamente consegue converter em planilha. Estando em planilha consegue fazer buscar.

Tem algo errado com seus arquivo, somente o Relatório é planilha os outros são texto, sendo que ExemploCalc e DADOSMATRICULA estarem como ods (Calc), mas são odt (Writer) !!!

Coloquei uma observação no tópico agora.

O Ask não me permite importar para o site arquivos com extensão .csv.

Ao baixar o arquivo, apenas trocar a extensão para csv. Assim, dá para entender melhor o que ocorre.

Quanto a busca na planilha, sim, consigo fazer. Meu problema está sendo em copiar ou extrair o texto determinado pela buscar da palavra.

Por exemplo, quero buscar a palavra residência, e, a partir dela, copiar o texto em diante (do lado direito da palavra), e colar em uma coluna após ou onde eu desejar.

A ideia de colocar no writer foi apenas pelo fato da existência do cursor com métodos que me permitiriam de alguma maneira fazer isso. E, só ontem ao fim do dia lembrei que no site que o senhor montou tem o manual OOo 3.2 Basic Guide, onde fala sobre programação no Writer.

Veja se é isto que procura:

ExemploCalc_GS.ods (29.9 KB)

1 Like

Exatamente isto. Quando crescer quero ser igual ao senhor. hahahaha

Montei até uma macro para utilizar já.
Fica de estudo para quem quiser. Muito obrigado @schiavinatto

Sub EnderecoAninhado
Dim oDoc as Object, oPessoal as Object, targetCell as Object
Dim nRow as Long oDoc = ThisComponent
oPessoal = oDoc.getSheets().getByIndex(0)
For nRow = 2 To fnLastRow
targetCell = oPessoal.getCellByPosition(2, nRow-1)
targetCell.setFormula("=RIGHT(A" & nRow & “;” & _
“LEN(A” & nRow & “)-” & _
“SEARCH(” & CHR$(34) & “Residência” & CHR$(34) & _
“;” & “A” & nRow & “)-11)” )
Next nRow
End Sub
rem-------------------------------------------------------------------------------
Function fnLastRow
Dim oDoc as Object : oDoc = ThisComponent
Dim oSheet as Object, oService as Object, nLinha as Variant
oSheet = oDoc.getCurrentController.getActiveSheet()
oService = CreateUnoService(“com.sun.star.sheet.FunctionAccess”)
nLinha = oService.callFunction(“COUNTA” , _
array(oSheet.getCellRangeByName(“A:A”)))
fnLastRow = nLinha
End Function 'fnLastRow

1 Like