Desenho de padrões com círculos

Quando eu era adolescente, vi uma espécie de régua, que permitia fazer padrões bonitos a partir de elipses.

Era um negócio desse tipo:

Ver a imagem de origem

Dá para fazer algo mais ou menos parecido, com apenas um comando VBA: o de plotar círculos. O formato é o seguinte:

ActiveSheet.Shapes.AddShape(msoShapeOval, x, y, comprim, largura)

Para plotar um círculo, devemos saber a posição dele (x,y), o comprimento e largura. Se é um círculo e não uma elipse, comprimento = largura = raio.

O resto dos comandos serve apenas para apagar desenhos antigos, colorir e posicionar os novos círculos.

Algumas convenções:

  • Número de círculos é o número de círculos a plotar.
  • O raio menor é o raio desses círculos.
  • O raio maior é o raio em torno da qual os círculos são plotados
  • E o ângulo, em graus, é o ângulo entre um círculo e outro.

A ilustração a seguir dá uma ideia desses parâmetros.

Obs. Como o ângulo é divisor de 360 graus, tem hora que os círculos ficam um sobre o outro.

Com apenas esses conceitos, é possível gerar algumas variações interessantes.

Planilha para download no Github. Para rodar, é necessário ativar macros.

Outras sugestões são bem-vindas.

Versão web em SVG:

https://asgunzi.github.io/CirculosSVG/

https://ideiasesquecidas.com/

Imagens em gráficos

Os gráficos do Excel podem ser preenchidos com cores, padrões, e também com imagens.

Esta última opção por ser bastante útil.

Primeiro, inserir um gráfico comum.

Clicando com o botão direito no gráfico, Formatar Série de dados -> Preenchimento.

Há várias opções de preenchimento. Escolher Preenchimento com imagem.

Deve-se escolher a imagem a ser colocada.

Resultado abaixo.

Há alguns gráficos, como o de área ou de barra, que são bons para este tipo de técnica.

Outro exemplo:

Vide arquivo no OneDrive

Grafico com imagens.xlsx

Veja também:

https://ideiasesquecidas.com/

Triângulo de Pascal em Excel

O triângulo de Pascal, em homenagem ao matemático Blaise Pascal, tem uma regra de formação bastante simples. Download aqui.

Cada linha começa e termina com 1. Os demais valores são a soma dos dois números acima da célula.

Ex. O valor 4 abaixo é a soma de 1 e 3, da linha acima.

Pascal - research

É bem simples criar um triângulo desses em Excel. É basicamente, colocar células de somar na posição correta.

A implementação em anexo utiliza macros, mas é a mesma ideia. Para colorir, é só usar formatação condicional.

Fica como exercício para casa: criar uma implementação do triângulo de Pascal.

Curiosidade: o mesmo triângulo é conhecido desde a antiguidade, sendo redescoberto em várias culturas.

Ideias técnicas com uma pitada de filosofia

https://ideiasesquecidas.com/

Intervalos e desloc – solução

Em relação ao post anterior, https://ferramentasexcelvba.wordpress.com/2020/04/08/exercicio-de-intervalos-e-funcao-desloc/

Planilha para download.

A função “corresp” é uma função de busca, similar ao procv. Porém, ela retorna a posição do valor, o índice.

Corresp(valor, range de busca, busca exata ou maior)

Abaixo, corresp da data (06/01/2020) vai retornar 9

Primeira ocorrência (posição)

=CORRESP($H$4;$B$3:$B$206;0) – a busca exata vai dar a primeira ocorrência.

Abaixo, corresp da data (06/01/2020) vai retornar 12

Última ocorrência (posição)

=CORRESP($H$4;$B$3:$B$206;1) – coloquei o parâmetro “1”, então vai buscar o último valor do dia 06/01/2020

Número de transações: pode ser um cont.se, e também pode ser a diferença entre a última ocorrência e a primeira

