Olá pessoas Excelentes.

Em um dia desses vi uma pergunta no Yahoo Respostas que dizia o seguinte:

Sou integrante/organizador de um horário de futebol semanal de 12 jogadores.
Gostaria de montar uma planilha no excel para sortear toda semana os times.
Assim, coloquei na coluna A2:A13 o nome de todos e na coluna B e C coloquei o time A e B, cada um com 6 jogadores.
Qual a fórmula que devo colocar para o sorteio sem repetição dos nomes?

 

Bem, não existe uma fórmula pronta que você possa fazer isso, mas, é possível programar o Excel para que ele realize esta tarefa por você. É claro que vamos precisar arregaçar as mangas, partir pro trabalho e criar uma rotina de macro para conseguir esta façanha.

Mas, estamos aí pra isso, não é mesmo?!!

Vou ensinar para vocês como desenvolver uma macro, simples, para montar uma tabela de equipes de um campeonato de futebol. A macro vai definir jogadores para cada time a partir de uma listagem geral de jogadores, e fará uma escolha aleatória entre os componentes dessa listagem.


Como exemplo, vamos criar uma planilha como esta.

Percebam que eu criei um botão Sortear Equipes, pois, será através dele que realizaremos o sorteio dos jogadores para as equipes.

Criando a Macro que Realiza o Sorteio

Vamos acessar o ambiente de desenvolvimento de macros do Excel, o editor VBA, teclando ALT+F11. Nosso projeto vai precisar de um módulo global e um módulo de classe.

Para adicionar um módulo, acesse o menu Inserir e clique em Módulo. Para o módulo de classe, também utilize o menu Inserir e clique em Módulo de classe.

Renomeie a classe que você acabou de inserir para Sorteio.

 

Aproveitando que já estamos utilizando o módulo Sorteio, vamos escrever o seu código.

Módulo Sorteio

Private listaSorteados          As String
Private totalDeItensDaLista     As Integer
Private listaGeral              As Range
Private totalSorteado           As Integer

Public Property Let setListaGeral(value As Range)
    Set listaGeral = value
    totalDeItensDaLista = listaGeral.Cells.Count
End Property

'---------------------------------------------------------------------------------
'---- Método que realiza os sorteios para a equipe informada ---------------------
' Escreve os resultados nas células do intervalo informado
' Parâmetros: rngEquipe -> o intervalo de células onde será escrito o nome dos
'                          jogadores da equipe
'---------------------------------------------------------------------------------
Sub Sortear(rngEquipe As Range)
Dim jogador As Range
Dim jogadorSorteado As Integer

    'Limpa as células do intervalo
    rngEquipe.ClearContents

    'Percorre cada célula e preenche com o Jogador sorteado para a equipe
    For Each jogador In rngEquipe
        'Obtém o sorteio do jogador. Retorna a linha da lista geral onde está o jogador selecionado
        jogadorSorteado = obterNovoItem

        If jogadorSorteado > 0 Then
            jogador.value = listaGeral.Cells(jogadorSorteado)   'Adiciona à equipe
        Else    'Se a listagem geral não possui mais jogadores para sortear, retorna a mensagem abaixo
            MsgBox "Lista chegou ao fim. Não foi possível gerar todas as equipes.", vbExclamation
            Exit For
        End If
    Next jogador

End Sub

'---------------------------------------------------------------------------------
'---- Função para verificar se o jogador já foi sorteado para alguma equipe ------
' Retorna verdadeiro ou falso
' Parâmetros: iPos -> um número da posição na lista geral que deseja verificar se
'                     já foi sorteado
'---------------------------------------------------------------------------------
Private Function jaFoiSorteado(ByVal iPos As Integer) As Boolean
Dim listaTemp As Variant
Dim i As Integer

    jaFoiSorteado = False
    listaTemp = Split(listaSorteados, ";")

    For i = 0 To UBound(listaTemp)
        If listaTemp(i) = iPos Then
            jaFoiSorteado = True
            Exit For
        End If
    Next i

End Function

'---------------------------------------------------------------------------------
'---- Função que realiza o sorteio para obter um novo jogador para a equipe ------
' Retorna um valor inteiro que corresponde a posição do jogador na lista geral
'---------------------------------------------------------------------------------
Private Function obterNovoItem() As Integer
Dim numEscolhidoTemp As Integer

    'Verifica se ainda há jogadores disponíveis para sortear
    If totalSorteado >= totalDeItensDaLista Then
        'Se não existir, retorna 0 (zero)
        numEscolhidoTemp = 0

    Else
        'Caso ainda existam disponíveis na lista geral, realiza o sorteio

        'Pega uma posição aleatória na lista
        Randomize
        numEscolhidoTemp = Int((totalDeItensDaLista * Rnd) + 1)

        'Repete o processo enquanto o número sorteado já tenha sido escolhido anteriormente
        Do While jaFoiSorteado(numEscolhidoTemp)
            Randomize
            numEscolhidoTemp = Int((totalDeItensDaLista * Rnd) + 1)
        Loop

        'Aloca o item sorteado na memória
        If listaSorteados = "" Then
            listaSorteados = numEscolhidoTemp
        Else
            listaSorteados = listaSorteados & ";" & numEscolhidoTemp
        End If

        'Contabiliza total de itens já sorteados
        totalSorteado = totalSorteado + 1

    End If

    'Retorna o item sorteado para a função
    obterNovoItem = numEscolhidoTemp
