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


;-)

segunda-feira, 20 de fevereiro de 2017

Muito cuidado com decimais no Excel

Quando se manipula grandes quantidades de informações, é preciso cuidado redobrado com as decimais, principalmente se são resultados de cálculos.
É importante saber que: formatar uma célula com n decimais, não altera seu conteúdo, mas sim a forma como é exibido, vejam na figura mais abaixo, como a soma de 3 valores iguais (no caso 10,33333333333) resultam num valor aproximado.


Com poucos dados é relativamente fácil não perder o controle da situação, mas hoje o Excel permite planilhas com pouco mais de 1 milhão de linhas e dependendo do trabalho, o resultado pode ter consequências inesperadas.

Só para ilustrar, utilizo um sistema para validar uma soma de valores que tem uma tolerância de +/- R$ 0,05 e ao somar um conjunto de 600 linhas, a diferença foi de R$ 0,07, teoricamente um resultado inválido para as minhas regras.
Reforçando, com 600 linhas é fácil analisar e corrigir se necessário, mas e se fossem 600 mil linhas?

Pesquisem funções como Truncar, Arredondar.Para.Cima, Arredondar.Para.Baixo, etc., o Excel oferece várias soluções para estas situações.

;-)

Desenvolvedores: ouçam quem tem a melhor percepção!

Mais um assunto que talvez gere discussões, mas em anos de experiência desenvolvendo projetos, tenho visto uma situação que se repete e parece que pouca gente tem sensibilidade para perceber o que de fato acontece.
Infelizmente, hierarquia as vezes faz mal ao desenvolvimento de soluções.
Profissionais de cargos elevados (geralmente gerentes, diretores, etc.) motivados a desenvolver um novo sistema que aumentará a produtividade da empresa, contratam consultorias hiper especializadas que chegam na empresa, coletam informações e criam um novo software  e cobram muito dinheiro.
Como a "ideia" partiu de cima da hierarquia, resta a quem está na base da pirâmide aceitar e utilizar o que foi desenvolvido. Falando em bom português, o sistema desce goela abaixo.
Vou ilustrar aqui de uma forma bem simples para ficar fácil de entender. Imaginem um simples formulário impresso, cujos dados deve ser digitados posteriormente para um banco de dados:

Aí chegam os arrogantes programadores experientes que sempre "sabem" qual é a melhor solução e criam uma tela assim:


Sequer ouvem o usuário final, que é o "Zé" digitador da linha produção, pois a "elite" entende que o serviço dele não necessita de instrução avançada, certificações mil, especializações, etc., mas neste exemplo, fica evidente que a produtividade poderia ser muito maior e o índice de erros menor se os campos estivessem na mesma sequencia (formulário impresso e tela).

É isso aí, o Zé poderia ter opinado no início do projeto e ter apontado a deficiência, mas ele é o último a ser ouvido quando na verdade, deveria ser o primeiro.
Infelizmente vão pedir a opinião do Zé quando o projeto já está em fase de implantação e não dá para voltar e fazer alterações, seja por uma questão financeira ou técnica.
Humildemente, o Zé até elogia o sistema pois a tela é mais bonita, tem cara de profissional, etc. e tal, triste realidade...

Fica então a minha dica: programador, seja humilde, aquele que vai usar o sistema no dia a dia tem o melhor subsidio para o desenvolvimento do programa, então ele deve ser um dos primeiros a serem ouvidos e entrevistados.
Quanto mais alto na escala hierárquica, mais distante do trabalho "braçal" se torna, o olhar passa a ser quase que exclusivamente voltado para indicadores, estatísticas, números, gráficos, etc.
É natural que se perca essa percepção do dia a dia do trabalho das formiguinhas, então, programador, procure facilitar a vida das pessoas, inclusive a sua: discuta com o gerente o preço do projeto e com os usuários finais, a melhor solução para aumentar a produtividade.

;-)







quinta-feira, 16 de fevereiro de 2017

Pequenos cuidados com o FileCopy

