Pergunte aqui
0

Macro que faça resumo das abas/guias

perguntadas 2019-01-27 23:28:28 +0100

imagem do gravatar de andrefebronio

updated 2019-03-13 03:51:09 +0100

Prezados,

Tenho uma planilha em que cada aba/guia recebe o nome de um cliente e nelas está escrito cada historico de contato com eles. Na célula B7 de cada aba mostra a data do ultimo contato.

Preciso criar uma rotina que retorne na primeira aba (RESUMO), na coluna A, uma lista com o nome de cada aba existentes na planilha, com um hiperlink para a cada uma listada, e na coluna B a data do ultimo contato (célua B7 da respectiva aba listada na coluna A). Essa rotina deve rodar cada vez que eu clicar na aba RESUMO de forma a atualizar a lista de abas(clientes) existentes e a data do ultimo contato constante e cada aba.

Descrição da imagem

Verifiquei que o navegador do Calc faz algo parecido, no entanto não soube como colocá-lo em uma aba/guia, além de fazê-lo mostrar informações especificas das abas.

Caso possível, solicito ajuda na criação.

editar alterar tag assinalar como ofensivo fechar mesclar Excluir

2 Respostas

0

respondidas 2019-01-28 03:03:46 +0100

updated 2019-02-26 03:25:08 +0100

Ola @andrefebronio, seja bem vindo ao Grupo.

Considerando linha 2:

Se digitar o Nome da aba na coluna A, a fórmula na coluna B pode ser assim:

=INDIRETO(A2&".B7")

Também é possível, Primeiro listar o name da ABA no RESUMO e depois criar a aba com este nome, veja este: https://ask.libreoffice.org/pt-br/que...

Complemento

A Macro não ficou bonita, mas esta funcionando:

A primeira é do Livro "Macros para o OpenOffice.org - Calc" as demais fiz com o gravador e cortei as gorduras.

'================================================|
Sub ListarPlanilhas
'================================================|
    Call IrPara "RESUMO.A1"
    Call LimparResumo
    Dim oPlan
    Dim nome As String
    Dim cont As Integer
        oPlan = ThisComponent.Sheets
            For cont = 0 To oPlan.getCount() - 1
                nome = nome & oPlan(cont).Name & Chr(10)
                Var1 = oPlan(cont).Name 
    Call Digitar Var1
            Next
    Call PreencherRESUMO    
End Sub



'================================================|
sub Digitar (xmensagem as string)
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "StringName"
args1(0).Value = xmensagem
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, Array())
end sub

'================================================|
sub IrPara (xlocal as string)
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = xlocal
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
end sub

'================================================|
sub PreencherRESUMO
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "By"
args1(0).Value = 1
args1(1).Name = "Sel"
args1(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:GoUpToStartOfData", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, Array())
    Call Digitar "=INDIRETO(A2&"".""&""B7"")"
dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:GoUp", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:GoLeft", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:GoDownToEndOfData", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:GoUpToStartOfDataSel", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:GoDownSel", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
    Call IrPara "$A$1"
end sub

'================================================|
sub LimparRESUMO
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "By"
args1(0).Value = 1
dispatcher.executeDispatch(document, ".uno:GoRightSel", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:GoDownToEndOfDataSel", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:ClearContents", "", 0, Array())
    Call IrPara "A1"
end sub

Arquivo do teste.

Quando acrescenta ou deleta planilhas e volta para a RESUMO já esta atualizada...

editar assinalar como ofensivo Excluir Link mais

Comentários

Olá, Agradeço a dica. Encontrei um modelo que me atende com linguagem para o excel. Como sou muito leigo em programar, não consegui converter para o Calc:

Private Sub Worksheet_Activate()
Dim ws As Worksheet, i As Integer
Application.ScreenUpdating = False
Sheets("RESUMO").Range("A:A").ClearContents
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> "RESUMO" Then
i = i + 1
With Sheets("RESUMO")
.Range("A" & i) = ws.Name
End With
End If
Next ws
Application.ScreenUpdating = True
End Sub

.

Essa rotina é incluída no "código fonte" da guia/aba RESUMO. Ela altera a coluna A da guia, de modo que toda vez que a abro, o excel percorre todo o documento. Ele chama o conjunto das guias existentes no documento de WS e conforme vou incluindo/excluido as guias ele conta e acrescenta/retira uma dessa lista, retornando o nome das guias.

É possível converter?

imagem do gravatar de andrefebronioandrefebronio ( 2019-02-26 01:21:28 +0100 )editar

Prezado @Gilberto,

Realmente funciona muito bem e é exatamente o que precisava. Desde já estou muito grato pela ajuda. No entanto a macro dá erro quando a planilha possui apenas duas guias. Caberia algum ajuste na sintaxe?

De forma a incrementar mais a planilha, podes me ajudar a...?: - acrescentar mais informações nas outras colunas a exemplo da coluna B que traz a celula B7; - colocar um hiperlink no nome da planilha listada para que ao clicar em tal nome já se possa ir direto para a guia referente ao nome; - retirar a seleção da célula B2 ao término da macro; - realizar ajustes na formatação, tais como cor da célula ou negrito no texto.

Att.

imagem do gravatar de andrefebronioandrefebronio ( 2019-03-13 01:57:37 +0100 )editar

Ola @andrefebronio, segue alteração, erro corrigido.

Quanto a formatação se for só negrito é só formatar as colunas, quanto a cor da célula, usei Formatação condicional, por exemplo: A formula é: A1<>"" , formatei estilo God,

(explicando se célula diferente de branco o fundo é God = Fundo verde, letra verde e negrito )

Falta o Hiperlink, vou verificar com mais tempo amanhã, ok.

Arquivo corrigido.

Caso a resposta atendeu sua necessidade, por gentileza, click na bolinha Descrição da imagem a esquerda da resposta, lá em cima, para finalizar a pergunta.

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2019-03-13 03:42:52 +0100 )editar