End Function

Private Sub Class_Initialize()
    'Zera os itens sorteados
    listaSorteados = ""
End Sub

Esse código está bem explicado e é bem genérico, ou seja, pode-se adaptar para diversas situações. Vamos para a próxima etapa, o código do Módulo1. Será neste módulo que vamos configurar todo o nosso processo de montagem das equipes, de acordo com nossa planilha. Vamos ao código que depois eu explico melhor.

Módulo1

Sub SortearTimes()
Dim sh As Worksheet
Dim jogadores As Range
Dim timeA As Range
Dim timeB As Range
Dim objSorteio As Sorteio

On Error GoTo Err_Macro

    Set sh = Sheets("Equipes")          'Define a planilha
    Set jogadores = sh.Range("A2:A13")  'Define a lista geral com todos os jogadores
    Set timeA = sh.Range("B2:B7")       'Define a lista de uma equipe
    Set timeB = sh.Range("C2:C7")       'Define a lista de outra equipe

    Set objSorteio = New Sorteio

    With objSorteio
        'Configura a lista com todos os jogadores
        .setListaGeral = jogadores

        'Realiza os sorteios para cada equipe
        .Sortear timeA
        .Sortear timeB
        '.Sortear sh.Range("D2:D7")      'Você também pode definir uma lista de equipe
                                        'informando diretamente o seu intervalo de células
                                        'na planilha

    End With

    MsgBox "Sorteio realizado.", vbInformation

Exit Sub
Err_Macro:
    MsgBox Err.Number & " - " & Err.Description, vbExclamation
    Exit Sub
End Sub

Vocês perceberam que o código possui algumas linhas de configuração, logo no início do método SortearTimes – aquelas linhas que começam com o comando Set. A seguir veremos como configurá-las.

Explicando e Configurando a Macro

Em nossa planilha Equipes temos na coluna A (Jogadores) os nomes de todos os jogadores disponíveis para montar os times. Nas colunas B e C temos as células para anotar os jogadores de cada equipe. Resumindo: Queremos que a macro pegue cada nome da coluna Jogadores e distribua de maneira aleatória em cada coluna dos times A e B, sem repetição, é óbvio.

Então, precisamos informar para a Macro onde estão cada um desses critérios.

Por isso, definimos a linha Set jogadores = sh.Range(“A2:A13″), pois, a lista com todos os jogadores está neste intervalo A2 até A13. Desse modo, fica claro que, se você tiver uma lista com mais jogadores, basta alterar essa configuração, aumentando o intervalo listado, ok.

Isso serve para as configurações das colunas das equipes também. Nós configuramos duas equipes de 6 jogadores cada uma. Você pode mudar tranquilamente, alterando a linha Set timeA = sh.Range(“B2:B7″) ou Set timeB = sh.Range(“C2:C7″).

Executando a divisão das equipes

Instaciamos a classe Sorteio e passamos os parâmetros necessários. O primeiro é informar a lista geral com todos os jogadores que participarão do sorteio (Nós já havíamos definido essa lista na variável jogadores, lembram!!!).

.setListaGeral = jogadores

Em seguida, realizamos o sorteio, propriamente dito, passando o intervalo de células onde será escrito o resultado, ou seja, também já o definimos anteriormente pelas variáveis timeA e timeB.

.Sortear timeA
.Sortear timeB

Depois disso, é só salvar o projeto e definir em um botão na sua planilha a chamada à macro SortearTimes.

Prontinho! É só clicar no botão que suas equipes serão montadas automaticamente.

 

Um abração galera. Deixei o arquivo de exemplo pra vocês baixarem, ok.

Se vocês gostarem do artigo, ajudem a divulgar pelo seu twitter, facebook, email. Segue a gente no twitter também.

Até a próxima!

Antes de efetuar o download do arquivo de exemplo, convido você a socializar conosco.

Escolha uma das opções abaixo. Seguir no twitter, assinar nossa Newsletter...

Isso nos ajuda na divulgação do site e te permite ficar sempre atualizado das novidades. Fico muito grato pela sua colaboração.

Digite seu email:

Você receberá um email para ativar o cadastro, ok!