22/05/2017

Dica: Criando Diretórios no Windows (Pastas e Subpastas)

Certa vez, precisei criar uma árvore de pastas no Windows. Lembro-me de ter sido uma tarefa bastante exaustiva, pois envolvia 200 pastas, e cada pasta continha cerca de 12 subpastas.

Não contente com o trabalha braçal, resolvi procurar por alguma solução alternativa para o meu problema.

E a resposta foi VBA! Irei explicar agora o desafio, e exemplificá-lo, para facilitar.

Antes de tudo, planilhei o nome das pastas que precisei criar, respeitando a seguinte hierarquia: criando primeiro as pastas principais, e em seguida suas subpastas.



Em seguida, fui até a área de código VBA, através do atalho "Alt + F11".
Inseri um novo módulo e escrevi o seguinte código:



O código em questão:

Sub criardir()
For i = 1 To 27
    MkDir (Range("A" & i))
Next
End Sub

Vamos à explicação do código:

O comando iniciado por For e encerrado por Next é um laço.
Isso significa que será repetido o que está entre o For e o Next por um número predefinido de vezes.

Para utilizar o For... Next, precisaremos de uma variável que receberá um valor a cada repetição.

Nesse caso, foi definido um valor pra variável "i": de 1 a 27. A partir disso, esse comando executa 27 repetições, onde, em cada uma delas o valor do "i" é alterado para o valor da repetição em questão, começando por 1, em seguida por 2, 3 e assim sucessivamente, sempre encerrando no Next e voltando para a primeira linha do For, até que se conclua as 27 repetições. Podemos também aproveitar o valor do "i" para questões que veremos a seguir.

Já o comando MkDir("Caminho do Diretório") é o responsável pela criação do diretório, sendo necessário respeitar a árvore hierárquica dos diretórios, criando primeiro as pastas raízes, como "T:\Diretorios", e em seguida as subpastas, como "T:\Diretorios\Empresa 1", e assim sucessivamente, como "T:\Diretorios\Empresa 1\Mes 1", "T:\Diretorios\Empresa 1\Mes 2".

O que fiz foi definir que, a cada vez que a função For se repita, dentre as 27 vezes definidas, o valor dentro do MkDir() seja o mesmo de uma das células que escrevi os nomes dos diretórios anteriormente na planilha.

O comando que pega o valor das células da planilha é o Range("A1") por exemplo, que pega o valor da célula A1 e trás para o VBA.
Porém, como eu queria o valor das células A1 até a A27, troquei a número da linha da célula de "1" pelo "i". Lembrando que o "i" será alterado a cada repetição do For... Next.

Dessa maneira, toda vez que o For rodar e der um novo valor para o "i", ele representará o número da linha da célula correspondente e me trará o valor contido nela, ficando assim: Range("A" & i). O caractere "&" serve para juntar a coluna "A" com a linha "i". Se o "i" vale 5, resultaria automaticamente em "A5".

Caso tenha que criar 1000 diretórios, basta ajustar o For, de 1 to 27 para For i = 1 to 1000.
E caso os nomes das pastas estejam em outra coluna, troque o A pela letra da coluna correspondente.

Bom, é isso!

21/05/2017

Dica: Renomear arquivos no Windows através do VBA no Excel

Se você precisa renomear arquivos no Windows, tenho aqui uma solução rápida para você.

No Excel, abra a área de códigos VBA através do atalho no seu teclado "Alt + F11".

Em seguida, insira um módulo: Inserir > Módulo.

Este Módulo surgirá na árvore de opções à esquerda, como Módulo 1. Clique sobre ele.

Agora teremos à direita a área onde o código será introduzido.

Mas antes, vamos às explicações:

Um arquivo precisa ser renomeado.
Certifique-se primeiro de que ele esteja fechado.
A seguir, precisará do endereço dele, ou seja, do diretório, nome e extensão do arquivo no seguinte formato:
"C:\Pasta\Arquivo.txt"
Nesse caso, preciso que meu Arquivo.txt seja renomeado para ArquivoTexto.txt.

A linha de comando é bem simples:
Name "x" as "y"
Sendo x entre aspas o diretório original, e y entre aspas o novo diretório, a ser renomeado.

No módulo VBA, digite a seguinte expressão:

Sub renomear()
Name "C:\Pasta\Arquivo.txt" as "C:\Pasta\ArquivoTexto.txt"
End sub

Por fim, execute o código clicando sobre o  Play "verde", na barra de tarefas acima e confira o resultado abrindo a pasta onde o arquivo se encontra.

Outro exemplo:

Sub renomear()
Name "C:\Pasta\Arquivo.txt" as "C:\Pasta\ArquivoTexto.txt"
Name "C:\Pasta\Arquivo2.txt" as "C:\Pasta\ArquivoTexto2.txt"
Name "C:\Pasta\MeuTexto.txt" as "C:\Pasta\ArquivoTexto3.txt"
Name "C:\Pasta\Planilha.xlsx" as "C:\Pasta\MinhaPlanilha.xlsx" 