Olá Gilberto,

Realmente o problema foi resolvido.

Fico no aguardo do hyperlink e do acréscimo do outro "indireto" pra coluna C e pras outras colunas, caso queira trazer mais alguma informação das planilhas.

Att.

imagem do gravatar de andrefebronioandrefebronio ( 2019-03-13 13:17:17 +0100 )editar

Ola @andrefebronio, com hiperlink

Arquivo com hiperlink

Quanto a mais colunas, quais seria as células de referencia.

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2019-03-13 13:20:30 +0100 )editar

Olá Gilberto.

Poderia ser a B10 ou C10. Pra você me ensinar como incluir mais referências de acordo com a informação q eu quiser puxar das outras planilhas.

Tentei duplicar o "call" do indireto mas dá erro.

imagem do gravatar de andrefebronioandrefebronio ( 2019-03-13 19:16:28 +0100 )editar

@andrefebronio, vou montar uma maneira de se acrescentar novas colunas de uma maneira mais pratica, ser ter que mexer na macro.

Ou seja vou mexer ma macro para não mexer na macro, estranho né....................

Quantos campos devo prever ( entre em contado direto gilberto@schiavinatto.com e/ou gilbertoschiavinatto@yahoo.com.br ),

imagem do gravatar de Gilberto SchiavinattoGilberto Schiavinatto ( 2019-03-13 19:36:09 +0100 )editar
0

respondidas 2019-01-28 11:44:47 +0100

imagem do gravatar de Conrado

Olá @andrefebronio,

Segue um modelo que pode ser utilizado. Neste modelo não utilizei macros. Possuo uma planilha em Excel de um cliente, onde eu trabalho exatamente da forma que você precisa, e ainda, organiza em ordem alfabética os nomes e as abas, porém, este arquivo possuí hoje mais de 300 contatos, e quando a planilha executa as classificações atualizações, ela demora cerca de 45 minutos. Sabemos que a Linguagem VBA do Excel é levemente mais rápida que a do LibreOffice, mas mesmo assim, o processo é extremamente lento.

Portanto, sugiro a utilização sem as macros para atualização.

Seguem modelos:

1 - Arquivo com fórmulas para atualização do último contato. Deve ser colocado o nome do contato e depois criar a aba com o mesmo nome.

2 - Arquivo com fórmulas para atualização do último contato, e também com a macro que pega o nome e a posição (linha) da célula e cria uma aba com o mesmo nome.

editar assinalar como ofensivo Excluir Link mais

Comentários

Olá, Agradeço as dicas, no entanto não serão tantos processos a listar nessa planilha e assim poderei trabalhar com a macro ao invés das formulas. Encontrei um modelo que me atende muito bem, porém a linguagem é para o excel. Como sou muito leigo em programar, não consegui converter para o Calc:

Private Sub Worksheet_Activate()
Dim ws As Worksheet, i As Integer
Application.ScreenUpdating = False
Sheets("RESUMO").Range("A:A").ClearContents
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> "RESUMO" Then
i = i + 1
With Sheets("RESUMO")
.Range("A" & i) = ws.Name
End With
End If
Next ws
Application.ScreenUpdating = True
End Sub

Essa rotina é incluída no "código fonte" da guia/aba RESUMO. Ela altera a coluna A da guia, de modo que toda vez que a abro, o excel percorre todo o documento. Ele chama o conjunto das guias existentes no documento de WS e ...(more)

imagem do gravatar de andrefebronioandrefebronio ( 2019-02-26 01:19:40 +0100 )editar

Se conseguisse resolveria o problema.

imagem do gravatar de andrefebronioandrefebronio ( 2019-02-26 01:22:21 +0100 )editar
Login/Registrar para responder

Ferramentas de perguntas

1 seguidor

Estatísticas

Perguntadas: 2019-01-27 23:28:28 +0100

Lidas: 62 vezes

Última atualização: Mar 13