Primeira ocorrência:  utilizar a função desloc. É como um mapa do tesouro. A partir de um ponto inicial, ande y casas para baixo e x casas para a direita.

=DESLOC($B$2;H11;2)

A referência é a célula B2. Ando para baixo o número de casas da primeira ocorrência. Ando para a direita 2 casas, porque quero buscar o valor.

Primeira ocorrência:  a mesma coisa, usar desloc. Só que ao invés de andar a primeira ocorrência, uso a posição da última ocorrência

=DESLOC($B$2;H12;2)

Para média, mín e máx, o truque é semelhante.

Uso a função =MÉDIA(intervalo)

A questão é definir o intervalo.

Aí, a função desloc ajuda novamente. Ela pode retornar um número, como acima, mas também pode retornar um intervalo.

São 5 parâmetros para o desloc: 1 – ponto de partida, 2 – casas para baixo a deslocar, 3 – casas para direita, 4 – range de linhas do intervalo, 5 – range de colunas do intervalo

O range de linhas é o cont.se da célula H4. O range de colunas é 1.

A fórmula final:

Média =MÉDIA(DESLOC($B$2;$H$11;2;$H$14;1))

Mínimo do dia =MENOR(DESLOC($B$2;$H$11;2;$H$14;1);1)

Máximo do dia =MAIOR(DESLOC($B$2;$H$11;2;$H$14;1);1)

É possível utilizar a função “INDIRETO” para alguns desses cálculos. É a mesma ideia.

Corresp e Desloc são formas indiretas, um pouco mais abstratas, de referenciar dados. É como um ponteiro em C. São um pouco mais avançadas, porém, bastante poderosas.

Ideias técnicas com uma pitada de filosofia

https://ideiasesquecidas.com/

Exercício de intervalos e função desloc

Segue um exercício de intervalos e função desloc.

Tenho uma base de dados como a seguinte.

Quero digitar uma data.

O exercício é calcular:

– A posição da primeira ocorrência da data (em relação ao começo da lista)

– A posição da última ocorrência da data (em relação ao começo da lista)

Número de transações no dia
Valor da primeira ocorrência do dia
Valor da última ocorrência do dia
Média do valor do dia
Mínimo do dia
Máximo do dia

Deve-se utilizar apenas uma fórmula em cada célula da resposta.

Obs. Considerar que os dados acima estão ordenados em ordem crescente de data.

Exemplo: para a data 05/01/2020, tenho os seguintes resultados:

Dica: utilizar funções corresp e desloc.

Como criar um timer no Excel

O método Pomodoro – vide este post – precisa de um timer para funcionar.

Há timer no celular, apps, etc, mas é um projetinho interessante para fazer em Excel (alguém tem outras formas de fazer? Sugestões são sempre bem-vindas).

1) Basicamente, o timer utiliza a função Sleep (de dormir). É uma função que não faz nada enquanto não passar o tempo estabelecido.

Por exemplo:

    Sleep (1000) ‘Espera 1000 milisegundos, ou seja, 1 segundo

É uma função do Windows, então é necessário importar a dll. Segue um exemplo de código a seguir, também na planilha anexa.

Public Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal Milliseconds As LongPtr)

Sub teste()

    Sleep (2000) ‘Espera 2000 milisegundos

    executar

End Sub

Sub executar()

    MsgBox (“Teste”)

End Sub

2) Sobre o timer.

A macro lê o número de minutos a esperar. Multiplica por 60 para transformar em segundos.

Depois, manda atualizar o mostrador uma vez por segundo, decrescendo o valor a esperar.

O resto das contas é só para transformar o número de segundos de volta para minutos.

Por exemplo, 244 segundos = 4 minutos e mais 4 segundos.

Divido 244 por 60 e pego a parte inteira, utilizando um arrendondar para baixo.

intMin = Math.Round((Nminutos * 60 – counter) / 60 – 0.49999999, 0)

Se faltam 4 minutos, e 4*60 =240, então são 4 segundos para completar o valor original.

