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.