End sub

Lembrando que esse método só convém ser realizado em modificações em massa. Você pode através do CMD gerar um log do comando DIR na pasta onde seus arquivos estão, e em seguida montar o código numa planilha de Excel, levando o resultado para um módulo VBA, executando-o em seguida.

Qualquer dúvida deixe seu comentário! ^_^

Função Super Trim

Na programação em geral, o termo TRIM refere-se à algoritmos para remoção de espaços extras contidos em um texto, ou seja, é uma espécie de faxina, que limpa alguns excessos.

Pensando nisso, fui além e elaborei uma função um pouco mais complexa, que realiza uma varredura não só nas bordas do texto, como também em seu interior.

Exemplo:
Texto antigo:
"Teste    de   limpeza de     espaços .  "
Após a aplicação da função que elaborei, teremos o seguinte resultado:
"Teste de limpeza de espaços."
Elaborei duas funções, sendo a SUPERTRIM a mais complexa, e a SUPERTRIMS a mais simples, porém com o mesmo resultado.

Se na célula A1 tivermos o seguinte texto:
"Só    estou    testando.  "
A função SUPERTRIM funcionará da seguinte maneira:
=SUPERTRIM( célula ou "texto" ; "texto a ser substituido" ; "pelo texto")
=SUPERTRIM(A1;"  ";" ")
Resultado: "Só estou testando."

Um outro exemplo seria o seguinte:
Ainda na célula A1, temos o seguinte texto:
"Só|estou||||||testando||||esta|função."
=SUPERTRIM( célula ou "texto" ; "texto a ser substituido" ; "pelo texto")
=SUPERTRIM(A1;"||";"|")
Resultado: "Só|estou|testando|esta|função."
Ou seja, a função SUPERTRIM não se limita somente a caracteres de espaços, podendo ela ser personalizada de acordo com cada necessidade.

Por outro lado, a função SUPERTRIMS é bem mais objetiva, porém seu alvo é especificamente o caractere de espaço.

Se na célula A1 tivermos o seguinte texto:
"Só        estou      testando.     "
A função SUPERTRIMS funcionará da seguinte maneria:
=SUPERTRIMS( célula ou "texto" )
=SUPERTRIMS(A1)
Resultado: "Só estou testando."

Segue funções:

Public Function SUPERTRIM(ByRef texto As String, ByRef caractere As String, ByRef newcaractere As String) As String
Dim textok(5000) As String
If caractere = "" Then
caractere = "  "
Else: End If
If newcaractere = "" Then
newcaractere = " "
Else: End If
textok(1) = texto
On Error GoTo endy
For i = 2 To 5000
textok(i) = WorksheetFunction.Substitute(textok(i - 1), caractere, newcaractere)
Next
endy:
SUPERTRIM = textok(i - 1)
End Function

Public Function SUPERTRIMS(ByRef texto As String) As String
Dim textok(5000) As String
caractere = "  "
newcaractere = " "
textok(1) = texto
On Error GoTo endy
For i = 2 To 5000
textok(i) = WorksheetFunction.Substitute(textok(i - 1), caractere, newcaractere)
Next
endy:
SUPERTRIMS = textok(i - 1)
End Function
É isso!

Função para Contar Caracteres Específicos no Texto de uma Célula

Outro dia surgiu a necessidade de contar quantos caracteres "@" (arroba) haviam no texto de uma célula.

Por exemplo, a célula A1 continha o texto: "meu@nome@é@esse@fim"

A fórmula retornaria o seguinte valor: 4, pois essa é a quantidade exata de @ dentro da célula.

Num outro caso, precisei contar quantos fragmentos de texto, como por exemplo, "meu_nome" haviam no texto de uma célula.

O texto era: "Aqui_entra_meu_nome_e_aqui_meu_nome_sai."

O resultado da função nesse caso seria: 2, pois o texto contém "meu_nome" duas vezes.

Se o texto que você quer está na célula A1, sua função precisará inserida em outra célula da seguinte forma:

Funcionamento: =CONTCAR( "defina aqui a célula ou algum texto" ; "defina aqui o que será procurado")
=CONTCAR(A1;"|")
Se a célula A1 aqui contiver o texto: "Meu|Número|é|123456", o resultado seria: 3, pois estaríamos procurando pela quantidade de caracteres "|" (pipe) no texto.


Segue função:

Public Function CONTCAR(ByRef Texto As String, ByVal Caractere As String) As Integer
Dim tamanho, tmn, total As Variant
total = 0
tamanho = Len(Texto)
tmn = Len(Caractere)
    For i = 1 To tamanho
 
        If Mid(Texto, i, tmn) = Caractere Then
     
            total = total + 1
     
        Else: End If
    Next
CONTCAR = total
End Function
Fim!

Função para lidar com Nomes de Arquivos

Segue aqui três funções que precisei criar em uma ocasião.

Elas servem para lidar com nomes de arquivos, exatamente como no exemplo a seguir:
A célula A1 contém o seguinte texto: C:\Pasta1\Subpasta1\ArquivoTeste.txt
Nesse caso, cada função irá retornar um resultado diferente, baseado no exemplo anterior.
A seguir, demonstro o resultado de cada função, caso estas sejam inseridas da seguinte forma em outras células:

=FILENAME(A1) resultaria em: ArquivoTeste
=FILEXT(A1) resultaria em: .txt  
=FILEDIR(A1) resultaria em: C:\Pasta1\Subpasta1\

Segue agora as funções para serem inseridas em um módulo VBA, através do "Alt + F11":


Public Function FILENAME(ByVal flname As String) As String
Dim FILEX As String
FILEX = StrReverse(Mid(StrReverse(flname), 1, WorksheetFunction.Find("\", StrReverse(flname), 1) - 1))
FILENAME = StrReverse(Mid(StrReverse(FILEX), WorksheetFunction.Find(".", StrReverse(FILEX), 1) + 1, 500))
End Function

Public Function FILEXT(ByVal flname As String) As String
Dim FILEX As String
FILEX = StrReverse(Mid(StrReverse(flname), 1, WorksheetFunction.Find("\", StrReverse(flname), 1) - 1))
FILEXT = StrReverse(Mid(StrReverse(FILEX), 1, WorksheetFunction.Find(".", StrReverse(FILEX), 1)))
End Function

Public Function FILEDIR(ByVal flname As String) As String
Dim FILEX As String
FILEDIR = StrReverse(Mid(StrReverse(flname), WorksheetFunction.Find("\", StrReverse(flname), 1), 500))
End Function

É isso!

Como começar: Macros – Vba para Excel

Dando seguimento à postagem anterior, veremos agora como fazer para começar a escrever os códigos e executá-los.

Primeiramente, o que caracteriza uma Macro e uma Função?

Simples, o nome de batismo. Haha

Seguinte, cada código precisa ter um início e um fim, já predefinidos pela linguagem VBA. Isso é uma regra.

O código de uma macro precisa necessariamente ser escrito entre as seguintes declarações:

Sub nomedamacro()

End Sub

E o código de uma função precisa ser escrito entre as seguintes declarações:

Public Function NOMEDAFUNCAO(ByVal valor as integer) as integer

End Function

Os código que irei publicar nas postagens a seguir já terão suas declarações realizadas, bastando apenas copiá-los e colá-los no seu editor de VBA dentro do Excel:

Recomendações:

Quando for introduzir um código ao VBA, vá na opção “Inserir > Módulo”, e verifique se o módulo foi criado, como no exemplo a seguir:



Agora sim introduza seu código no campo à direita e execute-o no caso de uma Macro:




Pronto!

Primeiros Passos no VBA para Excel

É claro que não poderia faltar uma introdução ao assunto VBA para Excel:

Você já deve ter ouvido a expressão “Macro” de alguma forma ligada ao Excel. Alguns a vêem como um bicho de 7 cabeças, mas calma, não é bem assim. Macro é apenas um conjunto de instruções que inserimos no computador para que ele execute, passo a passo, tudo o que sugerimos.

O VBA para Excel é uma linguagem de programação básica voltada para o MS Excel que serve para elaborar as macros, mas que também interage com outros recursos do Sistema Operacional MS Windows.

Através do VBA, podemos criar novas funções para o Excel, automatizar planilhas e rotinas, poupar tempo e energia, interagir com outros programas, realizar tarefas complexas em poucos segundos, elaborar soluções variadas para um mesmo problema, além de descobrir novas formas de usar o Excel. Acredito que nossa criatividade é o limite.

Para quem não conhece o VBA para Excel, podemos acessá-lo dentro do MS Excel através do atalho “Alt + F11”, ou clicar no menu “Exibir Código”, disponível quando clicamos com o botão direito do mouse sobre uma aba. A seguir um exemplo:


Em seguida, teremos a seguinte janela:


A partir daqui, podemos começar a escrever os códigos, ou até mais que isso, temos também a opções de “gravar rotinas”, para que nossos movimentos sejam escritos automaticamente pelo VBA enquanto às executamos, dando-nos a seguir a possibilidade de alterá-las e ir ajustando o código de acordo com as nossas necessidades.

As próxima postagens irão se referir ao conteúdo dos códigos, chamados de Macros, e tudo que eles são capazes de realizar.

Welcome!

Este será o meu depósito pessoal de tudo que venho aprendendo a respeito de VBA para Excel.

Algoritmos, dicas, funções que eu mesmo crio e demais informações a respeito dessa ferramenta.

Sinta-se em casa!

Dica: Criando Diretórios no Windows (Pastas e Subpastas)

Certa vez, precisei criar uma árvore de pastas no Windows. Lembro-me de ter sido uma tarefa bastante exaustiva, pois envolvia 200 pastas, e ...