07/07/2021 www.psantos.org/ribafs/access/Algumasdicas1.
txt
ALGUMAS DICAS ÚTEIS PARA O MS ACCESS
1 - ALTERNATIVA PARA O TIPO AUTO-NUMERAÇÃO COM A FUNÇÃO DMAX
Como o Campo do tipo autonumeração que vem com o Access é muito útil
mas tem seusinconvenientes, veja aqui uma alternativa para ele.
Esta alternativa somente funciona em formulários únicos no
Formulário principal.
- Abra o formulário no modo estrutura
- Selecione o campo chave primária da tabela em que o form se baseia
- Abra a janela de propriedades.
- Agora vá até a propriedade Valor padrão (aba Dados) e digite:
Nz(DMax("[Código do Cliente]", "Cliente")) + 1
O Nz previne valores nulos. [Código do Cliente] é o nome do Campo Chave.
Clientes é o nome da Tabela.
Para um controle mais sofisticado use a função abaixo no evento No atual
do Formulário:
Private Sub Form_Current()
If Me.NewRecord Then
On Error Resume Next 'Apenas por segurança...
Me![Código do Cliente].DefaultValue = Nz(DMax("[Código do Cliente]", "Cliente"), 0) + 1
End If
End Sub
2 - TORNANDO O PRIMEIRO (OU OUTRO) ITEM DE UMA COMBO BOX COMO DEFAULT
As combo box no Access ao serem exibidam, por default, não exibem nenhum
registro. Caso desejemos que ao abrir o form uma combo exiba um determinado
registro, podemos usar a seguinte sintaxe:
Na propriedade Valor padrão da combo digitamos:
[UF].[ItemData](5)
No caso UF é o nome da combo box e 5 indica que desejo exibir como default
o sexto registro, no caso Ceará.
ALERTA.: tenha muito cuidado ao exibir campos como padrão, pois podem induzir
o usuário a errar, já que ele poderá passar sem cadastrar este Campo.
3 - EVITE UTILIZAR COMO NOME DE CONTROLES ALGUMA PALAVRA RESERVADA DO
ACCESS
Uma destas que me tem causado problemas é a palavra reservada "VALOR", prin-
cipalmente quando vamos utilizar em operações.
4 - DESFAZER NO ACCESS
Coloque no evento desejado:
DoCmd.RunCommand acCmdUndo
5 - EVITANDO A MENSAGEM DE ERRO PADRÃO DE COMBOBOX
Digitar no evento que trata a ComboBox:
Response = acDataErrContinue
6 - QUANDO OCORRE O EVENTO "NO ATUAL (CURRENT)"?
Ocorre durante a mudança de um registro para outro
www.psantos.org/ribafs/access/Algumasdicas1.txt 1/8
07/07/2021 www.psantos.org/ribafs/access/Algumasdicas1.txt
7 - CAIXA DE MENSAGEM QUE SOLICITA CONFIRMAÇÃO
Dim msg
msg = MsgBox("Aqui a mensagem!", vbYesNo, "Aqui o título")
If msg = vbYes Then
DoCmd.Close 'Apenas um exemplo
Else
MsgBox "Você clicou em NÃO!"
End If
Alternativa:
If MsgBox("Mensagem", vbYesNo + vbDefaultButton1, "Título") = vbYes Then
MsgBox "Você clicou em SIM!"
Else
MsgBox "Você clicou em NÃO!"
End If
8 - USO DA FUNÇÃO IIF (SeImed)
= SeImed([TotalPedido] > 100; "Atingiu"; "Tente novamente")
Sgnifica: Se TotalPedido for > 100 mostre Atingiu
Se TotalPedido for <= 100 mostre "Tente novamente"
Em módulos o SeImed transforma-se em IIF e o ponto e vírgula
muda para vírgula, o restante permanece igual.
Outra aplicação útil. Na Origem do Controle:
=Soma(SeImed([Pagamento] É Nulo;0;Nz([Valor da conta])+Nz([Valor do juro])))
Somente irá somar quando o Campo Pagamento estiver preenchido.
9 - EXPLORE AO MÁXIMO AS CONSULTAS DO ACCESS
Sempre que tiver um Formulário ou Relatório que tenha alguma
operação entre Campos/Controles, como Totalização, Soma, etc.
Não baseie seu Formulário ou Relatório diretamente na Tabela
para depois criar Campos calculados, prefira criar estes
Campos calculados em uma Consulta, pois fica mais consistente.
Tenho tido muita dificuldade de efetuar operações em Campos
calculados em Formulários e principalmente em Relatórios
já quando estes cálculos são feitos nas Consultas e baseando
o Formulário na Consulta a coisa anda realmente com mais
facilidade.
10 - REFERÊNCIA A CONTROLES DE OUTROS FORMULÁRIOS
- Referência a um Controle de um Subformulário. Estando num
Formulário, para fazer referênca a um Controle que esteja num
sub formulário deste Form:
[ItensDaObra].Formulário![Data]
- Referindo-so a um controle de outro Formulário:
Formulários![ContasPagar]![txtTotalPg]
- Fazendo referência a um Controle que está em um sub de outro form:
Formulários![FormPrincipal]![Subformulário].Formulário![controle]
- Para um subformulário aninhado, utilize a seguinte sintaxe:
Formulários![FormPrincipal]![SubForm].Formulários![SubFormAninhado]Formulário![controle]
OBSERVAÇÃO IMPORTANTE: As referências acima são apenas para ser utilizadas
em propriedades como Origem do Controle e outras, para usar estas
www.psantos.org/ribafs/access/Algumasdicas1.txt 2/8
07/07/2021 www.psantos.org/ribafs/access/Algumasdicas1.txt
referências em Módulos, mudar de:
- Formulários para Forms
- Formulário para Form
11 - FUNÇÃO QUE FORÇA O USUÁRIO A CONFIRMAR A DATA DO SISTEMA
Adaptada de uma função de martinelle@icmg.seut.org.br, do
site Access Brasil
Private Sub Form_Open(Cancel As Integer)
'Adaptada de uma função de martinelle@icmg.seut.org.br, no
'site Access Brasil
Dim DataAtual As Date
Dim msg
msg = MsgBox("A data atual é " & vbCrLf & Format(Date, "dddddd") & " Deseja atualizar?",
vbYesNo + vbDefaultButton2, "Atualização de Data")
Voltar:
If msg = vbYes Then
On Error Resume Next
DataAtual = Nz(InputBox("Digite a data no formato dd/mm/aaaa"))
If Not IsDate(DataAtual) Then
MsgBox "Formato inválido, OK para digitar novamente"
GoTo Voltar
Exit Sub
Else
Date = DataAtual
End If
End If
End Sub
12 - PROIBINDO A EXCLUSÃO DE REGISTROS
No Evento Ao excluir do Formulário:
Sub Form_Delete (Cancel As Integer)
MsgBox "Não é permitida a exclusão de registros!", 48, "Proibido Excluir"
DoCmd.CancelEvent
End Sub
13 - USANDO UMA BARRA DE ROLAGEM HORIZONTAL NO ACCESS
- Abrir o Formulário no modo estrutura
- Cricar no botão Mais controles da Caixa de Ferramentas
- Clicar em Microsoft Forms 2.0 ScrollBar (ou superior)
- Desenhe a barra de rolagem horizontal na posição desejada
- Mude o Nome da barra para HSBar na aba Outra da janela de propriedades
- Aproveite e altere também na mesma aba as propriedades seguintes:
Min = 0
Max = 1000
SmallChange = 10 'Valor para clique nas setas
LargeChange = 100 'Valor para o arrasto do retângulo central
Estas são as propriedades da Barra. Agora vamos criar um Rótulo para
acusar as alterações da Barra ao rolar. Crie um Rótulo e altere
as seguintes propriedades:
Nome = rotHSB
Legenda = 0
Evento para a Barra. Selecione a barra e construa a rotina abaixo no Evento
Ao atualizar:
www.psantos.org/ribafs/access/Algumasdicas1.txt 3/8
07/07/2021 www.psantos.org/ribafs/access/Algumasdicas1.txt
Private Sub HSBar_Updated(Code As Integer)
rotHSB.Caption = HSBar.Value
End Sub
14 - FUNÇÃO QUE FECHA O ACCESS AO CHEGAR UMA DATA
Esta dica rolou na lista de VB da Virtualand, ou será que foi na de Access, access-br?
Não lembro mais.
Private Sub Form_Open(Cancel As Integer)
If Date = #8/29/00# Then
MsgBox "Tempo de uso esgotou. Favor contactar o programador!"
Quit
End If
End Sub
15 - SELECIONAR TODO O CONTEÚDO DE CAIXA DE TEXTO AO COLOCAR O FOCO NA MESMA
No evento Ao receer o foco (GotFocus), escreva:
Text1.SelStart = 0
Text1.SelLength = Len(Text1)
Rolou na lista de VB da Virtualand
16 - COMBO BOX ABRINDO AO RECEBER O FOCO
No Evento Ao receber o Foco da Combo:
SendKeys "{F4}"
17 - COMO CRIPTOGRAFAR UM BANCO DE DADOS?
- Feche o Banco de Dados, caso esteja aberto
- Ferramentas - Segurança - Criptografar
18 - QUANDO USAR O . OU O ! EM REFERÊNCIAS?
Ex.: Forms!Form1.Visible = True
! - Usar à esquerda de algo que você criou (Formulário, Controle, etc)
. - Usar para algo definido pelo Access (Método, Propriedade, etc)
19 - FUNÇÃO COM DIAS DA SEMANA
Dim daynum, today As String
' Notice, first day of the week is vbSunday.
daynum = WeekDay(Now)
If daynum = 1 Then today = " domingo. "
If daynum = 2 Then today = " segunda-feira. "
If daynum = 3 Then today = " terça-feira. "
If daynum = 4 Then today = " quarta-feira. "
If daynum = 5 Then today = " quinta-feira. "
If daynum = 6 Then today = " sexta-feira. "
If daynum = 7 Then today = " sábado. "
MsgBox "Hoje é" & today
Do site www.camonet.com
Adaptação de Ribamar FS - ribafs@yahoo.com - 13/06/2000
20 - EXCLUIR REGISTRO
Public Function ExcluirRegistro()
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdSelectRecord
www.psantos.org/ribafs/access/Algumasdicas1.txt 4/8
07/07/2021 www.psantos.org/ribafs/access/Algumasdicas1.txt
DoCmd.RunCommand acCmdDeleteRecord
DoCmd.SetWarnings True
End Function
21 - SALVAR REGISTRO
Public Function SalvarRegistro()
DoCmd.RunCommand acCmdSaveRecord
End Function
22 - PRÓXIMO REGISTRO
Public Function ProximoRegistro()
On Error GoTo Err_Proximo
DoCmd.GoToRecord , , acNext
Exit Function
Err_Proximo:
If Err.Number = 2105 Then
MsgBox "Você Encontrou o último registro", 16, "Atenção"
Else
MSG_ERRO
End If
End Function
23 - REGISTRO ALTERIOR
Public Function RegistroAnterior()
On Error GoTo Err_Anterior
DoCmd.GoToRecord , , acPrevious
Exit Function
Err_Anterior:
If Err.Number = 2105 Then
MsgBox "Você Encontrou o primeiro registro", 16, "Atenção"
Else
MSG_ERRO
End If
End Function
24 - NOVO REGISTRO
Public Function NovoRegistro()
DoCmd.GoToRecord , , acNewRec
End Function
25 - EXECUTAR UMA CONEXÃO DIAL-UP
Autoria de HELIO CANDIDO
Public Sub ExecutarDialUp(NomeDaDialUp As String)
Dim Executar
Executar = Shell("rundll32.exe rnaui.dll,RnaDial " & NomeDaDialUp, 0)
End Sub
26 - TRATANDO TEXTO COMO NÚMERO
Estas rotinas fora desenvolvidas para suprir deficiências do Access, VB e cia
no sentido de trabalhar com números decimais com mais de 6 dígitos decimais:
www.psantos.org/ribafs/access/Algumasdicas1.txt 5/8
07/07/2021 www.psantos.org/ribafs/access/Algumasdicas1.txt
Private Sub Quantidade_LostFocus()
Dim virgula As Long
Dim direita As String
'Como é um campo Requerido
If IsNull(Quantidade) Then 'O Campo Quantidade é do tipo texto
MsgBox "Preenchimento obrigatório!"
DoCmd.CancelEvent
SendKeys "{up}"
Else
'Guardar a posição onde estará a vírgula
virgula = InStr(1, Quantidade, ",", vbTextCompare)
direita = Right(Quantidade, Len(Quantidade) - virgula)
'Na definição do Campo Quantidade na Tabela ficou: Texto, Tamanho 17
'Prevenir que não se digite mais que 8 decimais
If direita > "99999999" Then
MsgBox "Somente até 8 decimais!)"
DoCmd.CancelEvent
SendKeys "{up}"
End If
End If
End Sub
Private Sub Quantidade_KeyPress(KeyAscii As Integer)
'Impedir entradas não numéricas
If KeyAscii = 8 Or KeyAscii = Asc(",") Then Exit Sub
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0
'Alternativas:
'If (KeyAscii >= vbKey0 And KeyAscii <= vbKey9) Or KeyAscii = vbKeyBack or KeyAscii=44 Then
' Exit Sub
'Else
' KeyAscii = 0
'End If
'If KeyAscii = 8 Or KeyAscii = 44 Then Exit Sub
'If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub
27 - CÓDIGOS DE TECLAS (KeyAscii)
De 0 - 9 (48 a 57)
De a - z (97 a 122)
De A - Z (65 a 90)
Vírgula = 44
Ponto Final = 46
28 - PERMITIR APENAS NÚMEROS EM CAIXA DE TEXTO
Colocar no Evento KeyPress (Ao pressionar tecla)
If (KeyAscii >= vbKey0 And KeyAscii <= vbKey9) Or KeyAscii = vbKeyBack Then
Exit Sub
Else
KeyAscii = 0
End If
29 - SELECIONAR QUANTIDADE DE CÓPIAS VIA CÓDIGO
Function NCopias()
Dim cópias As Integer
cópias = InputBox("Quantas cópias?")
www.psantos.org/ribafs/access/Algumasdicas1.txt 6/8
07/07/2021 www.psantos.org/ribafs/access/Algumasdicas1.txt
DoCmd.PrintOut , , , , cópias
End Function
30 - SAIR DO ACCESS COM CONFIRMAÇÃO
Function Sair()
If MsgBox("Você deseja sair do aplicativo?", vbYesNo + vbQuestion, _
"Confirmação") = vbYes Then
'Esconder a "Barra de Status"
'Application.SetOption "Mostrar Barra de Status", False
Application.Quit acPrompt
End
End If
End Function
31 - OBRIGAR PREECHIMENTO DE CAMPO
No Evento Ao perder o foco do Campo/Controle:
Private Sub NomeCliente_LostFocus()
If IsNull(NomeCliente) Then
MsgBox "Preenchimento obrigatório!"
DoCmd.CancelEvent
SendKeys "{UP}"
End If
End Sub
32 - REPETIR CONTEÚDO DO ÚLTIMO REGISTRO NO ATUAL
Dica de MARCIO DA SILVA VIEIRA CS39152@csn.com.br na lista Access-br.
1. Abra a estrutura de seu formulário ;
2. Selecione todos os campos que vc deseja que os dados se repitam ;
3. Abra a folha de propriedades através da barra de ferramentas ;
4. Clique no campo Marca da guia : Outra
5. Digite : Repetir
6. Crie um Procedimento de evento no seu formulário(Antes de Atualizar),
como segue :
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim ctlCampo As Control
Dim strAspas As String
For Each ctlCampo In Me
If ctlCampo.Tag = "Repetir" Then
If Not IsNumeric(ctlCampo) Then
strAspas = Chr(34)
Else
strAspas = ""
End If
ctlCampo.DefaultValue = strAspas & ctlCampo & strAspas
End If
Next ctlCampo
End Sub
7. Salve as alterações e experimente !
33 - CRIAR MODELO DE FORMULÁRIO/RELATÓRIO
Crie um formulário com todas as propriedades desejadas como padrão e salve
com nome Normal. Caso deseje Salvar com outro nome terá que informar esse
nome em Ferramentas - Opções - Formulários/Relatórios - Modelo de...
34 - SOLICITANDO PARÂMETROS EM CONSULTA SQL
SELECT * FROM Clientes WHERE NomeCli = [Qual o nome do Cliente?];
www.psantos.org/ribafs/access/Algumasdicas1.txt 7/8
07/07/2021 www.psantos.org/ribafs/access/Algumasdicas1.txt
Esta consulta solicita o Nome do Cliente e informa apenas os encontrados
com o nome solicitado.
35 - EXIBINDO A CAIXA CONTAS DE GRUPOS E USUÁRIOS
Public Function ExibirSegurança()
DoCmd.RunCommand acCmdUserAndGroupAccounts
End Function
--------------------------------
Cantinho dos Amantes do Access
www.ribafs.hpg.com.br/access
www.psantos.org/ribafs/access/Algumasdicas1.txt 8/8