Embaralha palavras

Segue aqui uma rotina que embaralha aleatoriamente uma lista de palavras.

O objetivo deste em específico é para criar testes para a minha filha maior, que está de férias, mas pode ter alguma outra utilidade, principalmente a sub-rotina de permutação.

Para deixar a tarefa um pouco mais simples, é possível manter a primeira e última letra.

Segue em anexo.

Anúncios

O evento duplo-clique no VBA

É muito simples e útil atrelar um código VBA que responde ao evento de duplo-clique numa planilha Excel.

Com ALT+F11, abrimos a tela de edição do VBA.

Duplo-clique na Planilha 1, e escolher as opções Worksheet e BeforeDoubleClick, conforme imagem abaixo.

O “Before double click” indica que o código vai rodar logo após o duplo-clique, antes de qualquer outra coisa (tipo o usuário escrever na célula).

O “target” é range que foi duplo-clicado.

Para capturar exatamente a linha e a coluna que foi clicada, o código usou target.row e target.column.

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

If Target.Row = 3 And Target.Column = 4 Then

    MsgBox “Duplo clique detectado”

End If

Cancel = True

End Sub

Nota: daria para escrever de outras formas, exemplo If Target.Address = “$d$3” Then …

Resultado:

Download do exemplo.


Ideias técnicas com uma pitada de filosofia: https://ideiasesquecidas.com

Ferramentas Excel-VBA: https://ferramentasexcelvba.wordpress.com/

SEND + MORE = MONEY

Este é um puzzle mais ou menos famoso.

Um estudante saiu de casa, e semanas depois, o pai recebeu a mensagem cifrada abaixo, dele pedindo dinheiro. Quanto ele estava pedindo?

Dá um certo trabalho de resolver matematicamente, tem que ficar usando a lógica e testando as opções que restam.

Mas, como a lista é de Excel, é muito fácil resolver a mesma utilizando força bruta pura: Testar todos números possíveis, até encontrar uma solução.

Sugiro que o leitor tente resolver o puzzle do jeito matemático e do jeito VBA antes de prosseguir.

O jeito VBA

Primeiro, para reduzir o espaço de busca, basta notar que M = 1. Qualquer dois algarismos somados (ex. 7+5=12, 8+3 = 11) sempre vai ser menor igual a 19, então M= 1.

O “O” só pode ser zero, ou forçando muito, 1 (se S for 9 e vier 1 da soma anterior). Mas vamos testar com 0.

‘É óbvio que m =1 e o = 0

m = 1

o = 0

‘O resto é força bruta.

‘Testar dígitos de 2 a 9, porque zero e um já foram.

‘O jeito é fazer um for aninhado:

For s = 2 To 9

    For e = 2 To 9

        For n = 2 To 9

                For d = 2 To 9

                    For r = 2 To 9

                        For y = 2 To 9

Além disso, o enunciado diz que tem que ser algarismos diferentes por número.

O “if” verifica se os números são diferentes, só prossegue se forem.

For s = 2 To 9

    For e = 2 To 9

        If e <> s Then

        For n = 2 To 9

            If n <> s And n <> e Then

            Etc…

                        For y = 2 To 9

                        If y <> s And y <> e And y <> n And y <> d And y <> r Then

                                ‘Checa resposta

                                checar s, e, n, d, m, o, r, y

A subrotina de checar monta os números finais e faz a verificação.

send = 1000 * s_ + 100 * e_ + 10 * n_ + d_

more = 1000 * m_ + 100 * o_ + 10 * r_ + e_

money = 10000 * m_ + 1000 * o_ + 100 * n_ + 10 * e_ + y_

If send + more = money Then

    MsgBox “Eureka: ” & send & ” + ” & more & ” = ” & money

End If

E qual a resposta do puzzle?

Rode a rotina do arquivo para ver.


Ideias técnicas com uma pitada de filosofia: https://ideiasesquecidas.com

Ferramentas Excel-VBA: https://ferramentasexcelvba.wordpress.com/

Bacteria wars

