MontaRibbons 4.0
Vetores e Matrizes
Manipulação de Strings (Contagem de Caracteres)
Funções e Sub-rotinas
Login no Sistema
Segurança de Dados
Mala Direta (Access X Word) com VBA
Alterando a Fonte de Registro a Cada Novo Ano Automaticamente
Brincando com o Looping For ... Next
Brincando com Comboboxes
Manipulando Strings no VBA (Contagem de Caracteres)
Em caixa de textos do tipo Memorando e formatação Rich Text você pode com o seguinte código no evento Change contar os caracteres que são digitados a partir de uma caixa de texto não acoplada e sem formatação:
Private Sub Corpo_Change()
Call AtualizaContagem
DoCmd.RunCommand acCmdSave
End Sub
Public Sub AtualizaContagem()
On Error Resume Next
Dim nCar As Integer
Dim strMsg As String
Dim strTitle As String
Dim intRetVal As Integer
If Not IsNull(Corpo) Or Corpo <> "" Then
nCar = Len(Corpo) ‘Define o comprimento ou número de
caracteres existentes na caixa de texto do tipo Memorando e
formatação Rich Text
nCar = 0
nCar = nCar + 1 ‘Contador de caracteres
Me.txtCar = nCar ‘txtCar é o nome da caixa de texto não
acoplada sem formatação. Coloque na fonte de controle a
seguinte sintaxe: =Len(Corpo) que vai virar =Compr([corpo])
DoCmd.RunCommand acCmdSave ‘Este commando atualizará
a contagem a partir de nCar
‘********************************************************************************
***
‘Código complementar para dar um refino em detalhes para
limitar o número de caracteres digitado
If txtCar = 800 Then
MsgBox "Atingido o limite máximo de caracteres permitido !!!",
vbCritical, "Máximo de Caracteres"
Corpo.Locked = True
strTitle = "Liberação"
strMsg = "Deseja liberar para digitar mais ou deletar
informação extra? No primeiro caso, lembre-se que o corpo sairá
da estética padrão. Continuar?"
intRetVal = MsgBox(strMsg, vbQuestion + vbYesNo, strTitle)
Select Case intRetVal
Case vbYes
Corpo.Locked = False
Case vbNo
Corpo.Locked = True
End Select
Else
Corpo.Locked = False
End If
End If
End Sub
Para implementar ainda mais a análise do texto digitado incluí mais uma sub-rotina para limitar o texto digitado e realizar uma análise crítica do documento.
Public Sub LimitarCaracteres()
On Error Resume Next
Me.Refresh
Dim sCar As Long
Const nMax = 800
Corpo.Locked = False
sCar = Len(Corpo)
MsgBox "Você já digitou " & sCar & " caracteres. Máximo é de
800 caracteres !!!", vbInformation, "Limite de Caracteres"
If sCar >= nMax Then
Corpo.Locked = True
MsgBox "Você chegou ao limite de caracteres para integrar o
corpo do memorando !!!", vbCritical, "Limite de Caracteres"
Beep
MsgBox "Digitados " & sCar & " caracteres !!!", vbInformation,
"Máximo de Caracteres Digitados"
End If
End Sub
FUNÇÕES X SUB-ROTINAS
Qual é a diferença entre uma Função e uma Sub-Rotina? A diferença entre uma função e uma sub-rotina é que a primeira retorna um valor, enquanto a segunda executa uma tarefa.
Vamos primeiramente dar uma olhada em funções e como elas podem ser úteis para resolver inúmeros problemas em VBA. Vou destacar algumas que já criei para que você programador possa ir já aprendendo a desenvolvê-las e utilizá-las em seus aplicativos. Vamos ver então primeiramente funções sem parâmetros.
FUNÇÕES PRÁTICAS (1)
Private Function Tabuada() Dim i As Integer
‘Bloco For...Next
******************************************************************************** For i = 1 To 10
Tabuada = Valor * i
MsgBox "O valor " & Valor & " vezes " & i & " é " & Tabuada, vbInformation, "Tabuada" Next i ‘************************************************************************************** End Function (2)
Public Function Substituir() As String On Error Resume Next
Dim sRua As String Dim sAvn As String Dim sEtr As String
If Not IsNull(Endereco) Then ‘Endereco é o nome do campo em sua tabela presente no formulário
sRua = Replace(Endereco, "Rua", "R") 'Expression(ou nome do campo), Find(procura a string antiga), Replace(Substitui por esta nova string)
Endereco = sRua
Find(procura a string antiga), Replace(Substitui por esta nova string) Endereco = sEtr
sAvn = Replace(Endereco, "Avenida", "Avn") 'Expression(ou nome do campo), Find(procura a string antiga), Replace(Substitui por esta nova string) Endereco = sAvn
Substituir = Endereco ‘Aqui a função recebe o valor Resultante Else
Exit Function End If
End Function
‘Na saída do campo Endereco chame a função. Private Sub Endereco _Exit(Cancel As Integer)
Call Substituir() 'Chama a função na saída do campo endereço End Sub
(3)
Public Function CalculaTaxa() Dim nTaxa As Double
Dim jurocredito As Double Dim juroDebito As Double Dim jurovoucher As Double Dim parc As Integer
parc = Nz(Parcela)
' Atualizando a caixa taxa com valor da taxa de credito
If Me!Descricao = "Credito" Then
jurocredito = DLookup("CpJuros", "tblJuros", "CpTipo = 'Crédito' And CodParcelaCred = " & parc)
Me.valortaxa = jurocredito nTaxa = valortaxa
CalculaTaxa = nTaxa End If
' Atualizando a caixa taxa com valor da taxa de debito
If Me!Descricao = "Debito" Then
juroDebito = DLookup("CpJuros", "tblJuros", "CpTipo = 'Débito' And CodParcelaDeb = " & parc)
Me.valortaxa = juroDebito nTaxa = valortaxa
CalculaTaxa = nTaxa End If
‘Atualizando a caixa taxa com valor da taxa de voucher
' atualizando a caixa taxa com valor da taxa de voucher
jurovoucher = DLookup("CpJuros", "tblJuros", "CpTipo = 'Voucher' And CodParcelaVou = " & parc)
Me.valortaxa = jurovoucher nTaxa = valortaxa CalculaTaxa = nTaxa End If Me.Datavenda.SetFocus End Function
Como é que fica a tabela de juros (tblJuros)? Nome do campo Tipo de dados
Id_Tipo Numeração Automática
CpTipo Texto CpJuros Número CodParcelaCred Número ParcelaCred Número CodParcelaDeb Número ParcelaDeb Número CodParcelaVou Número ParcelaVou Número tblJuros ID_Ti po CpTipo CpJur os CodParcela Cred ParcelaC red CodParcela Deb Parcela Deb CodParcela Vou Parcela Vou 1 Crédito 3,8 1 1 2 Débito 2,2 1 1 3 Vouch er 7,5 1 1 4 Parcela do 7,5 5 Crédito 6,5 2 2 6 Débito 6,5 2 2 7 Vouch er 6,5 2 2
Agora vamos aprender a criar funções parametrizadas ou com parâmetros.
(1) Com um parâmetro
Public Function EncontreErrosOrtográficos(nTexto As String) On Error Resume Next
nTexto = CInt(InputBox("Você pretende fazer uma correção ortográfica?" & vbCrLf & _
"1 - Yes " & vbCrLf & _
"2 - No ", "Erros Ortográficos")) Select Case nTexto
Case Is = 1
DoCmd.RunCommand acCmdSpelling Case Is = 2
Exit Function End Select
nTexto = Resposta 'Resposta é o nome da caixa de texto do tipo Texto ou do tipo Memorando
EncontreErrosOrtográficos = nTexto End function
Código da saída da caixa de texto Resposta. Private Sub Resposta_Exit(Cancel As Integer) Dim nTexto As String
Call EncontreErrosOrtográficos(nTexto) End Sub
(2) Função para identificar o usuário com dois parâmetros
Public Function VerificaLogin(sLogin As String, sSenha As String) Dim nLogin As String
Dim nSenha As String
nLogin = login 'login é o nome da caixa de texto do formulário de Login nSenha = senha 'senha é o nome da caixa de texto do formulário de Login sLogin = Nz(DLookup("login", "tblCadastro", "login = '" & nLogin & "'")) ‘A função Nz
sSenha = Nz(DLookup("senha", "tblcadastro", "login = '" & sLogin & "'"))
If sLogin <> "" Then
MsgBox "Nome OK", vbInformation, "Testa Login" End If
If sSenha = nSenha Then
MsgBox "Senha válida !!!", vbInformation, "Testa Login"
DoCmd.OpenForm "frmteste", acNormal 'Se a senha for válida abre
o formulário principal
Else
MsgBox "Senha inválida !!!", vbInformation, "Testa Login"
End If
End Function
Código do botão OK (cmdEntrar)
Private Sub cmdEntrar_Click()If Not IsNull(login) And Not IsNull(senha) Then If VerificaLogin(login, senha) = True Then
DoCmd.Close acForm, "frmTesteLogin", acSaveYes End If
End If End Sub
SUB-ROTINAS PRÁTICAS (1)
Public Sub RemoveTexto() On Error Resume Next Dim nENDERECO As String Dim strTexto As String Dim intPos As String
nENDERECO = ENDERECO
intPos = InStr(1, nENDERECO, ",") 'Localiza a vírgula na string de endereço a partir do primeiro caracter
strTexto = Trim(Left(nENDERECO, intPos)) 'Remove a string à esquerda da vírgula para inclusão de uma nova numeração pela consulta da minha combo cuja fonte de dados é uma consulta dos endereços pelo campo ENDERECO de minha tabela
ENDERECO = strTexto End Sub
No evento duplo-clique do campo ENDEREÇO:
Private Sub ENDERECO_DblClick(Cancel As Integer) If Not IsNull(ENDERECO) Then
Call RemoveTexto 'Chama a sub-rotina que remove os caracteres à esquerda da vírgula
MsgBox "Atualize o campo ENDERECO com a nova numeração agora !!!", vbInformation, "CONTROLE DE ORDEM DE SERVIÇO"
Else
MsgBox "O campo ENDERECO está em branco !!!", vbQuestion, "CONTROLE DE ORDEM DE SERVIÇO"
End If End Sub
(2) Um trecho de código do aplicativo Gerador de Relatórios Public Sub AcrescentarNivel()
On Error Resume Next Dim strRegistro As String Dim strAssunto As String Dim strStatus As String Dim n As Integer
Dim strMsg As String Dim strTitle As String Dim intRetVal As Integer
strTitle = "Criar Relatório"
strMsg = "Deseja acrescentar um Nível?"
intRetVal = MsgBox(strMsg, vbQuestion + vbYesNo, strTitle) Select Case intRetVal
Case vbYes
If Nível = Format(Nível, "0.0") Then 'Se o formato do código for com ponto acrescenta o próximo Nível
n = Mid(Forms!CriarRelatorioII!Nível, 3, 3) 'Pega o último dígito do último código
n = n + 1
strRegistro = Mid(Forms!CriarRelatorioII!Nível, 1, 1) & "." & n 'Formata o código e acrescenta uma unidade ao valor depois do ponto
strRegistro = Replace(strRegistro, ",", ".") 'Corrige e reformata o código strAssunto = Assunto
DoCmd.SetWarnings False
strRegistro = "INSERT INTO Pai(Nível,Assunto) VALUES('" & strRegistro & "', '" & strAssunto & "')"
DoCmd.RunSQL strRegistro
DoCmd.RunCommand acCmdRefresh DoCmd.SetWarnings True
MsgBox "Dados Alterados com sucesso !!!", vbExclamation, "Criar Relatorio" Else 'Caso o contrário
n = Mid(Forms!CriarRelatorioII!Nível, 3, 3) 'Pega o último dígito do último código
strRegistro = Mid(Forms!CriarRelatorioII!Nível, 1, 1) & "." & n 'Formata o código e acrescenta uma unidade ao valor depois do ponto
strRegistro = Replace(strRegistro, ",", ".") strAssunto = Assunto
DoCmd.SetWarnings False
strRegistro = "INSERT INTO Pai(Nível,Assunto) VALUES('" & strRegistro & "', '" & strAssunto & "')"
DoCmd.RunSQL strRegistro
DoCmd.RunCommand acCmdRefresh DoCmd.SetWarnings True
MsgBox "Dados Alterados com sucesso !!!", vbExclamation, "CriarRelatorio" End If Case vbNo Exit Sub End Select End If LOGIN NO SISTEMA
Public Function VerificaLogin(sLogin As String, sSenha As String) Dim nLogin As String
Dim nSenha As String
nLogin = login 'login é o nome da caixa de texto do formulário de Login nSenha = senha 'senha é o nome da caixa de texto do formulário de Login sLogin = Nz(DLookup("login", "tblCadastro", "login = '" & nLogin & "'")) ‘A função Nz
sSenha = Nz(DLookup("senha", "tblcadastro", "login = '" & sLogin & "'"))
If sLogin <> "" Then
MsgBox "Nome OK", vbInformation, "Testa Login" End If
If sSenha = nSenha Then
MsgBox "Senha válida !!!", vbInformation, "Testa Login"
DoCmd.OpenForm "frmteste", acNormal 'Se a senha for válida abre
o formulário principal
Else
MsgBox "Senha inválida !!!", vbInformation, "Testa Login"
End If
End Function
Código do botão OK (cmdEntrar)
Private Sub cmdEntrar_Click()If Not IsNull(login) And Not IsNull(senha) Then If VerificaLogin(login, senha) = True Then
DoCmd.Close acForm, "frmTesteLogin", acSaveYes End If
End If End Sub
SEGURANÇA DE DADOS
Public Function verificaLogin(sLogin As String, sSenha As String)
Dim nLogin As String
Dim nSenha As String
Dim xLogin As String
Dim yLogin As String
Dim zLogin As String
Dim nCodigo As Integer
Dim x As StringDim y As String Dim z As String nLogin = login nSenha = senha
x = Nz(DLookup("Nivel", "tblNiveis", "Codigo = 1")) y = Nz(DLookup("Nivel", "tblNiveis", "Codigo = 2")) z = Nz(DLookup("Nivel", "tblNiveis", "Codigo = 3"))
nCodigo = Nz(DLookup("Codigo", "tblCadastro", "login = '" & nLogin & "'")) sLogin = CStr(Nz(DLookup("login", "tblCadastro", "login = '" & nLogin & "'"))) sSenha = CStr(Nz(DLookup("senha", "tblcadastro", "login = '" & sLogin & "'"))) xLogin = CStr(Nz(DLookup("login", "tblCadastro", "Nivel = '" & x & "' And Codigo = " & nCodigo)))
yLogin = CStr(Nz(DLookup("login", "tblCadastro", "Nivel = '" & y & "' And Codigo = " & nCodigo)))
zLogin = CStr(Nz(DLookup("login", "tblCadastro", "Nivel = '" & z & "' And Codigo = " & nCodigo)))
If sLogin <> "" Then 'Valida usuário
MsgBox "Login válido !!! ", vbInformation, "Testa Login" If sSenha = nSenha Then 'Valida senha do usuário
MsgBox "Senha válida !!!", vbInformation, "Testa Login" If xLogin = sLogin Then
MsgBox "O nivel é de " & x & "", vbExclamation, "Testa Login" DoCmd.OpenForm "frmteste", acNormal, , , acFormEdit
DoCmd.Close acForm, "frmTesteLogin", acSaveYes ElseIf yLogin = sLogin Then
DoCmd.OpenForm "frmteste", acNormal, , , acFormAdd DoCmd.Close acForm, "frmTesteLogin", acSaveYes ElseIf zLogin = sLogin Then
MsgBox "O nivel é de " & z & "", vbExclamation, "Testa Login" DoCmd.OpenForm "frmteste", acNormal, , , acFormReadOnly DoCmd.Close acForm, "frmTesteLogin", acSaveYes
Else
Exit Function End If
Else
MsgBox "Senha inválida !!!", vbInformation, "Testa Login" End If
Else
MsgBox "Login inválido !!!", vbInformation, "Testa Login" End If
End Function
CALCULANDO TEMPO EM ANOS, MESES E DIAS ENTRE DUAS
DATAS
Vamos supor que você queira a partir do número de meses calcular o tempo em ano, meses e dias. Desenvolvi uma técnica de primeiro, calcular entre duas datas o número de meses e só a partir do resultado extrair o tempo em anos, meses e dias. Vamos ver, então, a função que calcula o tempo decorrido entre duas datas chama-se DateDiff ou DifData:
Public Function CalculaTempoServico(nData1 As Date, nData2 As Date) On Error Resume Next
Dim nts As Long
nData1 = Nz([DataInicial]) nData2 = Nz([DataFinal])
nts = Nz(DateDiff("m", nData1, nData2)) 'Calcula o total de meses pela diferença entre as datas
TempoServico = Nz(nts) End Function
Private Sub Atualizar_Click() On Error Resume Next
Dim nAno As Long Dim sAno As Long Dim nMes As Integer
Dim nTempoTotal As Long Dim TempAno As Long Dim TempMes As Long Dim CalcAno As Long Dim nDia As Long
Dim nDataInicial As Date Dim nDataFinal As Date Dim sMes As Long Dim sMes2 As Long
sMes = Month(DataInicial) sMes2 = Month(DataFinal) nTempoTotal = TempoTotal sAno = txtAno
nDataInicial = left(Format(DataInicial, "dd/mm/yyyy"), 2) nDataFinal = left(Format(DataFinal, "dd/mm/yyyy"), 2)
nAno = Nz(IIf(nTempoTotal <= 12, 0, Replace(left(([TempoTotal] / 12), 2), ",", ""))) 'Calcula ‘o total 'de anos. Se o total em meses for menor que 12, o total de anos é zero. Caso contrário pega os 'dois primeiros dígitos do quociente como total de anos.
nMes = Nz(CInt(Abs(nTempoTotal - (sAno * 12)))) 'Calcula o que sobra de meses. Uma vez ‘calculado o número de anos, capturo o valor em uma variável sAno, multiplico por 12 para ‘dar o número em meses e subtraio do total de meses.
nDia = IIf(sMes = sMes2, Abs(DateDiff("d", nDataInicial, nDataFinal)), 0) ‘Calcula a diferença em dias entre duas ‘datas
txtAno = Nz(nAno) txtMes = Nz(CInt(nMes)) txtDia = Nz(nDia)
DoCmd.RunCommand acCmdRefresh End Sub
MALA DIRETA (ACCESS X WORD) COM VBA
No documento Word, com este código, você não precisa procurar pelo
registro que você acabou de implantar lá no Access, isto no arquivo gerado
.mdb ou .accdb de seu projeto Mala Direta. Quando você abrir o documento,
criticará qualquer tentativa do usuário de digitar dentro do formulário e já irá
para o último registro que é o que você acabou de preencher no bd em Access.
Private Sub Document_Open()
Dim Texto As String
Texto = "POR FAVOR, NÃO PREENCHA NESTE FORMULÁRIO !!!"
MsgBox Texto, vbInformation, "MEU FORMULÁRIO"Call IrParaUltimo End Sub Sub IrParaUltimo() ' IrParaUltimo Macro ' ' ActiveDocument.MailMerge.DataSource.ActiveRecord = wdLastRecord End Sub
ALTERANDO A FONTE DE REGISTRO A CADA NOVO ANO AUTOMATICAMENTE
Se você usa uma mesma fonte de dados para o seu formulário de um aplicativo de sua empresa, um cadastro de funcionários por exemplo, não é necessário criar uma cópia, zera(r) a(s) tabela(s), isto é, ter todo esse trabalho na virada do ano. Com um simples código você pode alterar somente o ano e trocar a fonte de registro, sua tabela por outra tabela. Mas para isso você precisa criar tantas tabelas anuais quanto desejar antes de tudo. Um único trabalho, mas vai deixar você tranquilo nos próximos anos e você nem precisa estar presente para atender o seu cliente.
Exemplo: Minha tabela atual chama-se ListadeFR2013. Crio então várias tabelas para os anos seguintes: ListadeFR2014, ListadeFR2015, etc Private Sub Form_Open(Cancel As Integer)
On Error Resume Next Dim nAno As Long Dim cal As String
cal = UCase(MonthName(Month(Date), True)) 'Variável que pega o mês atual Select Case cal
Case Is = "JAN"
nAno = InputBox("Digite o novo ano OU, o ano de pesquisa OU mantenha o ano atual: ", "FR", Default:=Year(Date))
Me.RecordSource = "SELECT * FROM ListadeFR" & nAno Case Is = "FEV"
nAno = InputBox("Digite o ano de pesquisa ou mantenha o ano vigente: ", "FR", Default:=Year(Date))
MsgBox "ListadeFR" & nAno & ".", vbInformation, "FICHA DE REVISÃO" Me.RecordSource = "SELECT * FROM ListadeFR" & nAno
Case Is = "MAR"
nAno = InputBox("Digite o ano de pesquisa ou mantenha o ano vigente: ", "FR", Default:=Year(Date))
MsgBox "ListadeFR" & nAno & ".", vbInformation, "FICHA DE REVISÃO" Me.RecordSource = "SELECT * FROM ListadeFR" & nAno
Case Is = "ABR"
nAno = InputBox("Digite o ano de pesquisa ou mantenha o ano vigente: ", "FR", Default:=Year(Date))
MsgBox "ListadeFR" & nAno & ".", vbInformation, "FICHA DE REVISÃO" Me.RecordSource = "SELECT * FROM ListadeFR" & nAno
Case Is = "MAI"
nAno = InputBox("Digite o ano de pesquisa ou mantenha o ano vigente: ", "FR", Default:=Year(Date))
MsgBox "ListadeFR" & nAno & ".", vbInformation, "FICHA DE REVISÃO" Me.RecordSource = "SELECT * FROM ListadeFR" & nAno
Case Is = "JUN"
nAno = InputBox("Digite o ano de pesquisa ou mantenha o ano vigente: ", "FR", Default:=Year(Date))
MsgBox "ListadeFR" & nAno & ".", vbInformation, "FICHA DE REVISÃO" Me.RecordSource = "SELECT * FROM ListadeFR" & nAno
Case Is = "JUL"
nAno = InputBox("Digite o ano de pesquisa ou mantenha o ano vigente: ", "FR", Default:=Year(Date))
MsgBox "ListadeFR" & nAno & ".", vbInformation, "FICHA DE REVISÃO" Me.RecordSource = "SELECT * FROM ListadeFR" & nAno
Case Is = "AGO"
nAno = InputBox("Digite o ano de pesquisa ou mantenha o ano vigente: ", "FR", Default:=Year(Date))
MsgBox "ListadeFR" & nAno & ".", vbInformation, "FICHA DE REVISÃO" Me.RecordSource = "SELECT * FROM ListadeFR" & nAno
Case Is = "SET"
nAno = InputBox("Digite o ano de pesquisa ou mantenha o ano vigente: ", "FR", Default:=Year(Date))
MsgBox "ListadeFR" & nAno & ".", vbInformation, "FICHA DE REVISÃO" Me.RecordSource = "SELECT * FROM ListadeFR" & nAno
Case Is = "OUT"
nAno = InputBox("Digite o ano de pesquisa ou mantenha o ano vigente: ", "FR", Default:=Year(Date))
MsgBox "ListadeFR" & nAno & ".", vbInformation, "FICHA DE REVISÃO" Me.RecordSource = "SELECT * FROM ListadeFR" & nAno
Case Is = "NOV"
nAno = InputBox("Digite o ano de pesquisa ou mantenha o ano vigente: ", "FR", Default:=Year(Date))
Me.RecordSource = "SELECT * FROM ListadeFR" & nAno Case Is = "DEZ"
MsgBox "Aguarde a entrada do novo ano para zerar o controle...", vbExclamation, "FICHA DE REVISÃO"
nAno = InputBox("Digite o ano de pesquisa ou mantenha o ano vigente: ", "FR", Default:=Year(Date))
MsgBox "ListadeFR" & nAno & ".", vbInformation, "FICHA DE REVISÃO" Me.RecordSource = "SELECT * FROM ListadeFR" & nAno
End Select End Sub
BRINCANDO COM O LOOPING For ... Next:
1- Crie um formulário com uma caixa de texto e dê um nome a ela. 2- No ambiente de código coloque esta função:
Public Function Analise() Dim s As Integer
Dim sCripto As String
For s = 1 To Len(txtPalavra) 'txtPalavra seria o nome de sua caixa de texto sCripto = Nz(Mid(txtPalavra, s, 1))
MsgBox sCripto 'Repare o que será exibido na variável sCripto. Em seguida,
troque a variável sCripto pela variável s. Next s
End Function
Código do botão Testar: Private Sub cmdTestar_Click() Call Analise
End Sub
BRINCANDO COM COMBOBOXES
Acho que este exemplo será muito prático para quem quer aprender a filtrar com as comboboxes. Aprenda a identificar quantas ruas existem em determinado bairro e qual o bairro correspondente a determinada rua.
ATENÇÃO: Coloque o código bairro da tabela tblBairros correspondente a cada rua da tabela tblRuas na tabela tblRuas.
Coloque três comboboxes e uma caixa de texto em seu formulário. Crie duas tabelas, uma para Ruas e outra para Bairros:
tblBairros:
CodBairro - Numeração Automática - com chave primária Bairro - Texto tblRuas: CodRua - Número Rua - Texto CodBairro - Número Bairro - Texto
NOTA: Insira ruas à vontade com o seu bairro respectivo na tabela tblRuas e código de Bairro correto.
'Filtra as ruas para o bairro selecionado Private Sub cboBairros_AfterUpdate() 'Código de Eduardo Machado (Good Guy) On Error Resume Next
Dim strMsg As Integer Dim sBairro As String
sBairro = Nz(cboBairros.Column(1))
strMsg = Nz(DLookup("CodBairro", "tblBairros", "Bairro = '" & sBairro & "'")) Me.cboRuas.RowSource = "SELECT tblRuas.CodRua, tblRuas.Rua FROM
tblRuas WHERE tblRuas.CodBairro = " & strMsg End Sub
'Propriedades desta combobox:
'Origem da linha : SELECT tblBairros.[CodBairro], tblBairros.[Bairro] FROM tblBairros ORDER BY tblBairros.Bairro;
'Número de colunas: 2
'Largura das colunas: 0cm;4cm;
'Filtra o bairro para a rua selecionada Private Sub cboRuas_AfterUpdate() 'Código de Eduardo Machado (Good Guy) On Error Resume Next
Dim strMsg As Integer Dim sRua As String
sRua = Nz(cboRuas.Column(1))
Me.cboBairros.RowSource = "SELECT tblBairros.CodBairro, tblBairros.Bairro FROM tblBairros WHERE tblBairros.CodBairro = " & strMsg
End Sub
'Propriedades desta combobox:
'Origem da linha : SELECT tblRuas.codRua, tblRuas.Rua FROM tblRuas ORDER BY tblRuas.Rua;
'Número de colunas: 2
'Largura das colunas: 0cm;4cm;
'Filtra o bairro para a rua selecionada, numa caixa de texto Private Sub cboRuas2_BeforeUpdate(Cancel As Integer) 'Código de Eduardo Machado (Good Guy)
On Error Resume Next Dim sRua As String
sRua = cboRuas2.Column(1)
Me.txtBairros = DLookup("Bairro", "tblRuas", "Rua = '" & sRua & "'") 'Caixa de texto que informará o bairro correspondente a esta rua
'Propriedades desta combobox:
'Origem da linha : SELECT tblRuas.codRua, tblRuas.Rua FROM tblRuas ORDER BY tblRuas.Rua;
'Número de colunas: 2
'Largura das colunas: 0cm;4cm; End