As vezes, sobrepor um arquivo existente pode ser um desastre ou não dependendo do conteúdo, então não custa tomar cuidado na hora de codificar.
O comando FileCopy sobrepõe um arquivo inexistente e não dá mensagem de erro (desde que o arquivo não esteja aberto).
É uma boa prática sempre verificar antes se o arquivo existe e em caso afirmativo, perguntar ao usuário se ele quer continuar com a operação.
Abaixo um código de exemplo.
Ah, também, um detalhe que acabei conversando com colegas e apesar de não gerar nenhum erro, fica absurda a leitura do programa: notem o Else sem comando abaixo dele.
Funciona, mas não faz sentido. Se não tem ação a ser tomada, não escreva o Else!

;-)


Sub Verifica_e_CopiaArquivos()

    Origem = "C:\teste.txt"
    Destino = "D:\teste.txt"
    
    If Dir(Destino) <> "" Then
        If MsgBox("O arquivo já existe, deseja sobrepor?", vbYesNo) = vbYes Then
            FileCopy Origem, Destino
        End If
        
    '--- um Else sem comando a ser executado! ---
    Else
    '--------------------------------------------
    
    End If

End Sub

terça-feira, 14 de fevereiro de 2017

Pronúncia correta de MOBILE

Vamos ao dicionário mais respeitados do mundo: Cambridge.

http://dictionary.cambridge.org/pt/pronuncia/ingles/mobile

Como podem ver, a pronúncia pode ser tanto "mobaiu" ou "mobou" ou ainda "moo-bil".
Particularmente não gosto de "mobaiu", acho muito grosseiro e forçado, apesar de ser correto.
"mobaiu" para mim, virou modismo brasileiro.

Prefiro o "mobou".
Steve Jobs, Bill Gates, Mark Zuckerberg e outros famosos da tecnologia pronunciam assim... então vou na deles...

;-)

domingo, 12 de fevereiro de 2017

Windows Explorer parou de funcionar

Utilizo o Windows 7 e de vez em quando, começa a aparecer insistentemente a mensagem acima e o Windows Explorer reinicializa.
Vi diversos tutoriais na internet, mas o que realmente funcionou para mim, é a limpeza de arquivos temporários (para isso utilizo o CCleaner) e um comando no prompt do Comando que passo abaixo com o help do próprio.

No prompt de comando, digite Sfc /scannow e pressione ENTER.


Microsoft (R) Windows (R) Resource Checker versão 6.0

Copyright (c) 2006 Microsoft Corporation. Todos os direitos reservados.



Verifica a integridade de todos os arquivos protegidos do sistema e substitui versões incorretas pelas corretas da Microsoft.



SFC [/SCANNOW] [/VERIFYONLY] [/SCANFILE=] [/VERIFYFILE=] [/OFFWINDIR= /OFFBOOTDIR=]



/SCANNOW        Verifica a integridade de todos os arquivos protegidos do sistema e repara os arquivos com problemas, 
                quando possível.

/VERIFYONLY     Verifica a integridade de todos os arquivos protegidos do sistema. Nenhuma operação de reparo é executada.

/SCANFILE       Verifica a integridade do arquivo indicado e repara o arquivo se algum problema for identificado. 
                Especifica o caminho completo 

/VERIFYFILE     Verifica a integridade do arquivo com caminho completo . Nenhuma operação de reparo é executada.

/OFFBOOTDIR     Para reparo offline, especifica a localização do diretório de inicialização offline

/OFFWINDIR      Para reparo offline, especifica a localização do diretório offline do Windows


por exemplo
        sfc /SCANNOW
        sfc /VERIFYFILE=c:\windows\system32\kernel32.dll
        sfc /SCANFILE=d:\windows\system32\kernel32.dll /OFFBOOTDIR=d:\ /OFFWINDIR=d:\windows




sábado, 11 de fevereiro de 2017

Use o aplicativo adequado para a sua tarefa

Este é um texto que vai gerar controvérsias e discussões, mas vamos lá.

