sexta-feira, 30 de junho de 2017

Macro Fácil

Inciando um pequeno banco de dados no Calc. Primeiro dizer que Banco de dados é maneira de falar, pois banco de dados verdadeiramente não se faz numa planilha. Mas com minhas constantes frustações no Base por causa do Java, ou seria minha frustração do Java que não funciona direito no Base? Enfim, sem divagações e direto ao ponto. Uma matéria minha anterior, em meu blog, versava sobre essa ideia que volta e meia me “pegava”, usar o Calc como formulário e para guardar dados, - Cara ele passa de um milhão de linhas para ser guardadas…. Veja a matéria em: http://betobyte.blogspot.com.br/2014/02/a-necessidade-e-mae-da-invencao-quem.html

Depois disso, o pessoal do Linux dizia que o Calc não abaixava a linha durante a macro automática. Resolvi pedir ajuda no https://ask.libreoffice.org/pt-br/questions/ aqui neste site tem muitos “feras” em Libreoffice. Lá eu lancei uma pergunta: https://ask.libreoffice.org/pt-br/question/58248/definir-o-endereco-de-colagem-na-macro/ a qual seria como eu colo um conteúdo numa dada célula? Olha só o que eu queria: queria escrever na Planilha2 usando sempre umas três linhas (para começar), no sentido vertical e a um comando de ok, recortá-las para a Planilha1 colando no sentido horizontal. Nessa “malandragem” eu teria a Planilha2 como Formulário e a Planilha1 como Banco de Dados, ou o a Planilha “BD” como mais tarde resolvi chamar em meu arquivo (mais evoluído) CRUD em Calc.

Em meu socorro veio o Colega Grafeno, aliás, uma das grandes coisas dessa comunidade são as grandes pessoas que não tem “pudores” em compartilhar seus conhecimentos. Temos uma comunidade muito boa e com espaço para muito mais pessoas de boa vontade. Depois de tantos preâmbulos vamos direto ao ponto a macro que o Grafeno produziu para mim e para o mundo todo :) acessar livremente.

Primeiro passo é ir no Calc e criar duas planilhas, Planilha1 e Planilha2. Depois, fazer uma macro qualquer de maneira automática:




digite algo em uma célula tire o cursor para outra célula e clique em “parar Gravação”:




irá aparecer esta janela:
Localize o arquivo (por enquanto com o nome) Sem título, clique nele e salve-a no arquivo mesmo, assim ele estrá sempre no arquivo quando copiá-lo por algum motivo. Normalmente, a primeira macro tem o nome de main e fica dentro do modulo1, mas para frente você irá descobrir melhor como funciona isto.

Agora vá em Menu, “Ferramentas, Macro, editar macros e lá clica no ícone de seu arquivo e à direita aparecerão as macros, depois é só acrescentar esta macro (copie e cole o conteúdo disponível no quadro abaixo), logo abaixo do “end sub” da recém-criada macro.

















Selecione a Macro Main e clique em Editar. Copie e cole o conteúdo abaixo do última linha “end sub”



Macro autoria: Grafeno


Sub TransferirDados
Dim oDoc As Object, oPlanOrigem As Object, oPlanDestino As Object
Dim sEndereco As String, sCol As String, sLin As String
Dim iLin As Integer

    'Obter as planilhas de origem e de destino
    oDoc = ThisComponent
    oPlanOrigem = oDoc.Sheets.getByName( "Planilha2" )
    oPlanDestino = oDoc.Sheets.getByName( "Planilha1" )

    ' Pegar o Endereço em B1 na planilha de origem
    sEndereco = oPlanOrigem.getCellRangeByName( "B1" ).String
    ' Pegar a coluna e a linha definidas no endereço 
    sCol = Left( sEndereco,1 )
    sLin = Mid( sEndereco,2,Len( sEndereco ) )


    'Verificar se é um endereço válido
    If  Ucase( sCol ) <> "A" Or Not IsNumeric( sLin ) Then 
        MsgBox "Por favor, forneça um endereço correto.", 16, "Erro"
        Exit Sub
    End If

    ' Transferir os valores
    iLin = cInt( sLin ) - 1 ' Menos 1 porque a posição das células começa com 0.
    oPlanDestino.getCellByPosition( 0,iLin ).String = Ucase(sEndereco)
    oPlanDestino.getCellByPosition( 1,iLin ).String = oPlanOrigem.getCellRangeByName( "B2" ).String
    oPlanDestino.getCellByPosition( 2,iLin ).Value = oPlanOrigem.getCellRangeByName( "B3" ).Value

    ' Limpar o conteúdo do intervalo B1:B3
    ' Argumentos do método clearContents:
    '  -> 1 para apagar valores
    '  -> 4 para apagar strings (texto)
    '  --> 1 + 4 = 5 apaga valores + string
    oPlanOrigem.getCellRangeByName( "B1:B3" ).clearContents( 5 )
End Sub



Sua macro está pronta e tudo que você digitar na células B1 a B3 (sentido da coluna) serão trasportadas para a Planilha1 no sentido horizontal (de linha).


Mas será que é qualquer coisa mesmo? Não, lá existirão células que só aceitarão números e outras só aceitarão strings (letras). No próximo vídeo e artigo analisaremos a anatomia dessa macro que tão gentilmente o Grafeno do ASK do Libreoffice nos disponibilizou. Veja mais em meu blog: http://betobyte.blogspot.com.br.

Baixe o arquivo de teste.
Assista ao meu vídeo:
Outros vídeos:

Nenhum comentário:

Postar um comentário