[Planilha Pronta] Detetive de Macros | Função Excel
Seis mulheres estão mortas por causa do Assassino Sem Sombra. Neste exato momento uma nova vítima está caída, sangrando, em uma rua de Londres.
Você é o renomado detetive John Walker. Conseguirá, você, usar de suas habilidades para capturar este assassino?
E aqui está o mais novo jogo do Função Excel, na verdade está mais para um piloto, um projeto. Mas tem bastante coisa aqui que muita gente gostaria de saber como se faz. Então além de disponibilizar o jogo, e deixar liberado todo o código, também iremos mostrar como são executadas algumas das funcionalidades do arquivo, que podem ser transferidas para outros projetos. (Clique aqui para ver o Campo Minado feito no Excel).
Antes de continuar, aqui está uma pequena lista de coisas que você pode aprender com este jogo. Não é indicado para iniciantes, mas àqueles que já tem algum conhecimento ou noção de macro VBA.
Como utilizar uma mesma variável em todos os módulos e userforms.
Como esconder o Excel e exibir somente o Userform, como se fosse um programa independente.
Como se referir a ma planilha com o nome que quiser.
Exibir imagens no userform de forma dinâmica.
Executar código assim que a planilha é aberta.
Executar código quando a planilha for fechada.
Esconder a barra de título dos userforms.
O jogo Detetive de Macros
O jogo nada mais é do que um livro em inglês que foi traduzido por um amigo meu, e implementado para funcionar como um jogo eletrônico no Excel. Nele você assume o papel de um detetive londrino, John Walker, e deve desvendar um mistério. Na tela é exibida uma história e algumas opções para seguir, dependendo de suas escolhas, você desvenda o mistério, ou não.
Basta clicar no link abaixo para fazer o download do jogo. Ele está zipado pois além do arquivo em Excel possui uma pasta com as imagens que ilustram a história.
Download "Detetive de Macros"	Função Excel - Detetive de Macros.zip – Baixado 685 vezes – 2 MB
Após baixar o jogo ,descompacte tudo em uma mesma pasta e abra o arquivo em Excel, é provável que você tenha que seguir estes passos:
É provável que apareça algum outro botão nesta mesma área. Apenas clique nele para que o arquivo possa funcionar normalmente.
Atenção – Após ter efetuado os passo acima, sempre que quiser visualizar a planilha deste arquivo novamente, você deverá abrir o arquivo duas vezes. Na primeira vez será exibido apenas o jogo, sem acesso ao Excel em si, mas com o jogo aberto, quando você tentar abrir novamente o arquivo, então este será exibido como Excel.
Agora sim, vamos ao que o Função Excel se propõe, ensinar.
O arquivo funciona quase que por completo via macro VBA. Possui apenas uma aba no arquivo em Excel que guia a macro e facilita adaptações/alterações na história do jogo. Sim, você pode usar exatamente este mesmo arquivo e criar uma história totalmente diferente da original, sem precisar nem tocar na macro.
A imagem abaixo mostra a planilha que contém a história e rege a macro.
Na coluna A temos um número que chamamos de página, este serve para localizar onde se encontra a próxima etapa de acordo com cada caminho escolhido pelo jogador.
Na coluna B está a história, ou descrição do momento atual em que o jogador se encontra.
Nas colunas de C a F estão as descrições dos possíveis caminhos que o jogador poderá tomar.
Nas colunas de G a J estão os números das páginas para onde o jogador será levado de acordo com cada opção selecionada.
É importante notar que as 3 primeiras linhas da planilha já estão ocupadas com algumas informações e cabeçalhos. Isso será importante mais pra frente para entender alguns trecho da macro.
A estrutura do código
Existem apenas três módulos, um nomeado de Inicializador, um nomeado de EstaPasta_de_trabalho e outro nomeado de Title_Bar_Hide. Existe também um único userform, nomeado de Jogo.
Módulo Inicializador
Curioso para saber como alterei as cores no meu código? Clique aqui para saber.
Este módulo é bem simples, nele apenas é definida uma variável pública do tipo integral chamada de Linha e uma macro simples.
Uma variável integral armazena números inteiros, e definimos ela como pública pois queremos ter a possibilidade de acessá-la em qualquer outro módulo ou userform, assim se em um código ela for definida como sendo igual a 10, por exemplo, em qualquer outro lugar que ela for necessária, seu valor continuará sendo 10, até ser alterada novamente.
Logo abaixo da definição da variável temos uma macro bastante simples, chamada Iniciar que ao ser executada apenas abre o userform Jogo.
Módulo EstaPasta_de_trabalho
Este pode ser considerado como um módulo padrão, que não é criado, todas as planilhas do Excel já vêm com ele embutido, são os módulos que se referem diretamente a própria planilha.
Nele temos duas macros privadas, o que significa que não são facilmente acessadas por outros módulos. A primeira delas se chama Workbook_Open e é executada assim que o arquivo é aberto, a segunda se chama Workbook_BeforeClose(Cancel As Boolean) e é executada imediatamente antes da planilha ser fechada. Estas duas estão com o nome em inglês pois não podem ser alterados, caso o sejam, não funcionariam no momento desejado.
A primeira delas faz com que o Excel fique em tela cheia, e desativa qualquer fator que possa levar o mesmo a aparecer na tela, de forma que este não pareça estar em execução, e então, abre o jogo.
Já o segundo faz com que todas estas opções desativadas anteriormente voltem ao padrão do Excel.
Módulo Title_Bar_Hide
Este é um módulo que adquiri pela internet. Bem mais complexo que os outros todos deste arquivos, e serve unicamente esconder a barra de título das janelas do userform, escondendo o título da janela e os tradicionais 3 botões do Windows de minimizar, maximizar e fechar.
Este módulo é apenas para enfeite, não interfere no funcionamento geral do jogo, mas caso deseja removê-lo, terá de remover todas as vezes em que aparece o trecho Call RemoveCaption(Me).
Userform Jogo
Agora sim chegamos ao momento mais aguardado. O jogo em si.
Ao selecionar o userform Jogo você verá a seguinte imagem.
Nela está a estrutura do jogo, formado por 5 botões, 4 de escolhas e um para sair do jogo. Além de uma imagem pequena e um campo de texto na esquerda. Nada além disso é criado durante o jogo, apenas os textos e as imagens exibidas serão alteradas com o desenrolar da história.
Para abrir o código do useform, faça como na imagem.
Existem algumas macros dentro do Jogo e irei uma a uma explicando todo o funcionamento.
Private Macro Userform_Initialize()
Este código é padrão para userforms, o que significa que seu nome já define uma função para ele, assim como as macro Workbook_Open e Workbook_BeforeClose no módulo EstaPasta_de_trabalho têm uma função específica já definida pelo nome. Este código é executado assim que o userform é iniciado.
Call RemoveCaption(Me) – Esta linha chama a macro que está no módulo Title_Bar_Hide para que esconda a barra de título do userform em questão assim que ele é executado. O (Me) faz referência ao próprio userform Jogo podendo ser substituído por Call RemoveCaption(Jogo).
Linha = 1 – Define que a variável criada no módulo Inicializador seja igual ao número 1.
Call Atualiza – Chama e executa a macro incluída dentro do próprio userform chamada Atualiza.
Private Sub Atualiza()
Este é o maior código que iremos encontrar por aqui, e que na verdade é bem pequeno. Ele atualiza todos os dados que são exibidos na tela ao jogador, ou seja, atualiza a imagem ilustrativa, e os textos das opções e da história.
Conforme mostramos anteriormente, o userform Jogo possui apenas 5 botões e um campo de texto, e o nome deles é bem sugestivo, o campo de texto se chama Texto e as opções se chamam Opção1, Opção2, Opção3 e Opção4.
O primeiro bloco de código desta macro busca da planilha do Excel qual o texto a ser exibido para cada um deles. (Lembre-se Me se refere ao próprio userform Jogo).
Me.Texto.Caption = Principal.Range("B" & Linha + 3).Value – Define que o texto a ser exibido no campo de texto nomeado de Texto que esta inserido no userform Jogo seja igual ao texto que está na coluna B da planilha Principal na linha que é definida pela variável Linha + 3, como Linha foi definida como sendo igual a 1 no momento em que abrimos o userform, então, o texto a ser exibido será aquele contido na célula B4 da planilha Principal.
Devo esclarecer duas coisas aqui:
O nome da planilha no Excel está como História mas me referi a ela como Principal, isso por que no VBA eu alterei o nome dela, da seguinte forma:
Lá no início eu havia dito para guardar na memória que a planilha tinha as 3 primeiras linhas já ocupadas, e portanto, o conteúdo relevante começava a partir da linha 4, é por conta disso que usamos o + 3.
As demais linhas deste bloco seguem a mesma lógica deste, alterando apenas o nome do objeto.
Em seguida temos um bloco que define quais dos botões devem ser exibidos ou escondidos de acordo com o número de opções disponíveis para o jogador naquele momento.
If Me.Opção1.Caption = "" Then
Me.Opção1.Visible = False
Me.Opção1.Visible = True
Este trecho testa se o texto exibido em cada um dos botões está em branco ou não. Caso estejam em branco, o botão é ocultado, caso contrário ele é exibido.
Agora sim, o que provavelmente você mais queria saber. (Ou pelo menos eu acho que você queria saber). O próximo trecho carrega e exibe a imagem ilustrativa do momento no jogo.
Dim FullImagePath As String
Inicialmente são definidas duas variáveis locais (não públicas) do tipo texto, uma chamada de FilePath e a outra chamada de FullImagePath ambas poderiam possuir qualquer outro nome, não faria diferença nenhuma aqui.
FilePath = ThisWorkbook.Path & "\Imagens\"
FullImagePath = FilePath & Linha & ".jpg"
Em seguida definimos que FilePath é igual a pasta em que este arquivo em Excel está salvo + a pasta "\Imagens\" ou seja, caso o arquivo estiver na pasta C:\FunçãoExcel então FilePath será igual a C:\FunçãoExcel\Imagem. Em outras palavras, FilePath irá indicar em qual pasta estão as imagens ilustrativas do jogo.
Por sua vez, FullImagePath irá se referenciar diretamente a uma imagem. Seguindo o exemplo anterior, e supondo que Linha seja igual a 1, então FullImagePath Será igual a C:\FunçãoExcel\Imagem\1.jpg
Aqui fica clara a relação entre a variável Linha, o número das páginas na coluna A da planilha e o nome das imagens.
If Dir(FullImagePath) = "" Then
Me.Ilustra.Picture = LoadPicture(FullImagePath)
Este trecho analisa se a imagem definida pelas variáveis existe na pasta ou não. Caso a imagens não seja encontrada o Excel sai da macro imediatamente, caso contrário, o objeto nomeado de Ilustra, contido no userform Jogo, recebe a imagem definida pela variável FullImagePath.
Private Sub Opção1_Click()
Entramos agora em 4 códigos que são acionados quando clicamos em uma das quatro opções disponíveis. apenas uma delas é diferente das demais, mas pouca coisa, vou axpliar somente esta, e já terei explicado todas.
Novamente esta macro é padrão dos userforms, o que significa que não pode ser renomeada pois afetará seu funcionamento. ela é executada no momento em que o botão nomeado de Opção1 for clicado.
If Me.Opção1.Caption = "FIM" Then
Linha = Principal.Range("G" & Linha + 3).Value
Call Atualiza
A primeira parte do código (única parte que difere dos demais botões de opção) verifica se o texto inserido no botão Opção1 é FIM ou não, caso seja a macro para de ser executada nesse momento, pois aqui é o fim do jogo.
Caso contrário, a variável Linha é redefinida para ser igual ao número contido na coluna G na linha atual (Definida ainda pela variável Linha) + 3. Caso não tenha entendido, volte um pouco nesse artigo no subtítulo Private Sub Atualiza().
Em seguida a macro Atualiza é chamada e executada.
Para encerrar, temos o último botão, de sair.
Este fecha o userform, redefine alguns estados padrões do Excel, e então fecha o programa como um todo. Ao clicar neste botão a macro Workbook_BeforeClose também será executada, já que está é executada imediatamente antes do fechamento do arquivo.
Espero realmente que tenha gostado e aprendido um pouco com este artigo, e com o jogo. Lembre que você pode alterar toda a história, mudar as imagens contidas na pasta de imagens e tudo funcionará da mesma forma.