Tenho visto muita gente desenvolvendo controle de estoque em Excel, desde instrutores independentes até grandes consultorias.
O que me espanta é o fato de utilizarem uma ferramenta inadequada para essa finalidade.
Se consideramos um negócio pequeno onde a quantidade de itens num estoque  é baixa, até funciona, mas vamos pensar num negócio médio, digamos que o estoque possua em torno de 5 mil itens.
5 mil itens = 5 mil linhas da planilha.
Vamos fazer algumas contas:
200 vendas por dia, 6.000 vendas no mês, 72 mil vendas no ano.
Se cada venda tiver em média, 5 itens, teremos: 1.000 linhas de vendas por dia, 30.000 linhas no mês, 216.000 linhas no ano.
Em 5 anos já estourou o limite de linhas no Excel.
Ok, muitos dirão, mas posso utilizar colunas e diminuir o número de linhas, ou ainda, criar novas planilhas dentro da mesma pasta para comportar a quantidade de informações.
Aí o argumento contra é muito mais simples: o desempenho do Excel é inversamente proporcional a quantidade de informações, ou seja, quando o controle de estoque é desenvolvido e colocado em produção, funciona muito bem pois tem poucas informações. Com o passar do tempo, o desempenho ficará cada vez mais comprometido em virtude da quantidade grande de informações.
Trabalho numa empresa onde planilhas com 400 ou 500 mil linhas são corriqueiras e manipulá-las em rede, é extremamente lento.

A solução?
Simples, utilize um banco de dados.
Não quer abrir mão do Excel? Ok, utilize-o como Front End.

O primeiro problema que você irá se deparar ao criar um controle de estoque, é a necessidade de torná-lo multiusuário, ou seja, várias pessoas manipulando as informações ao mesmo tempo.
O Excel tem recursos de compartilhamento, mas acredite, comparado ao controle de acessos de um banco de dados, é como comparar um Fusca com uma Ferrari. O Excel não foi desenvolvido para isso, o próprio nome já diz: "planilha" de cálculos.

Os controles que vi na internet, principalmente no YouTube, demonstram extrema habilidade em programação de quem os criou, não posso e não tiro o mérito deles, mas faço aqui um apelo: utilizem a ferramenta certa para a tarefa (controle de estoque): um banco de dados.
Se quiserem, utilizem o Excel como Front End e aí até sugiro uma dupla que na minha opinião, seria extremamente confiável: Excel + SQL Server Express (gratuito).

Estes são só alguns argumentos para desaconselhar a criação de controle de estoque em Excel, poderia ir muito além mas vou ficar por aqui.

terça-feira, 31 de janeiro de 2017

Access - Passar critério para uma consulta via VBA

Isto é um quebra-galho mas funciona.
Cria-se uma variável global e uma função (que é o critério da consulta) recebe o valor.
Melhor visualizar o exemplo que fica mais fácil de entender.

;-)



segunda-feira, 30 de janeiro de 2017

O formato de arquivo XLSB do Excel

Os tradicionais arquivos com extensão XLSX do Excel 2007 e superiores, são arquivos compostos, ou seja, possuem vários XML dentro dele.
A forma mais fácil de visualizar isso, é abrindo um XLSX num compactador qualquer como o Winzip ou WinRar (veja abaixo um exemplo aberto com o WinRar).
Ao salvar o mesmo arquivo em formato XLSB ("B" de binário), os arquivos XML deixam de ser gravados e o resultado disso é um ganho substancial no tamanho final.
Na instituição onde trabalho atualmente, vejo muita gente utilizar o Excel como um repositório de dados, gerando arquivos imensos e ocupando muito espaço em rede.
Como esses arquivos não necessitam de recursos (macros por exemplo), ou seja, servem apenas para armazenar dados, a utilização do formato binário só traz vantagens: tamanho de arquivo menor e consequentemente, maior agilidade nas operações de abertura e salvamento.

;-)



sábado, 28 de janeiro de 2017

Serviços Freelance

Procurando um profissional para um projeto rápido?
Ou procurando alguma forma de divulgar suas habilidades e assumir um trabalho temporário para ter uma renda extra?
Este site une esses dois tipos de perfis: http://www.freelance.com

;-)

sexta-feira, 27 de janeiro de 2017

VBA no Office 64 bits

Nunca tive a oportunidade de testar por não usar o Office 64 bits.
Segue o texto com o link para o site original, vou deixar aqui porque no site da Microsoft, os artigos costumam sumir....

https://msdn.microsoft.com/PT-BR/library/office/gg264421.aspx


Visão geral do Visual Basic for Applications de 64 bits