Portanto, estabeleça o número de minutos a esperar, ligue o timer, e concentre-se somente no trabalho a ser realizado durante este período.

Vide arquivo https://lnkd.in/eBxyAQZ.

O andar do bêbado

Modelos do tipo “Random walk” são amplamente utilizados para fenômenos probabilísticos.

A ideia básica é bem simples.

Imagine um bêbado, que está numa posição de coordenadas (0,0).

Como ele está chapado, ele pode dar um passo numa direção aleatória qualquer.

Traduzindo numa fórmula, seria Posição(t+1) = Posição(t) + aleatório(), ou seja, sua posição futura depende da posição atual, mais o passo aleatório.

Nota: a função aleatória do Excel varia de 0 a 1. Queremos que ela varie de -0,5 a 0,5 (para considerar que o bêbado pode andar para trás também). Portanto, a ideia é simplesmente utilizar (aleatório() – 0.5).

Colocando as fórmulas numa planilha, resulta num gráfico deste tipo:

Clicando F9, o Excel realiza um novo sorteio do passo aleatório:

Planilha para download.

Ideias técnicas com uma pitada de filosofia

https://ideiasesquecidas.com/

Joguinho de luzes

Uma aplicação de vba para colorir shapes.

Download aqui.

Cada seta troca as cores das luzes nos círculos – se estiver apagada, acende, e vice-versa.

O joguinho é deixar todas as luzes verde com o menor número de cliques.

É necessário ativar macros.

O joguinho ficou fácil demais. Se alguém tiver alguma ideia interessante, favor indicar.

Ler arquivo e salvar

Segue um desafiozinho.

Criar um código (vba, python, etc), que leia a lista de números em Lista.xlsx, acrescente 1 a cada valor da lista, e salve um segundo arquivo, Lista2.xlsx com os novos valores.

Lista.xlsx

Segue uma solução possível.

wbAtual = ThisWorkbook.Name

ReDim vetor(1 To 59) ‘Vetor para conter a lista

‘Comando workbooks.open para abrir o arquivo

‘Fornecer o endereço (ou colocar na mesma pasta)

Set wkb = Workbooks.Open(“C:\Analytics\Lista.xlsx”)

‘Abre a planilha 1 do workbook Lista.xlsx

wkb.Worksheets(“Planilha1”).Activate

For i = 1 To 59

    vetor(i) = Range(“a” & i + 1) ‘Para ler cada linha

Next i

‘Fecha o workbook

wkb.Close SaveChanges:=True

‘===================

‘Volta ao workbook original

Workbooks(wbAtual).Activate

‘Adiciona um e cola na planilha

For i = 1 To 59

    Range(“a” & i + 1) = vetor(i) + 1

Next i

‘salva com o nome Lista2

ThisWorkbook.SaveAs “Lista2”

Se for executado mais de uma vez, vai aparecer um pop up, perguntando se quer sobrescrever o arquivo existente. Clique em Sim, e está concluído.

2) Código semelhante no python. Note que são apenas 4 linhas para fazer a mesma coisa.

import pandas as pd

#Le o arquivo utilizando o módulo pandas

df = pd.read_excel(io=’Lista.xlsx’, sheet_name=’Planilha1′, usecols = “A”)

#A manipulação de dataframes tem a sua própria lógica, mas o código a seguir funciona

df[‘Lista’] = df[‘Lista’].apply(lambda x: x+1)

df.to_excel(“Lista2.xlsx”, sheet_name=’Planilha1’)

2) Código semelhante no python. Note que são apenas 4 linhas para fazer a mesma coisa.

import pandas as pd

#Le o arquivo utilizando o módulo pandas

df = pd.read_excel(io=’Lista.xlsx’, sheet_name=’Planilha1′, usecols = “A”)

#A manipulação de dataframes tem a sua própria lógica, mas o código a seguir funciona

df.to_excel(“Lista2.xlsx”, sheet_name=’Planilha1’)