... Pague apenas R$67,00 uma única vez e tenha acesso por 1 ano aos vídeos e arquivos exemplos do site ...

Clique aqui e obtenha mais detalhes.


Sons no Access ..... BINGO!!!

Certa ocasião recebi um email questionando se seria possível criar um Bingo no Access e se haveria possibilidade, também, do sorteio dos números ser narrado.  Sabendo da existência de uma API, que permite o uso de sons no Access, montei o projeto com uma programação relativamente simples.

Sons no Access

Comecei a gravar, um por um, os números do sorteio, que totalizavam 75.  No meio do caminho das gravações dos números, lembrei de outra API muito simples, que permite retardar o tempo entre a execução das linhas de código.  Desta forma foi possível gravar uma quantidade menor de números e com estes montar a locução de outros.  Para exemplificar, destaco o número 35:  pronuncio o número 30, dou uma pequena pausa, pronuncio a letra E, dou uma pequena pausa e por fim pronuncio o número 5.  Assim,  precisei gravar, apenas, a seguinte seqüência:

1 ao 20, 30, 40, 50, 60, 70, letra "E" e a palavra "Número"

O que são APIs ?

API - Application Program Interface - é um conjunto de funções predefinidas e que são utilizadas para controlar a aparência e o comportamento de cada elemento do Windows.  Estas funções ficam armazenadas em arquivos com extensão DLL.  Um arquivo DLL do Windows pode armazenar centenas de funções.   Quem procura estudar, entender e aplicar estas funções passa a ter um potencial de programação inacreditável!  O VBA do Access pode manipular a maioria dessas funções.

Se desejar se aprofundar sobre as APIs, acesse o link:  http://allapi.mentalis.org

Veja abaixo as duas APIs, usadas no exemplo:

'Esta função do Windows nos permite usar sons e está localizada no arquivo winnm.dll
Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, _
ByVal hModule As Long, ByVal dwFlags As Long) As Long
 
'Esta função do Windows nos permite retardar o tempo de execução entre uma linha e outra
'do código e está localizada no arquivo Kernel32.dll
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Para usarmos a API do som, basta indicarmos o local e o arquivo de som, conforme o exemplo:

Call PlaySound "c:\MinhaPasta\sons\meuArquivo.wav", 1, 1

Para usarmos a API de espera, basta indicarmos o tempo desejado, em milésimo de segundos.

Call Sleep(1000) ' Espera por 1 segundo
 
Call Sleep(10000) ' espera por 10 segundos

Para pronunciar o número 35, o código é escrito na seguinte seqüência:

'Pronuncia a palavra número
Call PlaySound "c:\MinhaPasta\sons\Numero.wav", 1, 1
'Faz o código esperar por 1,7 segundos enquanto se está pronunciando a palavra "Número"
Call Sleep(1700)
'Pronuncia o número 30
Call PlaySound "c:\MinhaPasta\sons\30.wav", 1, 1
'Aguarda por 1,8 segundos enquanto se está pronunciando o número 30
Call Sleep(1800)
'Pronuncia a letra "E"
Call PlaySound "c:\MinhaPasta\sons\E.wav", 1, 1
'Aguarda por 0,9 segundos a pronúncia da letra "E"
call Sleep(900)
'Pronuncia o número 5
Call PlaySound "c:\MinhaPasta\sons\5.wav", 1, 1

E quanto ao sorteio dos números, como é feito no Access ?

O Access tem uma função chamada Rnd(),  que retorna com um número randômico. 

Toda vez que se executa o Rnd() é  gerado um número aleatório, que poderá se repetir.  Exemplo:

rnd() > Resultado : 0,9963837
rnd() > Resultado : 0,7055475
rnd() > Resultado : 0,533424
rnd() > Resultado : 0,0095186 

A função Rnd() retorna um valor menor que 1, mas maior ou igual a zero. 

Agora, observe o seguinte: se multiplicarmos cada resultado por 100, teremos:

rnd() * 100 > Resultado : 99,63837
rnd() * 100 > Resultado : 70,55475
rnd() * 100 > Resultado : 53,3424
rnd() * 100 > Resultado : 0,95186 

Podemos, então, ter valores sorteados que vão de 0 a 99,99999.

Percebeu que o número multiplicador é o limitador máximo do número sorteado?  Se desejarmos sortear números de 0 a 999,9999, basta multiplicarmos o Rnd() por 1000.

