Código VBA comentado do

ArquivoSorteio_MinhaCasaMinhaVida_03junho2013.mdb

que executa o sorteio aleatório (evento do botão Sortear do formulário Sortear)

 

Private Sub bot01_Click()

 

                'define variáveis

                Dim QtJaSorteado, QtDeNomes, InscricaoObtida, QuantJaSorteado, BuscaInscricao

                Dim QualLoteamento, falta01, falta02, QtPassou, QtDeInscritos

               

                'conta quantos sorteios já foram realizados

                QtJaSorteado = DCount("Ordem", "Sorteados")

                'conta quantos candidatos ao sorteio existem no cadastro

                QtDeInscritos = DCount("Inscricao", "Nomes")

               

                'verifica número de inscrição, se começa em 1 e se há falhas na numeração

                If QtDeInscritos <> DMax("Inscricao", "Nomes") Then

                               MsgBox ("ATENÇÃO: " & Chr$(10) & "O primeiro número de inscrição precisa começar em 1 e não pode ter falhas na numeração." & Chr$(10) & "Esse tipo de erro impede o sorteio.")

                               Exit Sub

                End If

               

                'se QtJaSorteado for maior do que 0 indicará que o sorteio foi interrompido (queda de energia, defeito no computador...)

                você pode simular essa situação utilizando CRTL+ALT+DEL para fechar o arquivo. Ao abrir exibirá o último sorteado

                If QtJaSorteado > 0 Then

                               If MsgBox("Deseja continuar o sorteio que já teve " & QtJaSorteado & " agora?", vbYesNo) = vbNo Then

                                               'sai do procedimento sem continuar o sorteio

                                               Exit Sub

                               End If

                Else

                               If MsgBox("Deseja executar o sorteio agora?", vbYesNo) = vbNo Then

                                               'sai do procedimento sem executar o sorteio

                                               Exit Sub

                               End If

                End If

               

                'se QtDeInscritos for menor do que a quantidade de imóveis não executa o sorteio

                'não justifica fazer o sorteio se há menos imóveis que candidatos

                If Abs(QtDeInscritos) < Abs(Me.TSort) Then

                               MsgBox ("Há mais imóveis (" & Me.TSort & ") do que candidatos inscritos (" & QtDeInscritos & ")." & Chr$(10) & Chr$(10) & "Para realizar o sorteio é preciso que os inscritos sejam em quantidade igual ou superior ao de imóveis.")

                               'sai do procedimento sem executar o sorteio

                               Exit Sub

                End If

               

                'Muda foco para a lista de sorteados

                Me.Lista01.SetFocus

               

                'Inicia um loop até obter a quantidade de inscrições definida no campo 'Total de Imóveis'

                Do

                               'Identifica quantas inscrições já foram sorteadas

                               QuantJaSorteado = DCount("Ordem", "Sorteados")

                              

                               'Encerra se a quantidade já sorteada for igual a quantidade do campo 'Total de Imóveis'

                               If Abs(QuantJaSorteado) = Abs(Me.TSort) Then

                                               Exit Do

                               End If

                              

                               'Executa a instrução Randomize para tornar aleatórios os números obtidos nos sorteios