Office 2013 and later
O Microsoft Visual Basic for Applications (VBA) é a versão do Visual Basic fornecida com o Microsoft Office. O VBA do Microsoft Office 2010 inclui recursos de linguagem que permitem que o código do VBA funcione corretamente em ambientes de 32 bits e 64 bits.
Observação Observação
Por padrão, o Office 2010 instala a versão de 32 bits. Você deve escolher explicitamente instalar a versão de 64 bits durante a instalação.
Erros
Observação Observação
Você precisa modificar o código VBA somente se ele for executado na versão de 64 bits do Microsoft Office.
O problema com a execução do código herdado do VBA no Office de 64 bits ocorre porque a tentativa de carregar 64 bits em um tipo de dados de 32 bits trunca a quantidade de 64 bits. Isso pode resultar em saturações de memória, resultados inesperados no seu código e possíveis falhas no aplicativo.
Para resolver esse problema e ativar o código do VBA para que ele funcione corretamente em ambientes de 32 e 64 bits, foram adicionados vários recursos de linguagem ao VBA. A tabela na parte inferior deste documento resume os novos recursos de linguagem do VBA. Três adições importantes são o alias do tipo LongPtr, o tipo de dados LongLong e a palavra-chave PtrSafe.
  • LongPtr - o VBA agora inclui um alias de tipo variável: LongPtr. O tipo de dados real que LongPtr resolve depende da versão do Office que está sendo executada no: o LongPtr resolve o Long em versões do Office de 32 bits e LongPtr resolve o LongLong na versão de 64 bits do Office. Use LongPtr para ponteiros e identificadores.
  • LongLong – o tipo de dados LongLong é um inteiro de 64 bits com sinal disponível somente em versões de 64 bits do Office. Use LongLong para integrais de 64 bits. Funções de conversão devem ser usadas para atribuir o LongLong explicitamente (incluindo LongPtr em plataformas de 64 bits) para tipos de integral menores. As conversões implícitas de LongLong em integrais menores não é permitido.
  • PtrSafe – a palavra-chave PtrSafe assegura que uma instrução Declare possa ser executada com segurança na versão de 64 bits do Office.
Todas as Instruções Declare agora devem incluir a palavra-chave PtrSafe para executar versões de 64 bits do Office. É importante esclarecer que a simples adição da palavra-chave PtrSafe a uma instrução Declare significa apenas que a instrução Declare é destinada explicitamente à versão de 64 bits, todos os tipos de dados dentro da declaração que precisam armazenar 64-bits (incluindo parâmetros e valores de retorno) ainda devem ser modificados para armazenar quantidades de 64 bits.
Observação Observação
As instruções Declare com a palavra-chave PtrSafe é a sintaxe recomendada. As instruções Declare que incluem PtrSafe funcionam corretamente no ambiente de desenvolvimento do VBA7 em ambas as plataformas, de 32 e 64 bits. Para garantir a compatibilidade com versões anteriores no VBA7, use o construto a seguir:
#If Vba7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf
Observe os seguintes exemplos de instrução Declare. Executar uma instrução Declare em versões doe 64 bits do Office resultará em um erro indicando que a instrução Declare não inclui o qualificador PtrSafe. O exemplo do VBA modificado contém um qualificador PtrSafe, mas observe que o valor retornado (um ponteiro para a janela ativa) retorna um tipo de dados Long. Na versão de 64 bits do Office, esse cenário está incorreto porque o ponteiro precisa ser de 64 bits. O qualificador PtrSafe informa ao compilador que a instrução Declare está direcionando a versão de 64 bits para que a instrução seja executada sem erro. Entretanto, como o valor retornado não foi atualizado para um tipo de dados de 64 bits, este será truncado, resultando em um valor retornado incorreto.
Exemplo de instrução Declare de VBA herdado não modificada:
Declare Function GetActiveWindow Lib "user32" () As Long
Exemplo de instrução Declare do VBA modificada para incluir o qualificador PtrSafe ainda usando o valor retornado de 32 bits:
Declare PtrSafe Function GetActiveWindow Lib "user32" () As Long
Relembrando: a instrução Declare deve ser modificada para incluir o qualificador PtrSafe e quaisquer variáveis dentro da instrução que precisem armazenar quantidades de 64 bits devem ser atualizadas para que as variáveis usem tipos de dados de 64 bits.
Exemplo d instrução Declaredo VBA modificada para incluir a palavra-chave PtrSafe e atualizada para usar o tipo de dado de 64 bits (LongPtr) adequado:
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
Em resumo, para que o código funcione em versões de 64 bits do Office, é necessário localizar e modificar todas as instruções Declare existentes para que elas usem o qualificador PtrSafe. Também é necessário localizar e modificar todos os tipos de dados dentro dessas instruções Declare que referenciam ponteiros e identificadores para que elas usem novos alias de tipo LongPtr compatíveis com a versão de 64 bits e tipos que precisam armazenar integrais de 64 bits com o novo tipo de dados LongLong. Além disso, é preciso atualizar todos os tipos definidos pelo usuário (UDTs) que contenham ponteiros ou identificadores e integrais de 64 bits para que eles usem tipos de dados de 64 bits e verifiquem todas as atribuições de variável corretas para evitar a ocorrência de erros de incompatibilidade de tipo.

