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!
Boa Tarde. Gostaria de saber se vc nao poderia me mandar por e-mail 2? Uma com 4 times e 5 jogadores, e outra com 3 times e 5 jogadores.
Edson, tudo bem?
No site disponibilizo uma planilha que gera as equipes automaticamente de acordo com a quantidade de inscritos e quantidade de participantes por equipe. Faça o download no link:
https://www.exceldoseujeito.com.br/downloads/?download_id=22
Para ter uma planilha com 4 times de 5 jogadores: Preencha a lista com 20 nomes e defina o número máximo de jogadores para 5;
Para ter uma planilha com 3 times de 5 jogadores: Preencha a lista com 15 nomes e defina o número máximo de jogadores para 5;
E assim por diante… Simples!
Um abraço.