Você está na página 1de 36

prs.Open "select * from TABELA where Data between '" & txtData.Text & "'and '" & txtData2.

Text & "'

Aprenda sobre filtragens


Apresento um breve resumo das formas mais empregadas de filtragens, com o objetivo de atender aos anseios dos menos experientes, na programao com o Access. Para reforar o assunto aqui abordado, ofereo uma vdeo-aula, com dicas importantes sobre a construo de consultas pelo VBA e disponibilizo o aplicativo Maestro, que traz inmeros exemplos prticos sobre filtragens. Consultas Seleo. As consultas seleo so empregadas no carregamento dos objetos: formulrios, relatrios, listbox e combobox. A flexibilidade em alteramos a estrutura de uma consulta pelo VBA, em tempo de execuo, nos permite elaborar solues, sem igual, para estes objetos. essencial que voc aprenda, o quanto antes, a sintaxe de consulta. Eu lhe garanto que muito simples! Estarei lhe dando uma ajudinha atravs da vdeo-aula. A sintaxe mais simples possvel para uma consulta seleo essa:
SELECT [Lista dos Campos] FROM [Nome da Tabela]; "SELECT * FROM tblClientes;"

O asterisco (*) representa todos os campos da tabela. Bom, esta consulta no nos traz benefcio algum em termos de filtragem, pois o resultado seria o mesmo que acionar diretamente tabela de clientes. Vamos supor que essa tabela de clientes tenha uns 20 campos, mas estamos precisando apenas de trs destes campos para alimentar uma combobox. Assim, montamos a consulta, somente com os campos que desejamos exibir:
"SELECT idCliente, NomeCliente, Estado FROM tblClientes;"

Temos ento, a nossa primeira forma de filtragem que a seleo de campos desejados. A clusula WHERE As consultas possuem a clusula WHERE, que nos permite utilizar critrios de filtragem para exibir registros especficos. Exemplo: Quero que a consulta exiba apenas os clientes do estado de So Paulo.
SELECT [Lista dos Campos] FROM [Nome da Tabela] WHERE [critrio de filtragem];
"SELECT idCliente, NomeCliente, Estado FROM tblClientes WHERE Estado='So Paulo';"

Observe que coloquei 'So Paulo' entre os apstrofes. uma regra da consulta, a colocao dos apstrofes ou aspas duplas, para valores do tipo string. Para valores do tipo nmero, no se pe os apstrofes. Exemplo:
"SELECT idCliente, NomeCliente FROM tblClientes WHERE idCliente=2;"

