Entrei em modo design, usando a barra de controle de formulários e inseri um Campo de Data, ativei a opção Suspensa na caixa de Controle para poder escolher a data através do calendário. Gostaria agora de saber como após escolher a data preencher automaticamente uma célula.
Olá,
O controle de “Campo de Data” não se vincula diretamente a um célula. No caso, é preciso atribuir uma macro ao evento “Texto modificado” do controle.
- Vá em Ferramentas > Macros > Organizar macros > LibreOffice Basic…
- Em “Macro de” selecione o seu arquivo e clique no botão “Novo”
- Dê “Ok” e será criado um módulo.
- Copie a macro abaixo e cole na janela da IDE.
.
Sub TextoModificado( oEvento )
Dim oCampoData As Object, oDoc As Object
Dim oPlan As Object, oCel As Object
Dim sData As String
' Obter o Campo de Data
oCampoData = oEvento.Source.Model
' Obter a Célula A1
oDoc = oCampoData.Parent.Parent.Parent
oPlan = oDoc.Sheets.getByName("Planilha1")
oCel = oPlan.getCellRangeByName("A1")
' Pegar a data selecionada no controle
With oCampoData.Date
sData = .Day & "/" & .Month & "/" & .Year
End With
' Inserir a data como string(texto) na célula
oCel.String = sData
End Sub
Para atribuir a macro ao evento "Texto modificado" do controle:
- No Modo Design clique com botão direito no controle
- Escolha “Controle…”
- Na janela “Prorpriedades” clique na aba “Eventos” e no botão com três pontinhos (…) na frente de “Texto Modificado”
- Clique em “Macro” na nova janela
- Em “Biblioteca” navegue no seu arquivo até o nome do Módulo criado. Dê um clique
- Em “Nome da Macro” escolha a macro colada e dê “Ok” e depois “Ok”.
- Feche a janela “Propriedades” e saia do Modo Design
Acabou ficando um pouco extenso, mas espero que ajude.
Atte,
Grafeno
Ola, boa tarde.
Usei o código em cima e funciona uma parte e outra parte não funciona.
Quando selecciono a data ou “hoje”, está tudo certo.
O problema é quando quero limpar o campo ou selecionar “nenhum”. Dá erro dizendo que:
“sData = .Day & “/” & .Month & “/” & .Year → Variável de objeto não definida.”
Alguém consegue ajudar?
A macro do @Grafeno alterada: Ola Carlos, encontrei a solução no livro de Cleuton Sampaio ( Criando Macros no BrOffice Calc, pg.104 - Ed. Brasport / 2010 )
Sub TextoModificado( oEvento )
Dim oCampoData As Object, oDoc As Object
Dim oPlan As Object, oCel As Object
Dim sData As String
' Obter o Campo de Data
oCampoData = oEvento.Source.Model
' Obter a Célula A1
oDoc = oCampoData.Parent.Parent.Parent
oPlan = oDoc.Sheets.getByName("Sheet1")
oCel = oPlan.getCellRangeByName("A1")
' Pegar a data selecionada no controle
With oCampoData.Date
On Error Resume Next 'acrescentei esta linha ( O Basic desliga a tratamento de erro, se der erro, não saberá, o processamento continua )
sData = .Day & "/" & .Month & "/" & .Year
End With
' Inserir a data como string(texto) na célula
oCel.String = sData
End Sub
Sensacional schiavinato, tava procurando um calendário desse tipo fazia tempo. Não domino muito a programação do Libreoffice calc, na maioria das vezes faço as buscas pela net e sempre acabo encontrando as soluções que vocês postam. Muito bom mesmo. Obrigado.!!!
Olá @AlvaroBaptistella, segue um exemplo com a macro mais simples…
218094B_Campo data para célula.ods (15.2 KB)
Com instruções completa de inclusão no arquivo …
Oi @schiavinato, obrigado pela atenção. Eu consegui entender a sua macro e ficou perfeita, até já apliquei na minha planilha. Eu misturo muito os controles de formulários nas planilhas, para criar a cara de um sistema que, aliás é o que gosto de fazer. Eu tenho as ideias mas muitas vezes não consigo transportá-las para as macros mais programáveis. A última macro sua que estou usando é a de ligar e desligar tela inteira, muito bom, mas gostaria de acrescentar um comando de salvamento automático quando fechar a planilha, será que é possível? Até mais.
@schiavinatto óia eu novamente…junto com as planilhas doidas…agora tô precisando de uma macro para localizar registro dentro da planilha, para posterior alteração ou exclusão. Já pesquisei de todo lado que pude e não encontrei. Será que dá pra me salvar outra vez…??? Desde já agradeço…!!!