O Bingo aqui apresentado tem 75 números.  Se multiplicamos o Rnd() por 75, teremos o  intervalo, que irá variar de 0 a 74,99999.

rnd() * 75 > Resultado : 74,72877
rnd() * 75 > Resultado : 52,91606
rnd() * 75 > Resultado : 40,0068
rnd() * 75 > Resultado : 0,71389

Para ficarmos com a parte inteira, basta usarmos a função Int().

Int(rnd() * 75) > Resultado : 74
int(rnd() * 75) > Resultado : 52
int(rnd() * 75) > Resultado : 40
int(rnd() * 75) > Resultado : 0

Assim, os sorteios irão de 0 a 74. Porém, no nosso caso, os sorteios devem ser de 1 a 75. Para isso, basta somarmos o valor 1 ao resultado para que fique no intervalo desejado.

Int(rnd() * 75) + 1 > Resultado : 75
Int(rnd() * 75) + 1 > Resultado : 53
Int(rnd() * 75) + 1 > Resultado : 41
Int(rnd() * 75) + 1 > Resultado : 1

Como armazenar o número sorteado no campo correto?

A sintaxe completa no VBA que representa o campo de um formulário é esta:

forms!NomeDoFormulário!NomeDoCampo

Se estivermos usando a área do VBA, pertencente ao formulário em questão, podemos substituir a sintaxe Forms!NomeDoFormulário pelo o auto-identificador Me, ficando a escrita reduzida da seguinte forma:

Me!NomeDoCampo

Quando desejamos passar um valor para o campo, basta usarmos o sinal de igualdade:

Me!NomeDoCampo = valor

Existe uma outra forma de sintaxe para representar o nome de um campo e que nos permite um grau de flexibilidade enorme, que é:

Me("NomeDoCampo") = valor

Para você entender a importância deste formato, quero que imagine a seguinte situação: um formulário com 30 campos em que precisamos limpar os 30 campos para receber novos valores.   Teríamos então que escrever 30 linhas no VBA,  conforme abaixo:

me!("NomeCliente")= null 'primeira linha
me!("endereco")= null
me!("Telefone")= null
...
...
me!("observacao")= null 'trigésima linha

Então, resolvemos alterar o nome dos campos, seguindo a seguinte padronização:

campo1, campo2, campo3, ..., campo30

Observe que os campos foram numerados!  Agora, veja como posso representar a sintaxe de um dos campos:

me("campo1") = null

A sintaxe de um dos campos pode ser escrita também da seguinte forma:

me("campo" & 1) = null 

O símbolo "&" junta(concatena) as partes, formando um todo.

Agora que padronizamos os nomes dos campos e que sabemos que é possível usar a concatenação, podemos criar uma laço com o uso da instrução FOR, que reduzirá a escrita.

Dim j as byte
for j = 1 to 30
   me("campo" & j) = null
next j

Confira! Das 30 linhas, reduzimos a 4 linhas de código!  Dê uma olhadinha na função fncLimpar(), do arquivo exemplo. Você verá exatamente este tipo de rotina sendo aplicado!

Os campos, que irão armazenar os 75 números do sorteio, padronizei com os seguintes nomes:

tx1, tx2, tx3, ..., tx74 e tx75

Vamos supor que o número 35 tenha sido sorteado! Veja como é simples o campo correspondente tx35 assumir este valor:

me("tx" & 35) = 35   Essa escrita é o mesmo que escrever  me("tx35")=35

Observe o código para o preenchimento dos campos, sempre que houver o sorteio:

Dim intRnd as integer
'Número sorteado passado para variável intRnd
intRnd = int(rnd() * 75) + 1
'Campo correspondente ao número sorteado, recebendo o número
me("tx" & intRnd) = intRnd

E como saber se o número que está sendo sorteado já foi sorteado antes ?

É bem simples: basta verificar se o campo correspondente está preenchido.  Se já estiver preenchido, forçamos um novo sorteio, através de em loop com a instrução DO WHILE, até se conseguir um número ainda não sorteado. 

Acompanhe como ficou o código:

...
booRepete = True
Do While booRepete
  'Randomize força a função Rnd() a sortear um novo número
  Randomize
  'Sortear um número de 1 a 75
  intRnd = Int(Rnd * 75) + 1
  'verifica se já foi sorteado. Se sim, continua no loop, gerando novo número.
  'Só sairá do loop quando o valor for diferente do já sorteado.
  'para isso, basta verificar se a campo que recebe o número está ou não preenchido.
  If IsNull(Me("tx" & intRnd)) Then booRepete = False