Para valores do tipo data temos que usar o cerquilha/tralha (#) . Veja o exemplo de uma consulta exibindo todos os pedidos que possuem a data de entrega maior ou igual a dois de maro de dois mil e onze:
"SELECT idPedido, fornecedor FROM tblPedidos WHERE DataEntrega >= #03/02/2011#;"

Outra questo importantssima a saber no uso de data o formato. O cdigo VBA interpreta o formato Americano (ms/dia/ano). Ento, observe que o cdigo acima est lendo dois de maro e no trs de fevereiro. Vamos supor que voc esteja utilizando o campo de um formulrio, de nome txData, como critrio de filtragem para a data na consulta:

"SELECT idPedido, fornecedor FROM tblPedidos WHERE DataEntrega >=#" & me!txData & "#;"

A data no formulrio digitada no formato (dia/ms/ano), porm preciso entreg-la ao cdigo no formato Americano (ms/dia/ano), para que o VBA leia de forma correta. Vamos supor ento que tenhamos digitado na caixa de texto do formulrio, a data 03/02/2011 (trs de fevereiro).
"SELECT * FROM tblPedidos WHERE DataEntrega >=#" & Format(me!txData,"mm/dd/yyyy") & "#;"

A funo Format() pega a data do campo do formulrio e a entrega para o VBA no formato Americano. O resultado final da consulta como vemos abaixo:
"SELECT * FROM tblPedidos WHERE DataEntrega >= #02/03/2011#;"

O VBA ir ler trs de fevereiro de dois mil e onze, como ns desejamos. Operador Between...And Uma outra forma muito empregada a filtragem por perodo (data inicial e data final). Para isso usamos o operador BETWEEN...AND. Exemplo:
filtro = "Between #" & me!txDataInicial & "# AND #" & me!txDataFinal" "SELECT * FROM tblPedidos WHERE DataEntrega " & filtro & "#;"

Como se encontra a escrita acima, voc j sabe que teremos resultados errados de filtragem, no? Claro que sabe, pois falta transformamos as datas digitadas nos campos do formulrio para o formato Americano. O correto ento :
filtro="Format(me!txDataInicial,"mm/dd/yyyy") & "# AND #" & Format(me!txDataFinal,"mm/dd/yyyy")" "SELECT * FROM tblPedidos WHERE DataEntrega Between #" & filtro & "#;"

Concatenao Alguns de vocs devem estar se perguntando o que significa o smbolo & na estrutura da consulta. Significa concatenao (unir). Usamos este smbolo quando estamos juntando uma sintaxe escrita do VBA com um valor originrio de um campo de formulrio ou originrio de uma varivel.
Sintaxe final da consulta = [sintaxe parcial] & [varivel ou campo do formulrio] & [sintaxe parcial]

Estas junes costumam dar "dores de cabea" para os programadores mais novos, pois qualquer "bobeada" provoca uma "m" formao da sintaxe, acarretando numa mensagem de erro no momento da sua execuo. Com a vdeo-aula voc aprender como solucionar estes erros, rapidamente. Uso do operador LIKE O LIKE o operador mais apropriado para comparar valores do tipo texto, permitindo no s especificar cadeias de texto idnticas, mas tambm semelhantes, pois existem alguns caracteres especiais que funcionam como "curingas". Exemplos:
"SELECT idCliente, NomeCliente, Estado FROM tblClientes WHERE Estado Like 'So Paulo';"

A consulta acima retorna somente os registros dos clientes residentes no estado de So Paulo.
"SELECT idCliente, NomeCliente, Estado FROM tblClientes WHERE Estado Like 'pa*';"

J nesta outra consulta, observamos a incluso do caractere asterisco (*) que permite traduzir a declarao nos seguintes termos: Retorna todos os clientes residentes nos estados, comeando com "pa", no importando o que venha depois de "pa" (Par, Paraba e Paran).
"SELECT idCliente, NomeCliente, Estado FROM tblClientes WHERE Estado Like '* do *';"

A consulta acima, retorna somente os registros dos clientes residentes nos estados que possuam " DO " no nome ( Rio Grande DO Norte, Rio Grande DO Sul e Mato Grosso DO Sul ). O uso do LIKE muito empregado na prtica, principalmente em consultas dinmicas. Aquelas em que, medida que se vai digitando, vai se obtendo o resultado. No deixe de observar o uso dos apstrofes ( ' ), j que estamos tratando de valores do tipo string. Usando o Operador IN Determina se o valor de uma expresso igual a algum dos vrios valores de uma lista especificada. Exemplo:
filtro = "IN('So Paulo', 'Paran', 'Rio de janeiro')" "SELECT idCliente, NomeCliente, Estado FROM tblClientes WHERE Estado " & filtro & ";"

Retorna somente os registros dos clientes residentes nos estados de So Paulo, Paran e Rio de janeiro. As propriedades RowSource e RecordSource A propriedade RowSource nos permite alimentar as combobox e as listbox com as consultas. Exemplo de uma consulta, via cdigo, alimentando uma combobox, pelo evento "Ao receber foco":
Private Sub cboClientes_GotFocus() Dim strSql As String
strSql = "SELECT idCliente, NomeCliente FROM tblClientes WHERE Estado='So Paulo';"

Me!cboClientes.RowSource = strSql End Sub

Para alimentar os formulrios e relatrios usada a propriedade RecordSource. Exemplo de uma consulta, alimentando um relatrio, pelo evento "Ao abrir" do relatrio:
Private Sub Report_Open(Cancel As Integer) Dim strSql As String strSql = "SELECT * FROM tblClientes WHERE Estado='So Paulo';" Me.RecordSource = strSql End Sub

Uso das propriedades Filter e FilterOn dos objetos formulrio e relatrio. Vamos imaginar um relatrio de cadastro de clientes, que tem como origem dos dados, a tabela tblClientes. Se abrirmos pura simplesmente o relatrio, todos os registros sero carregados, pois no h qualquer tipo de filtragem. Porm, podemos aplicar a propriedade filter ao abrir o relatrio, para obtermos os registros especficos desejados. No exemplo abaixo, o relatrio ir exibir somente clientes de So Paulo.
Private Sub Report_Open(Cancel As Integer) Me.filter = "Estado='So Paulo';" Me.filterOn = true End Sub

A propriedade filter uma expresso de seqncia de caracteres que consiste em uma clusula WHERE sem a palavra-chave WHERE. FilterOn = true aplica a filtragem e FilterOn=false retira a filtragem. A propriedade filter amplamente utilizada nos casos aonde necessitamos filtrar subformulrios, baseada em um campo do formulrio principal. Veja no exemplo abaixo, um cdigo que filtra um subformulrio(sfrmClientes) medida que se digita em uma caixa de texto (txCliente) do formulrio principal:
Private Sub txCliente_Change() Dim filtro As String If Len(Me!txCliente.Text & "") = 0 Then 'Se no h nada digitado, remove o filtro Me!sfrmClientes.Form.Filter = "" Me!sfrmClientes.Form.FilterOn = False Exit Sub End If filtro = "[NomeDoCliente] like '*" & Me!txCliente.Text & "*'" Me!sfrmClientes.Form.Filter = filtro Me!sfrmClientes.Form.FilterOn = True End Sub

Clusula WHERE do comando de ao DoCmd.ApplyFilter Este comando de filtragem aplicado em formulrios e em relatrios que possuem o foco. Por exemplo, no cadastro de clientes, do aplicativo Maestro, tem uma combobox aonde se seleciona o cliente de interesse para a exibio do seu respectivo cadastro. Veja na figura abaixo:

Ao selecionar o cliente, o evento "Aps atualizar" da combobox disparado e a filtragem do registro feita, aplicando-se o comando DoCmd.ApplyFilter. usado no critrio de filtragem do comando, o nmero exclusivo do cliente selecionado, que se encontra na primeira coluna (oculta) da combobox.
Private Sub cboConsulta_AfterUpdate() DoCmd.ApplyFilter , "idcliente = " & Me!cboConsulta.Column(0) Me!cli_Nome.SetFocus Me!cboConsulta = Null End Sub

Note que h um boto ao lado da combobox que para a remoo do filtro, se for preciso.
Private Sub btRemoverFiltro_Click() DoCmd.RunCommand acCmdRemoveFilterSort '----------------------'Ou DoCmd.ShowAllRecords '----------------------Me!cboConsulta.SetFocus End Sub

Clusula WHERE dos comandos de ao DoCmd.Openform e DoCmd.OpenReport. Ao solicitarmos a abertura de um formulrio ou de um relatrio, podemos, simultaneamente, definir uma filtragem a ser aplicada e isso amplamente utilizado. Eu abuso desta opo. Imagine uma caixa de listagem, com uma lista de pedidos. Desejamos que, ao se dar um duplo clique em um dos pedidos da lista, se abra o formulrio de pedidos, no registro correspondente.
Private Sub Lista_DblClick(Cancel As Integer) Docmd.OpenForm "frmPedidos",,,"NumeroPedido = " & Me!Lista.column(1) End Sub

Outra situao muito comum querer imprimir ou visualizar um relatrio, correspondente ao cadastro que se est alterando naquele momento.
Private Sub btImprimir_Click() 'Salva as alteraes do cadastro para se refletir no relatrio Docmd.RunCommand acCmdSaveRecord 'Abre o relatrio, filtrado pelo nmero exclusivo do cliente
DoCmd.OpenReport "rltCadastroCliente",acViewPreview,,"idCliente = " & me!idCliente

DoCmd.Maximize End Sub

Critrios de filtragem das funes DLookup(), Dsum(), Dcount() e outras Saber aplicar filtros nestas funes fundamental , porm nada difere do que voc viu at agora. Vamos supor que seja preciso capturar o Preo de Custo de um PenDrive , cdigo pd8gb, que se encontra na tabela de estoque. Podemos capturar valores com a funo Dlookup()
PreoVenda = Dlookup("PreoCusto","tblEstoque","Cdigo = 'pd8gb'") * 1.35

Um uso prtico para a funo DCount() de investigar se h registro(s) presente(s) em uma determinada tabela. O exemplo abaixo investiga se o cliente que est sendo cadastrado, j se encontra registrado na tabela. A lgica : se a funo Dcount() contar 1 ou maior que 1 , o registro existe.
Private Sub NomeCliente_BeforeUpdate(Cancel As Integer)
If DCount("IdCliente","tblClientes","NomeCliente = '" & me!NomeCliente & "'") > 0 then

MsgBox "O Cliente " & Me!NomeCliente & " j existe..." Me.Undo Cancel = True End If End Sub

Imagine que voc agora precise somar as despesas de Luz pagas de um Contas a Pagar, no ano de 2011. A funo Dsum() resolve a questo de forma bem simples.
ValorLuz = Dsum("ValConta","tblContasPagas","TipoConta='Luz' And Year(DataPagamento)=2011")

A questo central voc saber aplicar corretamente o critrio de filtragem.

Para ampliar o seu conhecimento O Access possui uma centena de funes prontas, que solucionam a maioria de casos do cotidiano e voc no pode deixar de, pelo menos, saber que existem. O conhecimento destas funes ir ampliar significativamente o seu potencial para montagem desses critrios de filtragem. Algumas destas funes que foram utilizadas aqui no artigo : Format() Year() Dlookup() Dcount() Dsum() Aprenda aonde conhecer todas estas funes no Access aqui. Arquivo exemplo Ofereo o aplicativo Maestro v.2 que possui uma srie de exemplos, empregando as tcnicas de filtragem, aqui apresentadas.

Para entrar na estrutura do Maestro (Maestro_v2.accdb), basta manter pressionada a tecla SHIFT na inicializao. Senha do usurio admin > admin Senha do usurio Avelino > 1234 Senha do Maestro_v2_be.accdb (tabelas) > a1234
Baixe aqui o arquivo exemplo

Nesta vdeo-aula voc ir aprender: Como utilizar o MODO SQL para analisar as consultas criadas no ambiente grfico. Identificar os erros mais comuns, cometidos na construo do critrio de filtragens das consultas. Como construir uma Combobox para filtragens, usada em um formulrio de cadastro. Como utilizar o PONTO DE INTERRUPO no VBA, para detectar erros nos cdigos.

Como EXIBIR a vdeo-aula em tela cheia? 1. Clique na seta executar da tela abaixo para iniciar a exibio do vdeo; 2. D dois cliques rpidos na tela, quando o vdeo comear a ser exibido.

Os dez artigos mais visitados Referenciar objetos Forms e Reports e s suas propriedades MontaRibbons v.4.0 - Assistente completo para criar ribbons no Access Vdeo - Controle personalizado de Acesso de Usurios Vdeo - Segurana mxima, usando o OPEN Gerar 1 milho de registros para realizao de testes em rede Vdeo - Criando Ribbons parte 1 - Conhecendo a estrutura Xml

Vdeo - Programao de relatrios - Parte 1 Vdeo - Aprenda sobre filtragens Uma ajuda para quem est comeando um negcio ou um projeto Vdeo - Segurana, desempenho e produtividade com o PROTEC | Home | Vdeos-aulas | Tutoriais | Dicas | Blog | Downloads | Contato | Artigo |

117 comentrios
James Resplandes 07/04/2011 19:20:19 Muito bom artigo, parabns! Voc, como sempre, contribuindo para o crescimento dessa fantstica ferramenta de aprendizagem. Mrcio Melo - RJ 07/04/2011 21:57:32 Gostei muito desse artigo, da forma que elaborou, passou segurana em trabalharmos com o sql no VBA, onde tenho evitado... por muitas vezes apanhei em finalizar a escrita sql que se modifica do gerado pelo construtor para o utilizado no VBA. Utilizo de um projeto que existe na net desde a verso 2k e funciona em todas acima o FrmGerReports, segue o link http://www.ativoaccess.com.br/mostra.exemplo.php?aplicativo=277 , de uma analisada, adaptei aos meus projetos, pessoal do site so nota 10 e tem sua mesma filosofia em ensinar, s que agora esto oferecendo o material que antes era de livre acesso, mais vale apena, foram as minhas fontes de aprendizagem no passado que utilizo at hoje. Forte abrao! WELSON ZEFERINO DE OLIVEIRA JUNIOR 07/04/2011 22:21:35 Estou contando nos dedos as suas aulas de vba, vc iluminado por Deus. Que sua sabedoria venha crescer a cada dia. Agradeo muito por ter voc como meu professor, suas aulas tem mudado a minha vida como futuro programador, obrigado. Fbio Bind - Manaus/AM 08/04/2011 16:40:19 Parabns Avelino, voc nota 1000!!! Seus tutoriais e materiais publicados esto me ajudando muito... essa matria sobre consultas est simplesmente PERFEITA. Francisco Sene 10/04/2011 12:04:10 Excelente. Sou novato neste mundo "Access" apesar dos meus 50 anos. Sou professor de Matemtica e quero registrar que a sua didtica e o seu material so muito eficazes. Penso que todos que tiverem dificuldades com o Access deveriam assistir algumas aulas com voc. Parabns e Obrigado. Avelino Sampaio 11/04/2011 04:17:29 Fico muito grato pelo depoimento de vocs. GILBERTO TEIXEIRA 13/04/2011 16:23:49 boa tarde avelino, como fao para enviar sendkey no windows 7 Avelino Sampaio 14/04/2011 09:48:58 Gilberto, Use o do wscript. exemplo: Dim objws As Object Set objws = CreateObject("wscript.shell") objws.SendKeys fncCapturaSenha, True objws.SendKeys "{ENTER}"

Sucesso Mrcio 15/04/2011 16:09:16 Parabns Avelino! Grande iniciativa. No caminhei muito, pois o formulrio clientes no abre. Informe que o acesso est bloqueado. O que devo fazer para resolver isso e continuar a vdeo-aula. Parabns mais uma vez! Avelino Sampaio 15/04/2011 16:33:52 Mrcio, V no evento "Ao carregar" do formulrio clientes e desabilite a linha: 'Call fncPermisses(Me) Bom estudo Ivan 23/04/2011 14:14:36 Boa tarde Avelino, tenho um aplicativo baseado no access 2007, com cadastros e informaes de clientes, e sempre tenho que cadastrar novos clientes. Gostaria de saber a seguinte: No formulario para entrar com novo cliente, preciso digitar as informaes, Razao Social, CNPJ etc, queria saber se quando eu digitar o CEP, e der um TAB as informaes de Rua, Bairro, Cidade e UF, se preencham automaticamente nos campos a elas relacionados, possivel fazer isso e como fao? Avelino Sampaio 25/04/2011 06:42:57 Ivan, Veja no frum abaixo um tpico sobre este assunto. L tem um exemplo prtico. http://maximoaccess.maisforum.com/t1624-resolvidobusca-cep-no-formulario-do-access-2007 Bom estudo Johnny Cardoso 25/04/2011 11:38:02 Avelino, quero partilhar com voc e demais programadores uma implementao que fiz em meu sistema: ComboBox com Evento para filtrar um caractere ou um conjunto de caracteres em um consulta SQL. ' Descrio da Funo: ' Carregar dados de tabela na combo e filtrar conforme digita na combo ' Filtra por juno de caracteres, retornando todos + conjunto j digitado + todos ' Se tiver Johnny, carlos e elton John na lista, ao digitar joh, retornar o primeiro e ltimo registro. ' Filtra por radical da lista --------------No seu formulrio, crie uma Combobox com nome Combo0 ou outro qualquer. Lembre-se de alterar nos eventos Em propriedades, configure o tipo de origem da linha para Tabela/Consulta e a Origem da linha como: SELECT Tabela.cd_cliente, Tabela.nm_cliente FROM Tabela ORDER BY Tabela.nm_cliente;

Nota: A ordem de classificao fica a critrio seu. ------------------------------No evento da combo0, Ao alterar (change) insira o cdigo abaixo: Private Sub Combo0_Change() ' Descrio da Funo: ' Carregar dados de tabela na combo e filtrar conforme digita na combo ' Filtra por juno de caracteres, retornando todos + conjunto j digitado + todos ' Se tiver Johnny, carlos e elton John na lista, ao digitar joh, retornar o primeiro e ltimo registro. ' Filtra por radical da lista Dim strText, strFind, strFind2 ' strText-Retorna o valor da Combo ' strFind-Retorna o valor do conjunto j digitado ' strFind2-Junta a clausula WHERE ao valor do conjunto j digitado strText = Me.Combo0.Text If Len(Trim(strText)) > 0 Then ' Mostra a lista com os registro que contenham o conjunto j digitado ' Cria uma expresso de consulta SQL com string para clausula WHERE do SQL que retorna os dados da tabela strFind2 = "nm_cliente Like '*" For I = 1 To Len(Trim(strText)) If (Right(strFind, 1) = "*") Then strFind = Left(strFind, Len(strFind) - 1) End If strFind = strFind & Mid(strText, I, 1) & "*" Next strFind2 = strFind2 & strFind & "'" strsql = "SELECT Tabela.cd_cliente, Tabela.nm_cliente FROM Tabela where " & strFind2 & " ORDER BY Tabela.nm_cliente;" ' Filter os registros da combo list utilizando a nova consulta sql Me.Combo0.RowSource = strsql Else ' Seno, mostra a lista com todos os registros strsql = "SELECT Tabela.cd_cliente, Tabela.nm_cliente FROM Tabela ORDER BY Tabela.nm_cliente; " Me.Combo0.RowSource = strsql End If ' Abre a lista do combobox para mostrar os registros filtrados Me.Combo0.Dropdown End Sub NOTA: Este procedimento apenas est filtrando os registros. Para utilizar esses dados filtrados para carregar um registro em um formulrio ou subformulrio, ou para consultas ou outro evento, faa as modificaes necessrias. -------------------------------

No evento da combo0, Ao apertar tecla (keydown) insira o cdigo abaixo: Private Sub Combo0_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 27 Then 'Se pressionou tecla ESCAPE ento carrega a lsita completa da consulta strsql = "SELECT Tabela.cd_cliente, Tabela.nm_cliente FROM Tabela ORDER BY Tabela.nm_cliente; " Me.Combo0.RowSource = strsql Me.Combo0 = Null 'Limpa a combo End If End Sub Luis Antonio 30/04/2011 01:52:12 Gostaria de compatilhar com vocs um sistema que criei inspirado nesta aula. Trata-se de um sistema de filtragem comandado por dois botes de alternncia. Quando eu clico no botao1 se filtra por um critrio, ao clicar no boto2 se filtra por outro critrio. Um boto quando marcado desmarca o outro. Private Sub Botao2_Click() If Me.Botao2 = True Then Me.Filter = "CD4_CV=yes" Me.Botao = False Me.FilterOn = True ElseIf Me.Botao2 = False Then Me.Filter = "CD4_CV=yes" Me.Botao = True Me.FilterOn = False End If End Sub Private Sub Botao_Click() If Me.Botao = True Then Me.Filter = "CVCriaExposta=yes" Me.Botao2 = False Me.FilterOn = True ElseIf Me.Botao = False Then Me.Filter = "CVCriaExposta=yes" Me.Botao2 = True Me.FilterOn = False End If End Sub Ivan Allessi 31/05/2011 21:13:50 Boa noite Avelino, Tenho um formulario com dados de clientes, alguns campos so bloqueados e o usuario no pode fazer alteraes neles, porem quando o usuario vai cadastrar um novo cliente, abre-se um um outro formulario para entrada de dados. Gostaria de saber o seguinte: Se posso bloquear esses campos para alterao via cdigo, e libera-los quando o usuario clicar no boto NOVO CLIENTE (inserir um novo registro) para que ele possa fazer a entrada de dados no mesmo formulario? Desde j agradeo.

Avelino Sampaio 01/06/2011 03:45:56 Ivan, perfeitamente possvel montar essa programao. S no ficou claro se vc est querendo descartar a abertura de um outro formulrio, ou seja, usar o prprior formulrio de clientes para incluso do novos clientes. Entre em contato, atravs da seo contato do site, e me esclarea melhor, para eu te oferecer uma soluo. No aguardo Juan 05/07/2011 16:57:54 Avelino, Muito Obrigado pelos seus ensinamentos. Voc Show! ainda no tinha aprimorado meu sisteminha com essas ferramentas por achar que era coisa de outro mundo. Excelente Material. Adilson Calixto dos Santos 20/07/2011 18:03:43 TENHO A SEGUINTE FUNO NO ACCESS PARA CALCULAR A IDADE DE UM CANDIDATO, S QUE MEU BD EST EM SERVIDOR DE REDE E EXECUTO O BD NO CLIENTE, DESENVOLVENDO O BD. A SEGUINTE FUNO CALCULAVA A IDADE DO CANDIDATO NORMALMENTE E CORRETAMENTE, S QUE PASSEI O BD PARA O SERVIDOR E FICO DESENVOLVENDO DO PC CLIENTE. AGORA QUE ESTOU MANIPULANDO O BD DO LADO DO CLIENTE ELE NO CALCULA MAIS A IDADE. O QUE FAO. PODEM ME AJUDAR. Public Function IdadeAnos(valor1 As Date, valor2 As Date) As Long IdadeAnos = DateDiff("yyyy", valor1, valor2) If Format(valor1, "mmdd") > Format(valor2, "mmdd") Then IdadeAnos = IdadeAnos - 1 End If End Function Avelino Sampaio 21/07/2011 06:50:12 Adilson Esta sua funo funciona aqui comigo. Da verso 2003 em diante o VBA do Access vem desabilitado. Para que o cdigo funcione necessrio ento desabiltar a macro de segurana. Vc fez isso ? Qual a verso do seu Access ? IVAN ALLESSI 31/07/2011 10:07:57 Boa tarde Avelino,

Quero Filtrar usando os campos "Processo", "Data", e "Vendedor" juntos, mais na data no esta dando resultado nenhum, Se eu colocar um Valor no Campo "Processo" e no "Vendedor" ele filtra tudo certinho, mais se eu colocar a data no funciona. Quando eu coloco s a data ai ele filtra.(Tanto faz pelo Ano, Ms, Dia, ele retorna filtrando os registros tudo certinho) Meu problema que se eu colocar os valores nos 3 campos no filtra nada, J tentei de varias formas e n consigo resolver, acho que um problema na escrita da funo, j quebrei a cabea um monte. Abaixo segue o cdigo, se puderes me ajudar agradeo. Option Compare Database Dim j As Byte Dim filtroLista As String Private Sub fncCarregalista(Optional filtro As String, Optional ordem As String) Dim strSql As String strSql = "SELECT Cdigo, Processo, Data, Codigo, Cliente, Zona, Vendedor, Valor, Motivo" strSql = strSql & " FROM GarantiaDevolucao WHERE " & filtro strSql = strSql & " ORDER BY Data;" Me!Lista.RowSource = strSql filtroLista = filtro End Sub ---------------------------------------------------------------------------------Private Sub tx_Change() Dim filtro As String j=0 If Len(Me!tx.Text & "") > 0 Then j = j + 1 If Len(Me!tx1 & "") > 0 Then j = j + 2 If Len(Me!tx2 & "") > 0 Then j = j + 3 Select Case j Case 0 filtro = "Cdigo > 0" Case 1 filtro = "Data like '*" & Me!tx.Text & "*'" Case 2 filtro = "Processo like '*" & Me!tx1 & "*'" Case 3 filtro = "Vendedor like *" & Me!tx2 & "*" Case 4 filtro = "Processo like '*" & Me!tx1 & "*' AND Data like '*" & Me!tx.Text & "*'AND Vendedor like '*" & Me! tx2 & "*'" End Select Call fncCarregalista(filtro) End Sub Private Sub tx1_Change() Dim filtro As String j=0 If Len(Me!tx1.Text & "") > 0 Then j = j + 1 If Len(Me!tx & "") > 0 Then j = j + 2 If Len(Me!tx2 & "") > 0 Then j = j + 3 Select Case j Case 0 filtro = "Cdigo > 0" Case 1 filtro = "Processo like '*" & Me!tx1.Text & "*'" Case 2

filtro = "Data like *" & Me!tx & "*" Case 3 filtro = "Vendedor like *" & Me!tx2 & "*" Case 4 filtro = "Processo like '*" & Me!tx1.Text & "*' AND Data like '*" & Me!tx & "*'AND Vendedor like '*" & Me! tx2 & "*'" End Select Call fncCarregalista(filtro) End Sub Private Sub tx2_Change() Dim filtro As String j=0 If Len(Me!tx2.Text & "") > 0 Then j = j + 1 If Len(Me!tx & "") > 0 Then j = j + 2 If Len(Me!tx1 & "") > 0 Then j = j + 3 Select Case j Case 0 filtro = "Cdigo > 0" Case 1 filtro = "Processo like '*" & Me!tx1.Text & "*'" Case 2 filtro = "Data like *" & Me!tx & "*" Case 3 filtro = "Vendedor like *" & Me!tx2 & "*" Case 4 filtro = "Processo like '*" & Me!tx1 & "*' AND Data like '*" & Me!tx & "*' AND Vendedor like '*" & Me! tx2.Text & "*'" End Select Call fncCarregalista(filtro) End Sub Avelino Sampaio 31/07/2011 11:15:29 Ivan, A combinao dos trs campos para filtragem o case 6(1+2+3) e no 4 Case 6 filtro = "Processo like '*" & Me!tx1 & "*' AND Data like '*" & Me!tx.Text & "*'AND Vendedor like '*" & Me! tx2 & "*'" CASE 4 e CASE 5 seria para o uso simultnea de dois campos. Sucesso! Ivan Allessi 31/07/2011 13:48:40 Fiz a Mudana, funcionou apenas se preencher os tres campos ai ele filtra tudo certo, mais se eu quiser s preencher o campo Processo e Data ou Data e Vendedor ai no funciona. Avelino Sampaio 01/08/2011 05:13:16 Ento amigo Ivan, esta faltando vc montar os "Cases" 4 e 5

Marcelo David 23/08/2011 01:21:39 Ol, Avelino, este artigo est demais!! Parabns Luciano Andrade 29/11/2011 01:53:46 Ol Avelino, Com relao ao trecho de cdigo, onde voc mostrou como abrir um formulrio ao dar um duplo click em um pedido numa caixa de listagem: Private Sub Lista_DblClick(Cancel As Integer) Docmd.OpenForm "frmPedidos",,,"NumeroPedido = " & Me!Lista.column(1) End Sub H mais alguma coisa a ser feita no formulrio que ir se abrir? Pois criei um form com campos para alterao de dados de uma tabela. Quando tento chamar este mesmo formulrio por outro form usando a linha: DoCmd.OpenForm "frmAlteraDados3", , , "txtNome = " & Me!cxLista.Column(1) Recebo uma mensagem do access dizendo que est faltando argumentos nesta mesma linha. No access o trecho de cdigo que estou usando este: Private Sub cxLista_DblClick(Cancel As Integer) If Not IsNull(Me.cxLista) Then DoCmd.OpenForm "frmAlteraDados3", , , "txtNome = " & Me!cxLista.Column(1) End If End Sub Se puder me dar uma luz, ficaria muito grato, e desde de j obrigado pela ateno! Avelino Sampaio 30/11/2011 05:56:50 Luciano, quando se utiliza valores do tipo string na filtragem obrigatrio o uso do apstrofe. Exemplo: DoCmd.OpenForm "frmAlteraDados3", , , "txtNome = '" & Me!cxLista.Column(1) & "'" Sucesso! Juan 30/11/2011 16:15:04 Ol Avelino, Como faria no "frmFiltraFormContinuo", ao d um duplo clique sobre um registro ele passe os dados de uma coluna para um campo em um form que j est aberto? desde j agradeo. Luciano Andrade 30/11/2011 22:32:01 Obrigado Avelino, vou fazer as devidas modificaes! :) Ricardo 03/01/2012 12:11:45

Ol, O seu site muito bom. Para quando as Video-Aulas de VBA? Avelino Sampaio 04/01/2012 08:36:33 Ricardo, no tenho uma previso para o curso do VBA mas estou lutando muito para que sai em breve. Sucesso! Paulo_CWB 09/01/2012 11:03:07 Bom dia, Por muitos anos usei Access 97. Atualmente, estou fazendo um novo aplicativo em Access 2010. Uso back-end com senha para as tabelas e front-end para as interfaces. Em meu computador em casa, uma consulta SQL no OpenRecordset funcionou perfeitamente. J no PC da empresa, apresenta o problema de "senha invlida", erro 3101. O restente do aplicativo funciona OK tanto em casa quanto no trabalho, acessando o banco, etc. Sempre usei essa configurao. Mas, nessa consulta SQL do Access 2010, t dando esse erro. Alguma sugesto? Set dbs = OpenDatabase("J:\1Tcc\##1_TR\CALC_be.accdb") Set rst = dbs.OpenRecordset("select KEY_WIRE_CO, DIAM_WIRE_CO, PRICE_WIRE_CO from WIRE_CO "_ & "where KEY_WIRE_CO = " & DP1_COMBO & ";") Agradeo. Avelino Sampaio 09/01/2012 13:05:30 Paulo, Acrescente a senha no comando de abertura do BD. Set dbs = OpenDatabase("J:\1Tcc\##1_TR\CALC_be.accdb", False, False, ";PWD=senhaDoBd") Sucesso! Renner 10/01/2012 12:20:22 Ol Avelino, meus parabns pelo site!!! Tenho um BD onde controlo as autorizaes para dirigir dos meus funcionarios, nele aps preecher todos os dados eu imprimo a "autorizao" como se fosse um crach. Porm, s consigo imprimir um por vez ou todos de uma vez. Gostaria de saber se existe um metodo onde eu possa imprimir os crachs dos funcionrios que desejo Ex. 123, 553, 372 Conto com seu apoio. Avelino Sampaio 10/01/2012 13:23:34

Renner, estude sobre o operador IN. Exemplo: Docmd.OpenReport "NomeRelatrio", acViewPreview , ,idFuncionario in (123,553,372) Acesse meu tutorial sobre "programao de relatrios" e baixe o arquivo exemplo. Tem um exemplo que tem uma lista de frutas e usa o operador IN para imprimir o selecionado. Sucesso! Renner 10/01/2012 15:30:49 Consegui Avelino.... Fiz assim: DoCmd.OpenReport "Cracha",acViewPreview ,,"registro IN(" & Me.cxregistro & ")" Muito obrigado pela ajuda, j fazia tempo que estava procurando uma maneira de fazer isso mas ningum tinha comentado sobre o operador IN. Mais uma vez, muito obrigado!!! Paulo_CWB 12/01/2012 23:17:01 Boa noite Avelino, Esqueci de agradecer a ajuda e avisar que realmente funcionou aps sua sugesto de acrescentar a senha no comando de abertura. Uma outra dvida agora: Instalei eu uma mquina para rodar via Access Runtime. Tenteui rodar o arquivo .ACCBE ou ACCDR, mas no vai. Com access runtime, s roda o .ACCDB. Pelo menos nessa maquina que testei. (runtime do 2010). Alguma sugesto? Obrigado. Avelino Sampaio 16/01/2012 08:54:09 Paulo, crie um atalho para rodar o aplicativo em questo. Se ainda assim pelo atalho no abrir, acrescente a linha de chamada do atalho o "/runtime". exemplo: DESTINO: C:\Maestro\Maestro_v2.accdr /runtime Sucesso! Atila Brasil 16/01/2012 17:39:57 Boa tarde Avelino! Realmente os filtros do BD Maestro e seu video-aula sobre filtros ~foram muito bem produzidos. Parabns!

Atila Brasil 16/01/2012 17:51:07 Boa tarde Avelino! Pretendo abrir um relatrio j filtrado a partir de critrios definidos em 3 grupos de opo que esto num formulrio, pesquisei em diversos fruns e sites, contudo no encontrei um modelo ou um exemplo no qual eu conseguisse entender e aplicar ao meu bd de contas a pagar. Como proceder? Muito obrigado Avelino Sampaio 17/01/2012 09:59:50 Atila, crie um BD exemplo com os 3 grupos mais o relatrio e envie para o meu email (zipado), para eu montar o modelo de filtragem. meu email: avelino(arroba)usandoaccess(ponto)com(ponto)br No aguardo Marcos Oliveira 17/01/2012 16:16:47 Ol Avelino, Como coloco um "boto de alternancia" para rodar. Tenho a necessidade de saber quando uma conta foi cancelada ou esta ativa. gostaria de colocar um boto de alternancia com cores diferentes tipo; ativo(VERDE) cancelado(VERMELHO) e gostaria que esta informao ficasse gravado nos status de cada cliente meu individualmente. Pode me ajudar !!!???? Muito obrigado !!! Nelinho 17/01/2012 16:20:33 Boa Tarde Amigos estou com um problema de principiante estou tentando obter uma informao em uma tabela que est vinculada no Access 2007 vinculada ao OBDC na maquina que eu trabalho eu tenho acesso as tabelas consigo visualizar consigo buscar os dados necessrios para as necessidades do Diretor do Hospital mais quando vou criar um campo para fazer uma pesquisar e da pesquisar gerar um relatrio no consigo. E nesta tabela eu no posso editar os dados s pesquisar e visualizar os seus dados. Esta minha tabela os dados que eu preciso para a pesquisar, que so dois modos e resulta em uma grid trazendo os dados referente ao solicitado. O que fazer estou precisando muito da ajudada do amigo do amigo voc pode mim ajudar? Estou com o prazo vencido preciso destas informaes o mais urgente possvel, obrigado a todos. Meu email nelinhor@hotmail.com Atenciosamente, Avelino Sampaio 18/01/2012 07:07:58

Marcos, V na seo CONTATO e me passe seu email que lhe enviarei um exemplo. No aguardo Avelino Sampaio 18/01/2012 07:10:31 Nelinho, Monte o seu relatrio sem qualquer filtragem. Estando montado e funcionando, vc ento aplicar a filtragem atravs do boto que chama pelo relatrio. Exemplo: docmd.OpenReport "NomeDoRelatrio",acViewPreview ,,"NomeDoCampo ='" & me!NomeCampoPesquisa & "'" Sucesso! MARCIO MELO - RJ 08/02/2012 18:32:24 Muito show esse procedimento de filtragem, passei usar em algumas parte dos meus bd's, gostei muito, prtico e eficiente e no sobrecarrega o formulrio, esse tipo de artigos so muito importantes, sensacional rsrs... Sou mais Brasil! Misael Ferreira 09/02/2012 01:22:49 Quero fazer um filtro para imprimir relatrio, j coloquei critrio na consulta, porm, quero filtrar s um campo ou mais de um. Quando coloco o critrio na consulta s para um campo da certo, ou para todos os campos, porm quando quero filtrar s 3 campos dos 10 existentes a o relatrio no traz nada. Agradeo se algum poder me ajudar. Meu e-mail:Iscar@dana.com Obrigado! Marcos Aurlio 14/02/2012 00:09:32 Primeiramente quero parabenizar pela iniciativa, muito bom o site os contedos maravilhosos e as video aulas show de bola... Queria muita uma ajuda, eu no estou conseguindo fazer uma pesquisa como critrio um combo.cliente por intervalo entre datas, como no exemplo maestro filtros, essa consulta a origem de dados vem de uma outra consulta e no de uma tabela. possivel fazer? Queria muito sua ajuda. Avelino Sampaio 14/02/2012 08:15:05 Marcos, possvel fazer sim mas preciso que me envie um BD exemplo ou imagem da sua consulta ou cdigo que esta usando para que eu possa analisar. Entre em contato pelo meu email: avelino(arroba)usandoaccess(ponto)com(ponto)br Daelson Rum0 01/03/2012 08:29:19 Prezados;

Bom Dia. Estou criando um BD, e preciso criar um relatrio que mostre apenas os dados de um determinado periodo, s que pela consulta no consigo criar o critrio necessrio. Criei uma consulta onde tem um capo DataExecuo, e pretendo filtrar os dados do periodo entre ex.: do dia 26 do ms anterior at o dia 25 do ms atual. Como posso criar esse critrio na consulta ou VB relatrio, Desde j agradeo a ateno, fico Aguardando retorno. Avelino Sampaio 01/03/2012 15:52:31 Daelson, experimente este critrio no campo DataExecuo: Entre DataSerial(Ano(Data());Ms(Data())-1;26) E DataSerial(Ano(Data());Ms(Data());25) Sucesso! Carlos Bastos 07/03/2012 15:42:31 Primeiramente quero parabeniza-lo pelo site. Avelino estou iniciando no VBNET , trabalho com clipper ha muitos anos e estou estudando o VB. Estou com uma dvida, como consigo colocar num List Box mais de um campo que tenho no meu Banco Access ? Seria algo como uma consulta , onde eu teria os campos MAT, NOME e IDADE. At o momento s consigo colocar um campo em cada List Box especfica. Antecipadamente agradeo sua atenco. Avelino Sampaio 07/03/2012 15:48:42 Carlos, abra a lista de propriedades da listBox e determine o nmero de colunas. No caso 3. Pode determinar tambm a largura de cada coluna. Sucesso! Carlos Bastos 07/03/2012 21:50:39 Obrigado pela rapidez em que me respondestes. Avelino eu ja tinha visto esta propriedade , acontece que eu nao sei como concatenar os tres campos ... Eu estou movendo para list dessa forma , ou seja um campo para cada list. LstNome.Items.Add(leitura("NomFun")) LstMat.Items.Add(leitura("MatFun")) LstSal.Items.Add(leitura("SalFun")) Como mover os tres para a mesma list ? Desculpe chatea-lo com essa pergunta que deve ser primria, mas os dois livrpos que comprei de vb nao explicam isso.

Tenha uma tima noite Avelino Sampaio 08/03/2012 05:36:56 Carlos, eu no sei como funciona o mecanismo no VB. No VBA usamos o ponto e virgula para separar as colunas. Exemplo: Me!NomeDaLista.AddItem ("Valor da coluna 0" & ";" & "valor da coluna 1" & ";" & "valor da coluna 2") Experimente algo como: lstFun.items.add(leitura("NomFun") & ";" & leitura("MatFun") & ";" & leitura("SalFun")) Sucesso! Carlos Bastos 08/03/2012 14:38:04 Parceiro, boa tarde. Mais uma vez obrigado, funcionou como eu queria. Abraos Gilmar Ribeiro da Silva 14/03/2012 10:33:54 No exemplo acima: Private Sub Report_Open(Cancel As Integer) Me.filter = "Estado='So Paulo';" Me.filterOn = true End Sub Quando executo este evento num sub relatrio, o Access indica invlida esta linha no evento Report_Open. Mudei para o evento Report_Activate, mas ele simplesmente no executa esta linha! Qual a sugesto para aplicar um filtro sum sub relatrio? Priscila 23/03/2012 08:10:48 Pessoal, Gostei muito do site, mas estou tentando resolver um problema e no consigo, Tenho um Formulrio chamado "Relatrios por filtros", nele tenho uma caixa de combinao nomeado "Seo" essa caixa (combinao39), est baseada na Tabela "Seo", a mesma deveria trazer o Rel_Seo conforme o item selecionado na cx. de listagem (Combinao39). Deixando dessa maneira: Private Sub Combinao39_AfterUpdate() DoCmd.OpenReport "Rel_Seo", acViewDesign, , , acDialog, "Seo ='" & Me!Combinao39 & "'" End Sub O relatorio abre normalmente, mas com todos os itens da seo e no apenas o que selecionei,

No consigo de maneira alguma realizar o filtro neste formulrio, todos os outros consegui realizar via macro, mas esse em qualquer dos casos via VBA ou macro no consigo realizar o filtro neste caso.. Priscila Avelino Sampaio 23/03/2012 09:32:43 Priscila, Acrescente a caixa de mensagem e informe o valor que est retornando. Private Sub Combinao39_AfterUpdate() msgbox Me!Combinao39 DoCmd.OpenReport "Rel_Seo", acViewDesign, , , acDialog, "Seo ='" & Me!Combinao39 & "'" End Sub O campo "Seo" existe no relatrio ? No aguardo Priscila 23/03/2012 09:52:46 Aparece uma caixa de Mensagem do Access com o Setor escolhido em questo: Ex: 01.01.01 Gerenciamento Clico em OK e ele abre o formulrio novamente com todos os dados sem os filtros Avelino Sampaio 23/03/2012 09:59:27 Priscila, Por que esta pondo a filtragem no argumento OpenArgs ? Pode ento ser este o seu problema de filtragem. Coloque o filtro no argumento WHERE do comando. DoCmd.OpenReport "Rel_Seo", acViewDesign, ,"Seo ='" & Me!Combinao39 & "'" , acDialog Sucesso! Avelino Sampaio 23/03/2012 10:03:01 Priscila , Ops! Vi que tambm est chamando o relatrio no modo Designer. Troque isso para: DoCmd.OpenReport "Rel_Seo",acViewPreview ,,"Seo ='" & Me!Combinao39 & "'" Priscila 23/03/2012 10:18:30 Avelino, Muito obrigada pela ajuda S mais uma pergunta o relatrio deve abrir de modo que eu possa usar os botes de comando que constam nele (Imprimir; Salvar PDF; Sair) Pelo pouco que entendi de VBA, isso est no cdido acView...., tentei os que esto disponiveis mas nenhum deles fica dessa forma..

Estou fazendo certo? Priscila Priscila 23/03/2012 11:33:01 Avelino, Muito obrigada pela sua ajuda consegui finalizar o projeto, aproveitei e deixei todos as caixas do formulrio em cdigo VBA ao invs das macros, aproveito para parabenizar o site que muito bom Priscila Thiago 26/03/2012 10:42:49 Gostaria de saber como posso fazer uma macro para filtrar o valor "X", do campo FILTRO na minha tabela MAIN, no formulrio. Para que no apaream mais quando eu o abrir. Obrigado. Avelino Sampaio 27/03/2012 09:05:23 Thiago, desculpa pois no consegui entender o que deseja. Explique diferente. No aguardo. Luciane 28/03/2012 10:29:42 Criei um formulrio com vrias opes de cursos, para consultar gostaria de saber como filtrar apenas os cadastro feitos para cada tipo de curso; ou seja, mesmo quando peo apenas de um determinado curso, ele retorna todos os cadastros feitos e demarca com -1 o curso em referencia. Obrigada. Thiago 30/03/2012 13:41:50 Tenho um formulrio em que vrias pessoas atualizam ao mesmo tempo. Eu preciso de saber como fazer para que ningum acesse o mesmo registro, e que o registro aps ser atualizado no aparea mais. Criei um campo FILTRO, em que toda hora que o primeiro campo preenchido ele recebe o valor X; e uma macro que pega os registros com esse campo nulo. Mas no est dando certo, se voc puder me mostrar uma maneira melhor pra fazer isso.... Obrigado ! Marcos Oliveira 28/04/2012 12:20:58 Boa tarde AVELINO, Preciso saber quantas vezes um devedor foi cadastrado no meu sistema, ou seja, preciso criar uma espcie de passagem do devedor em meu cadastro. Por exemplo, posso ter em meu sistema um mesmo devedor com dbitos com diversos clientes. Exemplo;

Devedor: Marcos Paulo Silva - CPF. 000.123.456-78 - Vamos dizer que este mesmo devedor deva aos clientes A, B e tambm o C. Gostaria que no mesmo momento que eu digitasse o nome do devedor na minha caixa de texto para procura-lo no meu banco de dados, eu recebesse a informao de todos os cadastro do mesmo no sistema,ou seja, se ele foi cadastrado 3 vezes por reter 3 dbitos com diferentes clientes , gostaria que me listasse os 3 cadastros feitos para que eu escolhesse qual eu irei cobrar ou acionar. Uma espcie de passagem. Pode me ajudar !!?? Obrigado!! Marcos Oliveira. Marcos Oliveira 28/04/2012 12:50:39 Boa Tarde Avelino, Na verdade no quero saber se ele(Devedor) j foi cadastrado, quero saber quantas vezes ele ja foi cadastro. Como seu exemplo acima, gostaria que ao digitar o nome do devedor, o sistema me listasse quantas vezes ele foi cadastrado e tivesse como escolher o cadastro que quero ver. Exemplo, o sistema listou 3 vezes o nome ; Marcos Oliveira - vamos dizer que este devedor deva a 3 clientes diferentes, eu escolheria qual dos dbitos eu quero visualizar atraves de dois cliques em cima do nome. pode me ajudar !! Marcos Henrique 28/04/2012 17:35:29 Ol! Avelino, estou criando um formulrio para cadastro de viagens e nele existe os campos "n_Ordem_de_Servio" e "Nome_do_Viajante" entre outros. Quero Colocar uma crtica ao salvar. Quero que saber se o "n_Ordem_de_Servio" o mesmo que foi criado para o "Nome_do_Viajante" na tabela "Ordem_de_Servio" antes de salvar os dados na tabela "Viagem". Se possvel gostaria de sua ajuda para saber como fazer esta crtica funcionar. Alessandro 02/05/2012 18:02:03 Boa tarde, preciso de ajuda, preciso criar no meu formulrio um boto que ao clicar vai direcionar para um site e automaticamente concatenar com o nr de CPF para abrir as informaes do Cliente, algum sabe como eu fao isso? Estevo 13/05/2012 06:30:27 Adoro criar macros com botes para abrir planilha presciso de mais conhecimento OBRIGADO Wanderley 18/05/2012 15:40:53 Ol, no estou conseguindo filtrar os nomes para meu banco de dados de clientes. Gostaria de saber quais so as palavras variveis e onde devem ser colocadas para o filtro funcionar. J tentei de todas as formas e no deu certo. Private Sub cboConsulta_AfterUpdate() DoCmd.ApplyFilter , "idcliente = " & Me!cboConsulta.Column(0) Me!cli_Nome.SetFocus Me!cboConsulta = Null

End Sub Avelino Sampaio 21/05/2012 05:12:46 Wanderley, Quais os nomes dos campos que vc usa no seu cadastro ? A sua cambo tem quantas colunas e quais os nomes dos campos, em sequncia, destas colunas ? No aguardo Moreschi 25/05/2012 08:43:26 Ol, tenho 10 caixas de texto num formulrio. P1, ..... P10 Gostaria de usar a instruo For next para gravar o contedo destas caixas. Como fao para que reconhea o contedo? Porque quando fao: For i = 1 to 10 a=P(i) ou a = "P" & (i) no reconhece o valor de cada caixa. Obrigado Avelino Sampaio 25/05/2012 08:59:57 Moreschi, dim a(10) For i = 1 to 10 a(i)=me("p" & i) next Sucesso! Moreschi 25/05/2012 10:16:58 Grande Avelino! Funcionou perfeitamente. Muito obrigado e abraos Fabio 27/05/2012 10:45:43 Ol Avelino, muito obrigado por suas contribuies, so de grande valia para quem est a procura de algumas solues. Tenho aqui uma soluo sua para filtrar em um formulrio continuo por Cliente e Data, por Cliente est tudo ok, porm quando vou preencher o campo data esta dando erro... poderia me ajudar no que est dando este erro? segue cdigo: Option Compare Database

Dim x As String Dim j As Byte Dim filtro As String --------------------------------Private Sub Form_Open(Cancel As Integer) Me!tx2.SetFocus Me.Filter = "" End Sub -----------------------------------Private Sub tx1_Change() x = Me!tx1.Text j=0 If Len(Me!tx1.Text & "") > 0 Then j = j + 1 If Len(Me!tx2 & "") > 0 Then j = j + 2 Select Case j Case 0 Me.Filter = "" Me.FilterOn = False Me!tx1.SetFocus Exit Sub Case 1 filtro = "Data Venda Like '*" & Me!tx1.Text & "*'" Case 2 filtro = "NomeFirma Like '*" & Me!tx2 & "*'" Case 3 filtro = "Data Venda Like '*" & Me!tx1.Text & "*' AND NomeFirma Like '*" & Me!tx2 & "*'" End Select Me.Filter = filtro Me.FilterOn = True Me!tx1 = x Me!tx1.SelStart = Len(x & "") End Sub -----------------------------------------------------Private Sub tx2_Change() j=0 x = Me!tx2.Text If Len(Me!tx2.Text & "") > 0 Then j = j + 1 If Len(Me!tx1 & "") > 0 Then j = j + 2 Select Case j Case 0 Me.Filter = "" Me.FilterOn = False Me!tx2.SetFocus Exit Sub Case 1 filtro = "NomeFirma Like '*" & Me!tx2.Text & "*'" Case 2 filtro = "Data Venda Like '*" & Me!tx1 & "*'" Case 3 filtro = "NomeFirma Like '*" & Me!tx2.Text & "*' AND Data Venda Like '*" & Me!tx1 & "*'" End Select Me.Filter = filtro Me.FilterOn = True Me!tx2 = x Me!tx2.SelStart = Len(x & "") End Sub

--------------------------------------------Desde j agradeo por sua boa vontade. Abrao! Fabio 27/05/2012 10:57:00 Ol Avelino, incrvel mas acabei de descobrir o que estava errado. No campo "DATA VENDA" o espao entre as palavras era o causador do erro, desculpe incomodar e obrigado pelas suas contribuies. Abrao! Avelino Sampaio 28/05/2012 05:31:55 Fabio, obrigado pelo feedback e muito sucesso! Moreschi 12/06/2012 13:50:45 Ol Avelino, como vai? Tenho um formulrio onde informo as datas (inicial e final). Quero filtrar os dados da tabela pelo perodo e tambm pela varivel tipo = 2 ou tipo = 4. No est funcionando, onde est o meu erro? Dim cr As Recordset Dim SQL As String SQL = "SELECT * FROM CRMcontatosDiversos where Tipo = 2 Or Tipo = 4 " SQL = SQL & "And Data >= " & Format([Dti], "mm/dd/yyyy") SQL = SQL & "And Data <= " & Format([Dtf], "mm/dd/yyyy") SQL = SQL & "Order by data;" Set cr = CurrentDb.OpenRecordset(SQL) Abraos Avelino Sampaio 13/06/2012 04:34:08 Moreschi, qual o erro que acusa ? Erro de sintaxe ? Inclua espaos nos locais indicados. SQL = "SELECT * FROM CRMcontatosDiversos where Tipo = 2 Or Tipo = 4 " SQL = SQL & "And Data >= " & Format([Dti], "mm/dd/yyyy") SQL = SQL & "< ESPAO >And Data <= " & Format([Dtf], "mm/dd/yyyy") SQL = SQL & "< ESPAO >Order by data;" Sucesso! Moreschi 13/06/2012 07:40:32

Bom dia Avelino! Realmente resolveu o problema de sintaxe, mas no est filtrando. Informo no formulrio 01/05/12 31/05/12 ---> resultado: vem dados desde 2003, ou seja, todos os dados da tabela. Por que ser que no est filtrando? Abraos Avelino Sampaio 13/06/2012 07:56:59 Moreschi, primeiro realize teste individuais e por fim junte as partes: Teste 1: SQL = "SELECT * FROM CRMcontatosDiversos where Tipo = 2 Or Tipo = 4" SQL = SQL & "< ESPAO >Order by data;" Teste 2: Use o BETWEEN e a tralha (#) e procure no usar o nome DATA que reservado do Access SQL = "SELECT * FROM CRMcontatosDiversos WHERE" SQL = SQL & "< ESPAO > CRMcontatosDiversos.[Data] Between #" & Format([Dti], "mm/dd/yyyy") SQL = SQL & "# And #" & Format([Dtf], "mm/dd/yyyy") & "#" SQL = SQL & "< ESPAO >Order by CRMcontatosDiversos.[data];" Tudo funcionando, junte as duas partes Sucesso! Moreschi 13/06/2012 11:50:40 Grande Avelino, Aps fazer o que voc recomendou, continuou sem filtrar. Coloquei entre parantisis e veja como ficou. Agora esta funcionando. SQL = "SELECT * FROM CRMcontatosDiversos where" SQL = SQL & " (CRMcontatosDiversos.[Tipo] = 2 or CRMcontatosDiversos.[Tipo] = 4)" SQL = SQL & " and CRMcontatosDiversos.[DataPV] Between #" & Format([Dti], "mm/dd/yyyy") SQL = SQL & "#And #" & Format([Dtf], "mm/dd/yyyy") & "#" SQL = SQL & " Order by CRMcontatosDiversos.[dataPV];" Set cr = CurrentDb.OpenRecordset(SQL) ' executa a consulta Muito obrigado mais uma vez. Esta foi difcil, mas com a sua ajuda consegui. Avelino Sampaio 14/06/2012 07:30:44 Moreschi, obrigado pelo feedback e sucesso no seu projeto! Gil 16/06/2012 10:11:32 Amigo Avelino, antes de tudo agradeo a Deus por existir pessoas como voc que se prontifica a ajudar quem

ainda no sabe andar (meu caso no access). vi e pus em em pratica seus ensinos, agora preciso,se possivel que me ajude em uma funo, meu filtro ja esta funcionando quando fao busca pelo nome do cliente, agora como fao para filtrar tambm por outro critrio ao mesmo tempo? no meu caso apelido (que muito usado aqui onde moro). Grande abrao e mais uma vez obrigado. Jaffer Silva calhau 05/07/2012 00:51:58 Sr. Avelino boa noite!!! estou trabalhando num formulario cadastro de cliente mas gostaria dem fazer comando de filtragem aplicado em formulrios e em relatrios que possuem o foco. Por exemplo, no cadastro de clientes, tem uma combobox aonde se seleciona o cliente de interesse para a exibio do seu respectivo cadastro, s que eu precisava filtra com duas condio, por nome ou por cpf, para evirar que seja cadastrado um pessoa mais que uma vez. assisti a sua aula, enendi, s gostaria de ssaber se a montagem dos codigo o memso, tendo envista que o campo cpf esta no campo 5 no se se a ordem altera o funcionamento da escrita do cdigo e o carregamento do formulario. Juliano Lopez 05/07/2012 08:58:54 Avelino, bom dia. Queria te pedir ajuda com o seguinte. Tenho varias funes gravadas em tabelas. Gostaria de chamar essas funes pelo VBA. A minha tabela se chama TFuncs, tem um campo ID (numero) e um campo FunoEscrita (memorando). Ao clicar no texto1 dentro de meu forms, quero que ele faa uma especie de dlookup() nesta tabela e j execute o que vai estar escrito dentro dela. Uma segunda opo, seria j pegar uma caixa de texto dentro do forms, escrever a funo ali e pedir para o access executar ela. Porm ainda no consegui localizar uma forma de fazer isso. Obrigado por sua ateno a todos que postam aqui em seu site. Site que por sinal uma "mo na roda". Melhor, uma no... duas mos na roda... rsrs Abrao. JLopez Avelino Sampaio 05/07/2012 17:38:10 Juliano funes so armazenas no mdulo global e no em tabelas. Qual o foi motivo de guardar os cdigos em uma tabela ? No aguardo Juliano Lopez 05/07/2012 18:06:58 Ento Avelino, eu queria fazer alteraes em funes sem precisar desconectar o banco para isso. Se estiver em um modulo, no posso reescrever quando algum estiver conectado. A necessidade surgiu em corrigir uma formula no VBA mesmo com os usurios usando o banco. Ou at mesmo, incluir uma nova funo. Exemplo: a funo1 iria gerar uma msg box. Porm, eu gostaria que a hora fosse gravada. Logo, eu iria criar a funo2 e escrever na tabela de funes, dentro da funo1, que deveria ser chamado a funo2 aps a caixa de

msg. Jaffer Silva Calhau 06/07/2012 00:41:19 Sr. Avelino Boa noite Fiz a o formulario frmNovoCliente que tem no Maestro v3 s que acredito ter feito como consta nos cdigo que vc fez no entanto esta dando o seguiunte erro quando abro o formulario ele da erro em tempo de execuo 438 quando mando depurar ele sinaliza em amarelo a linha: Me!Lista.RowSource = strSql Estou usando o acces 2010 Abrao!!!!! Segue o codigo abaixo. Option Compare Database Private Function fncCarregaLista(filtro As String) Dim strSql As String strSql = "SELECT Cdigo, NomeDoCliente " strSql = strSql & "FROM TabCliente " strSql = strSql & "WHERE NomeDoCliente like ""*" & filtro & "*"" " strSql = strSql & "ORDER BY NomeDoCliente;" Me!Lista.RowSource = strSql End Function ' Private Sub BtSalvar_Click() Dim rs As DAO.Recordset Dim id As Long If Len(Me!Texto2 & "") = 0 Then Me!Texto2.SetFocus Exit Sub End If If Dcount("*", "TabCliente", "NomeDoCliente = """ & Me!Texto2 & """") = 1 Then MsgBox "Cliente j cadastrado...", , "Aviso" Me!Texto2.SetFocus Exit Sub End If Set rs = CurrentDb.OpenRecordset("TabCliente") rs.AddNew id = rs!Cdigo 'captura o nmero exclusivo do novo registro rs!NomeDoCliente = Me!Texto2 rs.Update rs.Close Set rs = Nothing Forms!ForTabCliente.Filter = "Cdigo = " & id Forms!ForTabCliente.FilterOn = True Forms!frmClientes!cli_Endereo.SetFocus DoCmd.Close acForm, "frmNovoCliente" End Sub Private Sub Lista_DblClick(Cancel As Integer)

Forms!ForTabCliente.Filter = "Cdigo = " & Me!Lista.Column(0) Forms!ForTabCliente.FilterOn = True Forms!ForTabCliente!NomeDoCliente.SetFocus DoCmd.Close acForm, "ForNovoCliente" End Sub Private Sub Texto2_Change() Call fncCarregaLista(Me!Texto2.Text) End Sub Private Sub Texto2_GotFocus() Me!Texto2.SelStart = Len(Me!Texto2 & "") Call fncCarregaLista(Me!Texto2.Text) End Sub Private Function fncLimpaCampos() Me!Texto2 = Null contaRazao = 0 Me!Lista = -1 Me!Texto2.SetFocus End Function Eduardo Souza 11/07/2012 18:58:05 Avelino, se voc continuar assim, sugiro que voc pense em conceder certificao a "futuros programadores". Gostei muito desse tpico sobre filtragem, que chega ser melhor do que muito manual oficial da Microsoft. Um abrao. MARCOS OLIVEIRA 19/07/2012 17:44:46 BOA TARDE AVELINO. Preciso de uma ajuda. Tenho uma tela no meu sistema chamada consulta devedor quero criar uma CAIXA DE COMBINAO para filtrar todos os DEVEDORES de um determinado CLIENTE no CDIGO DO MEU NEGOCIADOR. Em suma quero criar 2 (duas) caixas de combinao onde meu NEGOCIADOR insira na primeira seu CDIGO e na segunda o CDIGO DO CLIENTE e assim o sistema me liste todos os devedores deste cliente no cdigo do meu negociador. Nomes das minhas tabelas: Tab_negociador Tab_cliente Tab_devedores OBRIGADO AGUARDO RETORNO ISAC ALVES 23/07/2012 13:24:55 CARO, GOSTARIA DE FAZER INCUSO DE REGISTRO EM UMA TABELA APROVEITANDO OS DADOS DE UMA OUTRA, OU SEJA QUANDO DIGITAR UM CAMPO COMO MATRICULA ELE J INCLUIR O NOME ENDREO ETC. DESTE CLIENTE QUE J SE ENCONTRA NUMA TABELA CADASTRO, S INCLUIRIA DADOS NOVOS ,PENSO QUE SERIA UM RELACIONAMENTO DE TABELAS. MEU E-MAIL ISACEDUCAR@HOTMAIL.COM

CJota 31/07/2012 08:56:51 Bom dia Avelino! Estou com dificuldade no comando SQL para gerar um relatrio filtrando por perodo e nome simultaneamente. Estou trabalhando em VB10 e o meu banco Access 2000. Tenho no meu banco a TB_ALIMENTACAO que guarda as informaes de consumo de cada funcionrio do meu restaurante (exemplificando apenas). No final do ms, quero um relatrio detalhado de cada consumo do funcionrio e o total do consumo para ser descontado do pagamento. Tentei o cdigo abaixo, sugerido por voc: Format(me!txDataInicial,"mm/dd/yyyy") & "# AND #" & Format(me!txDataFinal,"mm/dd/yyyy") Mas o VB no aceita. Fiz algumas alteraes e ficou assim: filtro = Convert.ToDateTime(dtpInicio.Text) & "# AND #" & Convert.ToDateTime(dtpFinal.Text) comando.CommandText = "SELECT * FROM TB_ALIMENTACAO WHERE Data BETWEEN #" & filtro & "#" Onde: dtpInicio=data inicial; dtpFinal= data final Assim como est, ele me traz os dados de todos os funcionrios. Preciso agora que ele me traga os dados apenas do funcionrio selecionado no combobox (cmbNome) mas no consegui saber onde colocar o filtro. Tambm no consegui fazer a ordenao. Se puder me dar uma dicas ficarei muito agradecido. Ah! e parabns pelo site. Est muito bacana. Moreschi 06/08/2012 10:41:57 Jaffer Coloque um espao antes de cada palavra. strSql = strSql & " FROM TabCliente " strSql = strSql & " WHERE NomeDoCliente like ""*" & filtro & "*"" " strSql = strSql & " ORDER BY NomeDoCliente;" S nestas 3 linhas, a primeira no tem espao Andre 09/08/2012 15:22:55 Boa tarde. Criei um Listbox dentro de um Form (Access), atrelado a uma query. Defini este Listbox como multipla selacoes simples. Digamos que abri o formulario e no listbox selecionei as opcoes laranja, maca e uva. Como faco para capturar os itens selecionados no listbox e passa-los como parametro para um campo criterio de uma query? obrigado Avelino Sampaio 09/08/2012 16:31:16 Andre, A query ser usada para carregar um relatrio ou um formulrio ? No aguardo Moreschi 09/08/2012 16:57:07 Ol Andr,

Na sua consulta (query) tem que aparecer todas as frutas de uma vez (as escolhidas no listbox) ou uma por vez? Andre 10/08/2012 08:49:28 Pessoal, Obrigado pelo retorno. As queries resultado da selacao das frutas (no listbox) sera carregada no proprio formulario, em outros listbox. assim. Tenho 4 listbox, que sao carregados no load do form e estao funcionando perfeitamente. Logo abaixo de cada listbox eu coloquei um botao. Quando dou um click neste, entao o evento deve pegar os campo(s) selecionados (ou considerar todos caso nao haja selecao) e passar como parametro para outras 3 queries. Essas outras queries estao ligadas aos outros 3 listbox. Assim, quando dou um click, os outros 3 listbox sao atualizados (atraves de suas proprias queries e um comando requery) baseados nos itens selecionados no primeiro. Esta acao 'e realizada para qualquer listbox que eu venha a dar um click no seu respectivo botao query. Ou seja, a selecao em um listbox + botao query sempre ira atualizar os outros tres. Ainda ontem, depois de postar essa duvida aqui, eu acabei achando um exemplo perfeito para o que eu precisava. Apliquei e deu muito certo. No link abaixo tem o examplo bem ilustrado e detalhado. http://www.blueclaw-db.com/multi_select_parameter_form.htm De qualquer forma, agradeco e retorno e o interesse na solucao dessa implementacao. Avelino Sampaio 10/08/2012 09:09:46 Andre, obrigado pelo feedback e pelo link. Sucesso! Antonio Carlos 21/08/2012 15:38:20 TENHO 2 TABELAs simples DE ALUNOS COM AS RESPECTIVAS NOTAS (uma do fundamental e outra do mdio) a do fundamental a pesquisa funciona normal j a do mdio tambm funcionava at ontem quando fui fazer a consulta e apareceu a seguinte mensagem: " NULO / NEGADO NULO". Sou iniciante e gostaria de saber se poderia me ajudar? Tom Vicente 23/08/2012 19:46:06 Muito muito bom! Moreschi 24/08/2012 11:07:54 Ol Avelino, como vai? Gostaria de saber se possvel um sub formulrio no vinculado a uma tabela inserir vrias linhas para alguns campos? Eu tenho uma linha com um campo "Codigo" e um campo "Nome", gostaria que fosse aparecendo outras linhas como se este sub formulrio estivesse vinculado a uma tabela. Abraos Moreschi 28/08/2012 11:51:28 Ol Avelino, j achei a resposta. Me.RecordSource = "Select * From NomeDaTabela"

Abraos Tom Vicente 14/09/2012 20:29:00 Onde posso encontrar a bd Maestro2 ? Heitor 19/09/2012 14:42:42 Boa Tarde Galera Preciso fazer o seguinte, tenho uma lista com varios produtos e entre eles eu digito entrada e saida em uma caixa de texto, ex: tubo 5/8 entrada : 5 saida 5 saldo total: 0, ai eu vo e mudo fao isso para varios outros pordutos e quando eu volto em tubo 5/8 ele me exibe o valor 0, ou seja o ultimo valor de cada item. Me Ajudem Por Favor Desde ja Muito Obrigado Email: heitor.luiz@hotmail.com Heitor 19/09/2012 14:44:06 Galera preciso em VBA valeu muito obrigado Guidemar 30/09/2012 04:16:58 Boa Noite Avelino, Primeiro quero te dar meus parabns, seus exemplos so timos, seu artigo espetacular. Num dos seus exemplos de filtragem(frmAtendimentos) tem trs campos de filtro, se eu acrescentar mais um compo(Marca), posso filtrar atravs de um campo individual ou mais de um ou ate mesmo os quatro campos juntos, possvel?, se puder me mandar o exemplo ou at mesmo postar o cdigo agradeo desde j. Email: guidemar2010@hotmail.com Avelino Sampaio 01/10/2012 07:55:21 Guildemar, use a tcnica empregada no exemplo do formulrio frmFiltraFormContinuo. Neste exemplo ele usa dois campos. Para expadir para 4, use a combinao: If Len(Me!tx1.Text & "") > 0 Then j = j + 1 If Len(Me!tx2 & "") > 0 Then j = j + 2 If Len(Me!tx3 & "") > 0 Then j = j + 4 If Len(Me!tx4 & "") > 0 Then j = j + 8 Com isso , vc ter 16 combinaes possiveis de filtragem no SELECT CASE. Bom estudo! Moreschi 03/10/2012 10:49:36 Ol Estou tentando colocar os nomes de uma consulta num campo texto, um em cada linha, mas no est dando

certo. Dim SQL As String Dim cr As Recordset SQL = "SELECT FuncionariosPonte.Reg, FuncionariosPonte.Nome, FuncionariosPonte.Depto, FuncionariosPonte.Acrescenta" SQL = SQL & " FROM FuncionariosPonte" SQL = SQL & " WHERE (((FuncionariosPonte.Acrescenta)=-1));" Set cr = CurrentDb.OpenRecordset(SQL) ' executa a consulta cr.MoveFirst Do Me.Comentarios = cr("depto") & " " & cr("reg") & " " & cr("nome") Chr (13) & Chr(10) cr.MoveNext Loop Until cr.EOF Avelino Sampaio 03/10/2012 11:05:36 Moreschi , Experimente assim: ... Set cr = CurrentDb.OpenRecordset(SQL) ' executa a consulta cr.MoveFirst Me!Comentarios="" Do Me!Comentarios =Me!Comentarios & cr("depto") & " " & cr("reg") & " " & cr("nome") & Chr (13) & Chr(10) cr.MoveNext Loop Until cr.EOF Sucesso! Moreschi 03/10/2012 13:37:21 Grande Avelino, Na mosca. Obrigado e um grande abrao. Guidemar 06/10/2012 15:03:10 Boa Tarde Avelino, No consegui adaptar o seu conselho pois eu teria dois campos ali que pesquisaria entre duas datas. Tentei colocar mais uma caixa de texto para pesquisa por placa no frmAtendimentos mas me abre uma caixa inserir valor do parmetro. segue o cdigo Dim j As Boolean, filtro As String If IsNull(Me!cboCliente) Then j = True If IsNull(Me!DataInicial) Then j = True If IsNull(Me!DataFinal) Then j = True

If j = True Then MsgBox "Preencha todos os campos...", vbInformation, "Aviso" Me!cboCliente.SetFocus Exit Sub End If filtro = "IdFrete = " & cboCliente.Column(0) filtro = filtro & " AND Tb_ControleContainer.bd_Data Between #" & Format(Me!DataInicial, "mm/dd/yyyy") & "# AND #" & Format(Me!DataFinal, "mm/dd/yyyy") & "#" '--------------------------------------------------------------------------------------------------------------------------------------------------------------filtro = "bd_placa = " & TexPlaca sfrmConsulta.Form.Filter = filtro sfrmConsulta.Form.FilterOn = True se puder me ajudar te agradeo. Pedro Trindade 16/10/2012 11:31:56 Avelino, Depois de quebrar muito a cabea (pois sou leigo total), consegui fazer o filtro funcionar. Graas a sua explicao. Entretanto, fiquei com uma dvida: O nome do meu campo "Nome do Aluno" e, pra poder fazer o filtro funcionar, tive que alterar o nome do campo para simplesmente "Nome". Pode me dizer porqu? Outra coisa: Nem todas as vdeos-aulas esto disponveis, no ? Obrigado Avelino Sampaio 16/10/2012 12:01:51 Pedro, V na seo "Tutoriais" aqui do site e leia o artigo "Referenciar objetos Forms e Reports ..." que vc ir entender o problema com o nome do seu campo. Sim, alguns vdeos no esto disponveis ainda. Procure utilizar o Internet Explorer, pois o Firefox no consegue exibir alguns dos vdeos.

Você também pode gostar