Escrevendo o código que funciona no Office de 32 bits e de 64 bits

Para escrever um código que possa portar as versões de 32 e 64 bits do Office, você só precisa usar o novo alias de tipo LongPtr em vez de Long ou LongLong para todos os ponteiros e valores de identificador. O alias de tipo LongPtr resolverá o tipo de dados Long ou LongLong correto de acordo com a versão do Office que está sendo executada. Observe que, se você precisar de uma lógica diferente para a execução, por exemplo, para manipular valores de 64 bits em grandes projetos do Microsoft Excel, você pode usar a constante de compilação condicional Win64 conforme mostrado na seção a seguir.

Escrevendo o código que funciona no Microsoft Office 2010 (32-bit ou 64-bit) e versões anteriores do Office

Para escrever um código que funcione em versões novas e antigas do Office, você pode usar uma combinação das novas Constantes de Compilação condicional do VBA7 e Win64. A constante de compilação condicional do VBA7 é usada para determinar se o código está sendo executado na versão 7 do Editor do VB (versão do VBA fornecida com o Office 2010). A constante de compilação condicional do Win64 é usada para determinar que versão do Office (de 32 ou 64 bits) está sendo executada.
#if Vba7 then 
'  Code is running in the new VBA7 editor 
     #if Win64 then 
     '  Code is running in 64-bit version of Microsoft Office 
     #else 
     '  Code is running in 32-bit version of Microsoft Office 
     #end if 
#else 
' Code is running in VBA version 6 or earlier 
#end if 
 
#If Vba7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf 

Resumo das atualizações de linguagem do VBA7

A tabela a seguir resume as novas adições de linguagem do VBA e fornece uma explicação sobre cada uma delas:
Nome
Tipo
Descrição
Palavra-chave
Garante que a instrução Declare seja direcionada para sistemas de 64 bits. Necessário para versões de 64 bits.
Tipo de dados
Alias de tipo que mapeia o Long em sistemas de 32 bits, ou o LongLong em sistemas de 64 bits.
Tipo de dados
Tipo de dados de 8 bytes que está disponível somente em sistemas de 64 bits. Tipo numérico. Números inteiros no intervalo de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. O LongLong é um tipo declarado válido somente em plataformas de 64 bits. Além disso, o LongLong não pode ser convertido implicitamente em um tipo menor (por exemplo, não é possível atribuir um tipo de dados LongLong a um do tipo Long.). Isso é feito para evitar que haja truncamento de ponteiro inadvertidamente. Coerções explícitas são permitidas, portanto, no exemplo acima, é possível aplicar um CLng a um LongLong e atribuir o resultado a um Long. (Válido somente em plataformas de 64 bits.)
^
Caractere de declaração de tipo LongLong
Declara um valor literal explicitamente como um LongLong. Necessário para declarar um literal de LongLong maior que o valor de Long máximo (do contrário, ele será convertido implicitamente em double).
função de conversão de tipo
Converte uma expressão simples em um LongPtr.
função de conversão de tipo
Converte uma expressão simples em um tipo de dados LongLong. (Válido somente em plataformas de 64 bits.)
constante VarType
constante VarType
instrução DefType
Define o tipo de dados padrão para uma gama de variáveis como LongPtr.
instrução DefType
Define o tipo de dados padrão para uma gama de variáveis como LongLong.

quarta-feira, 25 de janeiro de 2017

Excel VBA - Consolidar planilhas

O código abaixo é uma simplificação de um outro escrito pelo meu amigo Edson Luiz Branco, mais ou menos no ano 2000, não lembro exatamente o ano.
Na ocasião, eu precisava copiar e colar os dados de aproximadamente 200 planilhas para uma única e este código me salvou da árdua tarefa manual.