‘Essa instrução será executada 456 vezes (1 para cada casa sorteada)

                               Randomize

                              

                               'Executa loop aninhado até achar uma inscrição que ainda não foi sorteada

                               Do

                                               'Executa cálculo aleatório e atribui à variável InscricaoObtida

                                               InscricaoObtida = Int((QtDeInscritos + 1) * Rnd)

                                               'Sai do loop aninhado ao encontrar matrícula ainda não sorteada

                                               If IsNull(DLookup("InscricaoSorteada", "Sorteados", "InscricaoSorteada=" & InscricaoObtida)) Then Exit Do

                               Loop

                              

                               'Identifica de qual loteamento fará parte o sorteio atual (InscricaoObtida)

                               'Muda a cor do loteamento que estiver sendo sorteado para amarelo

                               If QuantJaSorteado < Me.nbyQtImoveis Then

                                               QualLoteamento = Me.txtLoteamento01

                                               Me.falta01.BackColor = 10092543

                                               Me.falta02.BackColor = 16777164

                                               Me.nbyQtImoveis.BackColor = 10092543

                                               Me.nbyQtImoveis02.BackColor = 16777164

                                               Me.txtLoteamento01.BackColor = 10092543

                                               Me.txtLoteamento02.BackColor = 16777164

                               Else

                                               QualLoteamento = Me.txtLoteamento02

                                               Me.falta02.BackColor = 10092543

                                               Me.falta01.BackColor = 16777164

                                               Me.nbyQtImoveis02.BackColor = 10092543

                                               Me.nbyQtImoveis.BackColor = 16777164

                                               Me.txtLoteamento02.BackColor = 10092543

                                               Me.txtLoteamento01.BackColor = 16777164

                               End If

                              

                               'Localiza a matrícula e o nome do sorteado na consulta que identifica homônimos

                               Me.SorteadoAtual = DLookup("NomeHomonimo", "ListaHomonimos_02", "Inscricao=" & InscricaoObtida)

                              

                               'Oculta mensagem padrão de inclusão e faz a inclusão de 1 registro na tabela 'Sorteados'

                               DoCmd.SetWarnings False

                               DoCmd.RunSQL "INSERT INTO Sorteados (InscricaoSorteada, QualLoteamento ) SELECT " & InscricaoObtida & ",'" & QualLoteamento & "';"

                               DoCmd.SetWarnings True

                              

                               'Identifica quantas inscrições já foram sorteadas

                               QuantJaSorteado = DCount("Ordem", "Sorteados")

                              

                               'Identifica a quantidade de inscrições que faltam para sortear

                               If QuantJaSorteado > Me.nbyQtImoveis Then

                                               QtPassou = QuantJaSorteado - Me.nbyQtImoveis

                               Else

                                               QtPassou = 0

                               End If

                               If QtPassou = 0 Then

                                               Me.falta01 = Me.nbyQtImoveis - QuantJaSorteado

                                               Me.falta02 = Me.nbyQtImoveis02

                               Else

                                               Me.falta01 = 0

                                               Me.falta02 = (Me.nbyQtImoveis + Me.nbyQtImoveis02) - QuantJaSorteado

                               End If

                              

                               Me.Lista01.Requery

exibe número do sorteado e fica aguardando operador pressionar OK para continuar

                               MsgBox "Inscrição Sorteada:" & Chr$(9) & InscricaoObtida, , "Sorteio"

               

                               'sai do loop quanto atingir o total dos dois loteamentos

                               If Abs(QuantJaSorteado) = Abs(Me.TSort) Then Exit Do

                Loop

               

                'Retorna a cor dos campos e exibe mensagem de encerramento

                Me.falta02.BackColor = 16777164

                Me.falta01.BackColor = 16777164

                Me.nbyQtImoveis02.BackColor = 16777164

                Me.nbyQtImoveis.BackColor = 16777164

                Me.txtLoteamento02.BackColor = 16777164

                Me.txtLoteamento01.BackColor = 16777164

                MsgBox "Concluído processo de sorteio!" & Chr$(10) & Chr$(10) & "Feche o formulário para imprimir os relatórios."

                              

End Sub

 


Dica:

 

 

Comentário: não há nenhum tipo de proteção no arquivo. Mensagens do Microsoft Access de versões superiores a 2000 podem ser exibidas dependendo do nível de segurança de macro e código estabelecidos em seu computador.

 

Importante:

 

 

Comentário: a instrução Randomize é chamada antes de cada sorteio (456 casas = 456 chamadas) e o intervalo entre um sorteio e outro é ditado pelo ritmo da leitura dos nomes o que torna mais aleatório o processo.

 

Instrução Randomize

Inicializa o gerador de números aleatórios.

Sintaxe

Randomize [number]

O argumento opcional number é uma Variant ou qualquer expressão numérica válida.

Comentários

Randomize utiliza number para inicializar o gerador de números aleatórios da função Rnd, dando-lhe um novo valor de semente (um valor inicial utilizado para gerar números pseudo-aleatórios). Por exemplo, a instrução Randomize cria um número semente. Se você omitir number, o valor retornado pelo cronômetro do sistema será utilizado como o novo valor de semente.

Se Randomize não for utilizado, a função Rnd (sem argumentos) utilizará o mesmo número como uma semente a primeira vez é chamada, e daí em diante utilizará o último número gerado como valor semente.

Observação
Para repetir sequências de números aleatórios, chame Rnd com um argumento negativo imediatamente antes de utilizar Randomize com um argumento numérico.
Utilizar Randomize com o mesmo valor de number não repete a seqüência anterior.

Exemplo da instrução Randomize

Este exemplo utiliza a instrução Randomize para inicializar o gerador de números aleatórios. Como o argumento de número foi omitido, Randomize utiliza o valor de retorno da função Timer como o novo valor semente.

 

Dim MyValue

Randomize            ' Inicializa o gerador de números aleatórios.

 

MyValue = Int((6 * Rnd) + 1)            ' Gera um valor aleatório entre 1 e 6.

Texto retirado da ajuda do Microsoft Access 2003