Segue um exemplo de aplicação do VBA. Mais ou menos inspirado no ‘evolved virtual creatures’ de Karl Sims (https://www.youtube.com/watch?v=JBgG_VSP7f8).

Você controla uma colônia de bactérias, contra uma colônia rival (computador).

Há três parâmetros: natalidade (quanto maior, mais se reproduz), longevidade (qto maior, maior a chance de não morrer por causas naturais) e ataque (qdo duas bactérias rivais ocupam o mesmo espaço, quem tem mais ataque tem mais chance de vencer). A restrição é distribuir 100% dos pontos nestes três critérios.

Vide arquivo aqui.https://1drv.ms/x/s!Aumr1P3FaK7jjjodaADPGp_Jljv_

Quem quiser sugerir melhorias e modificações, estou à disposição.

Att

VBA e Google Translate


Segue uma implementação de VBA que lê o texto na coluna A, e traduz para o inglês na coluna B.

Ele usa o Google Translate. Basicamente, abre um browser, consulta o Google Translate e retorna valor.

Como é a versão free, tem um limite de consultas, mas para uma lista pequena funciona bem.

Também podem ter erros de automação, porque é como se a macro abrisse um browser de verdade.


Link para download.

Inspirado em https://analystcave.com/excel-google-translate-functionality/


Ideias técnicas com uma pitada de filosofia: https://ideiasesquecidas.com

Ferramentas Excel-VBA: https://ferramentasexcelvba.wordpress.com/


Macro para atualizar a base de dados da tabela dinâmica

Como atualizar a fonte de dados de uma tabela dinâmica, para que ela leia certinho o número de linhas da fonte?

Uma forma simples de contornar o problema é colocar um range grande para a entrada da tabela dinâmica, digamos 500 mil linhas, e não ter que se preocupar com isto.  A desvantagem é que isto obriga o Excel a ler tais linhas, mesmo que vazias, aumentando o peso do arquivo.

Outra forma proposta é via macro, download aqui um exemplo.

Primeiro, lê quantas linhas têm na coluna A da Planilha 1 e joga na variável “nl”

Sheets(“Plan1”).Activate

‘Lê quantas linhas tem na coluna a, limitado a 100000 linhas

nl = Application.WorksheetFunction.CountA(Range(“a1:a100000”))

Depois atualiza a fonte de dados.

Há uma série de parâmetros aqui, o nome da tabela dinâmica, o range de dados. Uma forma fácil de obter esses parâmetros é gravando uma macro que atualiza a tabela, e depois apenas modificar o campo “SourceData”.

‘Preencher com o nome da tabela dinamica

‘É necessário também mudar a fonte de dados

‘No caso, “Plan1!R1C1:R” & nl & “C3”, está lendo da linha 1 coluna 1 (R1C1) até a linha nl coluna 3

ActiveSheet.PivotTables(“Tabela dinâmica1″).ChangePivotCache ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=”Plan1!R1C1:R” & nl & “C3”,   Version:=xlPivotTableVersion15)


Ideias técnicas com uma pitada de filosofia: https://ideiasesquecidas.com

Ferramentas Excel-VBA: https://ferramentasexcelvba.wordpress.com/

Quantas bobinas cabem num contêiner?


No comércio exterior, o termo “estufar” o contêiner significa colocar a carga dentro do contêiner.

Bobinas de pé, num contêiner, podem ser modeladas puramente por geometria.

O algoritmo (download aqui) pede as dimensões do contêiner, as características das bobinas, e sugere o arranjo ideal, restrito ao espaço disponível e à carga máxima permitida.

Outro exemplo:

Há softwares comerciais que fazem isto (ex. Max Load), fazendo também a composição de diferentes tipos de bobinas, e também é possível colocar bobinas deitadas, etc. Entretanto, são softwares bem mais complicados para usar. Para a aplicação simples como o caso acima, o algoritmo do anexo funciona.

Cuidado: só vale para bobinas em pé.


Ideias técnicas com uma pitada de filosofia: https://ideiasesquecidas.com

Ferramentas Excel-VBA: https://ferramentasexcelvba.wordpress.com/

Ferramentas Excel-VBA: https://ferramentasexcelvba.wordpress.com/