;-)

Sub ConsolidaNovo()

    Dim i               As Integer
    Dim NomeArquivo     As String
    Dim Origem          As Workbook
    Dim Caminho         As String
    
    Caminho = InputBox("Informe o caminho da pasta que contém as planilhas" & vbCrLf & "Exemplo: C:\Pastas\")
    If Caminho = "" Then Exit Sub
    
    If Right(Caminho, 1) <> "\" Then Caminho = Caminho & "\"
    
    NomeArquivo = Dir(Caminho)
    
    i = ActiveWorkbook.Sheets.Count

    Application.ScreenUpdating = False
    Do Until NomeArquivo = ""
        
        Set Origem = Workbooks.Open(Filename:=Caminho & NomeArquivo)
        
        Origem.ActiveSheet.Copy After:=Workbooks("Consolidar.xls").Sheets(i)

        Origem.Close SaveChanges:=False
        
        ActiveSheet.Name = NomeArquivo
        i = i + 1

        NomeArquivo = Dir
        Application.ScreenUpdating = True

    Loop

    Set Origem = Nothing
    
    Sheets(1).Select

End Sub

segunda-feira, 23 de janeiro de 2017

Transferir as regras do Outlook para outro computador

Criar regras dá trabalho mas o resultado é sempre ganho de produtividade.
Imagine o trabalho de ter de criar várias regras novamente quando se muda de computador.
Para evitar isso, o próprio Outlook tem o assistente para exportação e importação de regras.
Na versão 2010 siga estes passos:
Clique em Regras
Gerenciar Regras e Alertas
Opções
Logo você visualizará os botões de exportação e importação.

;-)



domingo, 22 de janeiro de 2017

Post It

Mais uma dica simples e muito útil que acaba caindo no esquecimento: as notas autoadesivas.
Clique no menu Todos os programas > Acessórios > Notas adesivas.
O legal é que, ao desligar o computador, elas não se perdem, ou seja, quando o computador for ligado novamente, elas estarão lá novamente.

;-)


Dica do calendário do Windows 7

Um recurso tão simples que a maioria das pessoas nem sabe que existe.
Ao abrir o calendário do Windows (um clique no relógio que está no canto direito da barra de tarefas), clique uma vez sobre o mês conforme indicado nas figuras abaixo.
Depois clique no ano.
A navegação para períodos muito longos, principalmente em anos, fica muito fácil.
Esta dica sem imagens ficaria muito abstrata.

;-)




segunda-feira, 16 de janeiro de 2017

Excel e HTML

No momento não vejo utilidade para esta descoberta que aconteceu por acaso, mas acredito que em algum momento, será muito bom conhecer este comportamento do Excel:
Se você digitar o código HTML abaixo e colar numa célula do Excel, somente o texto será exibido.
É como se o Excel interpretasse o código HTML.




;-)


Problemas com conexão via ADO com SQL Server

Um caso curioso que vou deixar registrado aqui, talvez ajude alguém que passe pela mesma situação.
Outro dia, num dos computadores da empresa onde trabalho, um banco de dados Access 2013 que acessa um servidor SQL Server 2008 somente para obter dados de uma View simplesmente começou a exibir linhas duplicadas, por exemplo, se a consulta tivesse 10 registros, era exibido 1 registro repetido 10 vezes.
Depois de muitas tentativas de solucionar o problema, inclusive reparando a instalação do Office 2013 e sem obter sucesso, troquei o provider na string de conexão e .... funcionou!

De: Provider=SQLOleDB
Para: Provider=SQLNCLI

O interessante é que o problema ocorreu em apenas um dos computadores, os outros 3 continuam funcionando com o provider anterior.

;-)

Etapas rápidas no Outlook

Olá amigos!

Para quem utiliza o Outlook no dia a dia como ferramenta de produtividade, segue uma dica muito legal: as etapas rápidas.
Na guia Página Inicial, clique em Criar no grupo Etapas Rápidas e veja as opções disponíveis.
Utilizo muito para mover e-mails para pastas específicas no arquivo *.pst, evitando assim sobrecarregar minha cota no servidor Exchange.
O ganho em agilidade é muito grande e diminui muito a possibilidade de se mover um e-mail para uma pasta errada.
Como sempre, as imagens falam mais do que as palavras, então seguem os prints das telas.

:-)


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.