Loop
...

Aonde ficam armazenados os arquivos de som ?

Arquivos de som e imagens são mais adequados que fiquem armazenados fora do aplicativo, pois tais arquivos geralmente consomem muito espaço da aplicação, o que é indesejável.   Todos os detalhes sobre o uso de Caminho Relativo você tem aqui.

Testando sons em botões

Abrindo o formulário frmTestaSons você terá uma série de botões, conforme figura abaixo:

Som em botões

 

Teste todos os botões para se ter uma idéia das possibilidades.

Baixe o arquivo exemplo:

Bom jogo!


 

 


29 comentários

Antonio Martins dos Santos   30/10/2011 13:55:30

Excelente. Tenho muita vontade de aprender programação VBA com Access

JBSR   30/10/2011 15:46:50

Parabens pelo tópico Avelino. São recursos que deixam o Access mais profissional e muitas vezes são mal aproveitados pelos programadores por falta de conhecimento das técnicas.

O seu site tem mostrando um grande acervo de recursos access. Aonde você está tão bem escondido que a MS ainda não te achou???!?!?!?!

Sds companheiro

Claudio   30/10/2011 15:47:46

Olá Amigos,

Primeiro parabéns pelo sistema de bingo fantástico, gostaria de uma ajuda dos amigos montei um sistema simples em access para controlar lançamentos de processos, preciso criar um menu especifico porque vai rodar em rede e não gostaria que aparecesse aquele topo tradicional para o usuários.

alguem poderia dar uma dica?

abs.

Adilson Calixto   30/10/2011 17:38:08

Belo Tópico Avelino.

Continue assim, precisamos destas criações que você nos disponibiliza.

abs.

Gilson   30/10/2011 19:57:41

Excelente aplicativo, gostei bastante.

Gilson   30/10/2011 20:05:55

Deveria implementar com um número maior de cartelas e com a palavra BINCO nas cartelas e no formulario de sorteio.

Marcelo David   30/10/2011 21:52:06

Mais uma vez, parabéns!!! Todos os seus artigos são ótimos!!!

Avelino Sampaio   31/10/2011 05:35:24

Antonio Martins,

estou preparando um curso de VBA para iniciantes que em breve estarei lançando. Cadastre-se aqui no site para receber meu comunicado sobre o lançamento.

Gilson,

obrigado pea sua dica

Pessoal,

fico muito agredecido pela participação de vocês.

Sucesso!

Avelino Sampaio   31/10/2011 05:38:38

Claudio,

os menus foram substituidos por Ribbons, nas versões 2007 e 2010. Vc está no lugar certo para aprender sobre as ribbon. Conheça o MONTARIBBONS.

Bom estudo!

João Ricardo - Miranda/MS   31/10/2011 09:20:24

Olá pessoal!
Avelino, parabéns mais uma vez pelo excelente conteúdo e ótima didática. Vejo muitas possibilidades para este aplicativo em especial para poder trabalhar com crianças.
Estou aguardando ansioso pelo curso de VBA para iniciantes.

Johnny-Blumenau/SC   31/10/2011 09:23:12

Muito bom Avelino. Apenas temos de implementar a PtrSafe pra rodar no Win64.

Avelino Sampaio   31/10/2011 09:47:20

Johnny,

isso mesmo, muito bem lembrado sobre a questão do Win64! Eu não abordei este detalhe, para não confundir os mais novos mas o arquivo exemplo foi com esta adaptação. Aqueles que quiserem se aprofundar sobre o tema, tem um tutorial que explico sobre o uso de APIs na versão de 64 bits.

Grato

Avelino Sampaio   31/10/2011 09:51:21

João,

estou lutando muito aqui para criar um curso de VBA, para iniciantes, que valha apena. Assim que eu lançar estarie lhe informando. Vc será um dos meus primeiro avaliadores.(risos).

Sucesso!

Marcelo - São Bento do Sul - SC   31/10/2011 10:23:02

Estou aguardando ancioso este curso de VBA ....Já sou cliente do MontaRibbons e definitivamente é a melhor ferramenta sobre o assunto e para aprendizagem em xml...

Quem quizer adquirir eu recomendo.....A avelino da toda a atenção nos primeiros passos, ensinando várias dicas importantes e auxiliando no aprendizado......

