domingo, 11 de novembro de 2018

Posicionando o cursor na tela com o VBA

Em vários programas tive esse problema: ao selecionar uma célula pelo VBA, o cursor vai até a célula, porém a tela não rola e as vezes o cursor fica fora da área visível da planilha, apesar de selecionada.

Segue o comando para contornar esse problema e deixar sempre a célula selecionada no topo da tela.
Experimentem o comando na janela de verificação imediata do VBA para ver a diferença.

;-)


range("Z200").Select 


Application.Goto Reference:=Worksheets("plan1").Range("Z200"), scroll:=True

sábado, 27 de outubro de 2018

Copiando texto de imagem

Antigamente tínhamos vários softwares do tipo "OCR" - Optical Character Recognizer que extraiam textos de imagens, muitos com índice de acerto baixo (minha opinião) dado que as imagens precisavam ter uma resolução muito boa.

O OneNote que faz pate do pacote Office já tem esse recurso.
Conheço poucas pessoas que utilizam esse programa, mas para quem tiver curiosidade, eu recomendo, pois ele é muito útil para anotações diversas nas quais podem ser inseridos imagens, arquivos, textos, prints de telas, etc.

Um programa semelhante e muito útil que também recomendo, é o Keep do Google, vale a pena dar uma olhada para conhecer.

Bem, para extrair o texto pelo OneNote é bem simples:
Basta inserir a imagem em alguma anotação, clicar com o botão direito e selecionar "Extrair texto da imagem".
Obviamente, o texto não será 100% reconhecido, mas dependendo da imagem, o índice de acerto será muito bom.

;-)






domingo, 29 de julho de 2018

Pendrive Sony ou Multilaser?

Em qual marca você confia mais, Sony ou Multilaser?

;-)




segunda-feira, 16 de julho de 2018

Programa para particionar discos

Segue dica de um programa leve e o que é melhor, gratuito, para particionar discos.
Funcionamento muito parecido com o famoso Partition Magic.
Para quem precisa só para tarefas básicas, resolve muito bem.

https://www.minitool.com/partition-manager/partition-wizard-home.html

No site do desenvolvedor, tem diversas outras ferramentas para recuperação de dados em várias mídias, vale a pena dar uma olhada.

;-)



segunda-feira, 25 de junho de 2018

Formatar rapidamente uma planilha

No meu trabalho, todos os dias exporto dados de outros aplicativos para o Excel, seja para análise de dados ou para envio a outros colegas e quase sempre as colunas estão na largura padrão fazendo com que as informações fiquem sobrepostas ou truncadas.
Nada complicado, basta ajustar a largura das colunas e algumas vezes, a altura da linha e tudo bem, mas como no meu caso é repetitivo, crei uma macro que faz isso rapidamente.
Ganho muito em produtividade e os destinatários das minhas planilhas também.
A macro em si é muito simples, mas fica a dica para ganhar tempo em pequenas tarefas recorrentes, que somados, representam um ganho significativo no fim do dia.

Sub AjustaColunas()
'
' Formata Macro
'
' Atalho do teclado: Ctrl+Shift+F
'
    Cells.Select
    Selection.RowHeight = 15
    Cells.EntireColumn.AutoFit
    Range("A2").Select
    ActiveWindow.FreezePanes = True
    
End Sub




domingo, 24 de dezembro de 2017

Ler arquivo dentro de uma pasta que está dentro de um arquivo ZIP

O código não é meu, vou deixar o link aqui para futuras consultas.
Utilizei recentemente e funciona sem problemas.

;-)

Original em:

http://www.vbforums.com/showthread.php?815681-List-files-from-zip-file-(vba)


Private Sub CommandButton1_Click()
    zpath
End Sub


Sub zpath()
    Dim sh, n
    Dim PathFilename As Variant
    
    Dim FileName As String
    FileName = "temp.sql"
    
    PathFilename = Application.GetOpenFilename("ZipFile (*.zip), *.zip")
    If PathFilename = "False" Then Exit Sub
     
    TextBoxPath.Value = PathFilename
    
    Set sh = CreateObject("shell.application")
    Set n = sh.Namespace(PathFilename)
    recur sh, n
End Sub

Sub recur(sh, n)
    Dim i, subn
    For Each i In n.items
        If i.isfolder Then
            Set subn = sh.Namespace(i)
            recur sh, subn
            Else
            Debug.Print i.Path
        End If
    Next
End Sub

domingo, 17 de dezembro de 2017

Separar conteúdo de célula em linhas

Para isto, basta determinar onde está o caracter ASC(10) que é  Line Feed e depois separar em linhas conforme a quantidade de caracteres entre os Line Feeds.

Abaixo um exemplo.
Option Explicit

Sub Separa()

    Dim i               As Integer
    Dim x               As Integer
    Dim inicio          As Integer
    Dim contador        As Integer
    Dim caracteres      As Integer
    
    ReDim posicao(50) As Integer
    ReDim texto(50) As String
    
    'Determinar onde estão as quebras de linha
    For i = 1 To Len(Range("A1"))

        If Asc(Mid(Range("A1").Value, i, 1)) = 10 Then
            posicao(contador) = i
            contador = contador + 1
        End If
               
    Next
    
    'Quebrar o texto
    inicio = 1
    caracteres = posicao(0)
    
    'Primeiro
    Debug.Print Mid(Range("A1").Value, inicio, caracteres - 1)
    inicio = posicao(x)
    caracteres = posicao(x + 1) - posicao(x)


    'Segundo em diante
    caracteres = posicao(1) - posicao(0)
    For x = 1 To contador
    
        'Último texto
        If x = contador Then
            caracteres = Len(Range("A1").Value)
            texto(x) = Mid(Range("A1").Value, inicio + 1, caracteres - posicao(x) - 1)
            Debug.Print texto(x)
            Exit For
        End If
    
        texto(x + 1) = Mid(Range("A1").Value, inicio + 1, caracteres - 1)
        Debug.Print texto(x + 1)
        
        inicio = posicao(x)
            
        caracteres = posicao(x + 1) - inicio
        
    Next
 
End Sub




domingo, 3 de dezembro de 2017

Facas e canivetes podem te levar para a cadeia! - No fio da navalha Ep.23

Não tem nada a ver com o escopo deste blog, mas isto precisa ser divulgado.





terça-feira, 23 de maio de 2017

Eliminar a última tela preta da apresentação

Para evitar a tela preta tradicional no final de uma apresentação de slides no Powerpoint, basta entrar em Arquivo > Opões > Avançado > Apresentações de slides e desmarcar a opção "terminar com slide preto".

;-)



sábado, 22 de abril de 2017

Alinhando texto no Word

Esta é uma técnica largamente utilizada na elaboração de contratos no Word.
Trata-se de uma tabela que conterá texto em suas células onde o alinhamento (esquerda, direita, centro, superior, inferior, etc.) funciona igual ao Excel, com a qual a maioria das pessoas já está familiarizada.
Após o alinhamento efetuado, basta deixar as linhas das bordas da tabela invisíveis, vejam o resultado abaixo.

;-)



sábado, 18 de março de 2017

Preenchendo tabela no Word com VBA

Automatizar tarefas no Word não é algo muito comum, desde que comecei a programar no Office, vi muito pouca coisa nesse sentido.
Para registro, vou postar alguns códigos para que sirva de aprendizado para quem está começando e para consultas aos que já utilizaram e esquecem de vez em quando (como eu...).
Abaixo 3 formas de se referenciar células de uma tabela no Word, lembrando que o uso de tabelas é muito útil principalmente em documentos que devem ser preenchidos como contratos, recibos, etc.


;-)




Option Explicit

Sub PreencheCelula()

    ActiveDocument.Tables(1).Rows(1).Cells(2).Range.Text = "Linha 1, coluna 2"
    
    ActiveDocument.Tables(1).Cell(2, 2).Range.Text = "Linha 2, coluna 2"

    ActiveDocument.Tables(1).Columns(2).Cells(3).Range.Text = "Linha 3, coluna 2"

End Sub

sábado, 11 de março de 2017

Cálculo de dígito verificador - módulo 10

O código do módulo 11 está perdido em algum lugar no blog, vou deixar aqui o cálculo do módulo 10.

;-)


Public Function modulo_10(sOrigem As String) As String
' Função para cálculo do dígito de auto conferência
    Dim iK          As Integer ' Contador
    Dim iValor      As Integer ' Variável para acumular valor
    Dim iDigito     As Integer ' Variável para o conteúdo de cada posição
 
    iValor = 0
    For iK = Len(sOrigem) To 1 Step -2      ' Inicia o laço começando da direita para a esquerda pulando 2 posições
        iDigito = (Val(sOrigem) \ (10 ^ (Len(sOrigem) - iK))) Mod 10
       
        If (iDigito * 2) >= 10 Then ' Se a multiplicação for maior ou igual a dez, soma-se os dígitos separadamente
            iValor = iValor + (((iDigito * 2) \ 10) + (iDigito * 2) Mod 10)
        Else ' Senão, multiplica-se e soma-se ao total
            iValor = iValor + (iDigito * 2)
        End If
       
        If (iK - 1) <= Len(sOrigem) Then
            ' Se não ultrapassar otamanho da string, soma-se ao total
            iDigito = (Val(sOrigem) \ (10 ^ (Len(sOrigem) - (iK - 1)))) Mod 10
            iValor = iValor + iDigito
        End If
    Next iK
 
    modulo_10 = Trim(Str((10 - IIf((iValor Mod 10) = 0, 10, (iValor Mod 10)))))
    ' Retorna o DAC
End Function

sexta-feira, 10 de março de 2017

Como deixar o Google Maps mais rápido

As vezes o Google Maps fica irritantemente lento e para isso segue uma dica.
No link do Maps, acrescente uma vírgula e "force=lite" conforme abaixo:

https://www.google.com.br/maps/@-23.5679681,-46.5403448,15z?hl=pt-BR,force=lite

Obviamente que os cuidados básicos devem ser tomados como limpeza de arquivos temporários, cookies, etc.

;-)



quarta-feira, 8 de março de 2017

Somente números numa caixa de texto

Método para não permitir a digitação de caracteres não numéricos numa caixa de texto:

Private Sub Texto1_KeyPress(KeyAscii As Integer)

    If InStr(1, "0123456789" & vbKeyDelete & Chr(8), Chr(KeyAscii)) = 0 Then
    KeyAscii = 0
    End If

End Sub


;-)

segunda-feira, 6 de março de 2017

Extraindo só números de uma célula da planilha

Deve haver dezenas de maneiras diferentes de fazer, vou deixar registrada aqui uma delas.

;-)





Public Function fn_SoNumeros(texto As String) As Double

    Dim i As Integer
    Dim valor As String
    
    Application.Volatile
    
    'Loop de 1 a quantidade de caracteres da célula
    For i = 1 To Len(texto)
        
        'Se caracter for numérico, concatena na string
        If IsNumeric(Mid(texto, i, 1)) Then valor = valor & Mid(texto, i, 1)
    
    Next
    
    fn_SoNumeros = valor

End Function

quarta-feira, 1 de março de 2017

Listar e-mails numa tabela do Access

As vezes a gente precisa de coisas diferentes e a necessidade acaba gerando códigos novos: como listar os e-mails numa tabela (com pouca adaptação, poderia ser uma planilha do Excel).

;-)


Sub Listar_emails_Access()
   
    Dim rst                 As New ADODB.Recordset
    Dim cnn                 As New ADODB.Connection
   
    Dim contador_itens      As Integer
    Dim nms                 As Outlook.NameSpace
    Dim fld                 As Outlook.MAPIFolder
    Dim itm                 As Object

    Set nms = Application.GetNamespace("MAPI")
    Set fld = nms.PickFolder
   
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & "C:Base.accdb"
   
    rst.Open "Tabela1", cnn, adOpenKeyset, adLockOptimistic
      
    contador_itens = fld.Items.Count

    For Each itm In fld.Items
        If itm.Class = olMail Then
            rst.AddNew
            rst!titulo = itm.Subject
            rst!Data = itm.ReceivedTime
            rst.Update
        End If
    Next itm
   
    rst.Close
    cnn.Close
   
    MsgBox "Fim"
 
End Subv

segunda-feira, 27 de fevereiro de 2017

Excel - Converter HTML de uma célula em texto

Aconteceu com um colega outro dia: ao importar um arquivo exportado no formato HTML, o texto veio com as tags dentro das células conforme mostra a figura na célula A1:


Numa rápida busca pela internet, consegui o código abaixo para resolver o problema (que na figura acima está na função da célula B1).
Não esquecer de marcar a referência no VBA:



Public Function ConverterHTML(textoHTML) As String

    Dim Hdoc As New HTMLDocument
    Hdoc.body.innerHTML = textoHTML
    ConverterHTML = Hdoc.body.innerText

End Function

Usando funções do Excel no VBA em outros aplicativos

Algumas funções do Excel não existem no VBA e reescrevê-las é trabalhoso, fora o risco de errar no cálculo.
Para isso, você pode referenciar o Excel no VBA e utilizar a função nativa dele, vejam um exemplo com a função XTIR (lembrando que em inglês chama-se de XIRR):



;-)

sábado, 25 de fevereiro de 2017

Sobre senhas de proteção de arquivos e códigos

Nos anos 80 era comum os programadores não compartilharem seus códigos pois não havia Google e conhecimento era praticamente sinônimo de emprego garantido.
Eu mesmo tive muita dificuldade em dar os primeiros passos em programação, as informações que a gente conseguia era somente pagando cursos especializados (para quem ainda não estava empregado na área).
É certo que cursos ensinam somente os primeiros passos, não há tempo hábil para passar todos os macetes de programação e se houvesse, o preço sera exorbitante.
Sorte de nós que hoje a internet proporciona uma fonte de aprendizado praticamente sem limites e reinventar a roda em programação, virou coisa do passado.
Ai vem a questão de proteger seu código achando que é algo inovador e realmente em precedentes.
Particularmente sou contra proteger códigos, acho egoismo e basta pesquisa no Google que rapidamente se acha algo equivalente que faz a mesma função. Tem muita gente disposta a compartilhar seus códigos e penso que o melhor disso é que, nosso esforço como programador, pode ser direcionado para problemas realmente novos. Exemplo típico é o cálculo do dígito verificador do CPF. Ninguém vai perder tempo escrevendo um programa para isso, pesquise na internet e em poucos segundos terá a solução pronta.
Outro dia num fórum de discussão, um colega queria uma forma de proteger uma planilha para que ninguém visualizasse ou copiasse parte do conteúdo, apesar de ser necessário ver os dados para poder operar a planilha! Respondi que seria impossível, qualquer um com celular pode tirar uma foto e mandar o recurso do "trave o Print Screen" para o espaço!
Bom, cada um faz o que acha melhor, fica aqui a minha opinião e um apelo: compartilhem seus conhecimentos!

;-)


Função para cálculo de parcelas - sistema PRICE

O Excel tem funções financeiras e dentre elas, o cálculo de parcelas "PGTO".
Este cálculo é o mesmo da famosa calculadora HP12C, muito fácil e simples de ser executado.
Existe um outro jeito de calcular o valor das parcelas, porém, diferente dos dois primeiros que mencionei, fazem a contagem de dias corridos entre as parcelas, ou seja, o prazo para o cálculo pode ter 30, 30, 28 ou 29 dias (lembrando que as fórmulas prontas - Excel e HP12C - consideram sempre o mês de 30 dias).
Abaixo o código VBA para efetuar esse cálculo e no link do cabeçalho do blog, a planilha Excel de exemplo para melhor entendimento.
O melhor de ter o código escrito é poder efetuar o cálculo em quantidade como mostra o exemplo abaixo:


A função:


Public Function fn_CalculoParcelas(vlr_empresstimo As Double, _
                            taxa As Double, _
                            qtd_parcelas As Integer, _
                            data_contratacao As String, _
                            vcto_primeira_parcela As String) As Double
                            
    'Para passar os argumentos desta função:
    'Informar valores no padrão americano (ponto no lugar de vírgula)
    'Informar data entre aspas duplas (string)
    'Informat a taxa em percentual. Exemplo 1,5% -> informar 0.015
                            
    Dim i                   As Integer
    Dim c_price_total       As Double
    Dim c_price_parcela     As Double
    Dim tx_ao_dia           As Double
                           
    'Cálculo do coeficiente price total
    c_price_total = 0
    tx_ao_dia = Fix((((taxa + 1) ^ (1 / 30) - 1) * 100) * 1000000000) / 1000000000
    
    'Cálculo das parcelas
    For i = 1 To qtd_parcelas
        c_price_parcela = Fix(1 / ((tx_ao_dia / 100 + 1) ^ _
            ((DateAdd("M", i, CDate(data_contratacao)) - CDate(data_contratacao)))) * 1000000000) / 1000000000
        c_price_total = c_price_total + c_price_parcela
    Next
          
    c_price_total = Fix(1 / c_price_total * 1000000000) / 1000000000
        
    'Coeficiente total X (valor da proposta - entrada) = valor da parcela sem desconto
    fn_CalculoParcelas = Format((vlr_empresstimo) * Round(c_price_total, 8), "#,##0.00")

End Function


;-)

Pesquisar este blog

Arquivo do blog

Quem sou eu

Minha foto
Administrador de Empresas/Técnico em Processamento de Dados. Microsoft Office User Specialist - Excel Proficient. Pós-graduado em Business Intelligence.