Serei enterno cliente dele.....(risos)....

Roniscler - Juiz de Fora    31/10/2011 19:34:54

Olá Avelino. Me parece que a Microsoft quase deu um tiro letal no Delphi por causa das API's. Ela queria descontinuar essa forma de programação por causa do .net framework. Depois de muita pressão ela voltou atrás e o Win7 e vei com API. Você, ou alguem do site, sabe algo sobre isso?

MARCIO MELO - RJ   01/11/2011 20:25:03

Um programa super show de bola e mostrando como o access é maliável e pode ser usado em diversas ocasiões, basta criatividade... Parabéns por mais esse excelente aula, tutorial

Sou mais Brasil!

CARLOS ROGERIO   18/03/2013 20:32:26

show de boa amigo....... caraca......

Nelio Lemos   30/05/2014 22:01:31

Olá, achei excelente o programa, você é TOP, parabéns! Baixei o sistema de bingo e gostaria de ver nesse sistema alguns recursos, como: Colorir o número que foi sorteado. Indicar o último número sorteado. Informar quantas cartelas estão prestes a ganhar, por exemplo: cartelas restando 5 números. Informar além do número da cartela ganhadora, o nome do comprador da cartela. Tenho muitas outras ideias, mas, essas deixariam o programa ainda mais show.

Marcelo Souza   01/07/2014 09:14:53

Seria pedir muito que me disponibilizasse o programa pronto?
Desde já agradeço!
Abraços

Avelino Sampaio   02/07/2014 05:19:14

Marcelo,

o programa que tenho é somente este que está disponível no final do artigo, para o download.

Sucesso!

Marcelo Souza   17/07/2014 21:20:36

Tentei usar este código no Excel, mas não consegui.
Poderi me ajudar?

Marcelo Souza   17/07/2014 21:28:26

Desenvolvi um programinha de bingo eletrônico e gostaria de colocar os sons das bolinhas, mas não consegui usar o código...

Marcelo Souza   18/07/2014 11:45:22

Obrigado Avelino, conseguir entender o código e já resolvi!
Valeu camarada, abração!

Avelino Sampaio   19/07/2014 06:51:07

Marcelo,

obrigado pelo feedback e sucesso!


Marcelo Souza   24/07/2014 10:56:14

Bom dia pessoal, inseri uma figura com movimento no Excel e gostaria de executar um som
ao mesmo tempo que o comando "rotation" VBA é executado, tem como?

Marcelo Souza   28/07/2014 15:51:17

Descobri o "x" da questão foi só mudar o valor do atributo no final da linha de comando de "0" zero para "1" e funcionou...

De:
Call sndPlaySound32("G:\Bingo\sons\globogirando.wav", 0)

para:
Call sndPlaySound32("G:\Bingo\sons\globogirando.wav", 1)


Avelino Sampaio   30/07/2014 08:16:41

Marcelo,

muito obrigado por este importante feedback.

Sucesso!

Nélio Lemos   30/12/2015 16:21:15

Caro Avelino Sampaio, já desenvolvi com base no seu sistema, algumas das funcionalidades que citei acima, e acrescentei a geração de cartelas com até 6 cartelas por página, acrescentei 400 cartelas ao banco de dados, o sistema acusa quem ganhou o sorteio, indicando o nome, endereço, telefone, vendedor e se a cartela foi paga e a personalização da cartela, como: Nome do bingo, local, data, valor, nome dos prêmio, imagens dos prêmios, acrescentar uma imagem de fundo na cartela e muitas outras, contudo eu ainda desejo que o sistema indique quantas cartelas estão próximas de ganhar o prêmio e outras ideias. Então, se puder me ajudar nesta empreitada eu não me importaria de pagar pelo serviço, até porque o projeto é seu.

João Geadas   21/02/2016 20:52:58

Olá, o meu nome é João e vi este seu exemplo, muito bom, mas gostaria de fazer uma outra brincadeira para ajudar o meu filho nas tabuadas.
Neste seu exemplo o programa gera um numero aleatoriamente e devolve o mesmo para uma caixa de texto que por sua vez está numerada.

A minha duvida é a seguinte gostaria que o numero gerado fosse aleatório mas que a caixa de texto onde fosse escrito fosse também aleatória e não coloca-se o numero devolvido na caixa com o mesmo numero conforme neste exemplo.
Dá para fazer isto?
Obrigado desde já


Envie seu comentário: