Views

...

Important:

Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog podem ser tratados como consultoria freelance.

E-mails

Deixe seu e-mail para receber atualizações...

eBook Promo

Tips - Higienização de Dados - Data Scrubbing - Data Cleansing




O que é a Higienização de Dados?

A Higienização de Dados, nada mais é do que uma limpeza na base de dados. É um processo de alteração ou remoção dos dados incorretos, incompletos, mal formatados, ou duplicados que estejam na base de dados.

Organiza os dados de uma empresa num modelo de negócios específico tal como bancos, seguradoras, varejo, telecomunicações, e transportes. A companhia cria ou compra ferramentas de higienização e as 'esfrega'  na sua base de dados para analisá-los sistematicamente usando regras, algoritmos e tabelas de consulta. 

Normalmente, uma ferramenta de banco de dados inclui programas de lavagem que são capazes de corrigir uma série de tipos específicos de erros, como a adição de códigos postais em falta ou encontrar registros duplicados. 

Quando um 
administrador de banco de dados utiliza uma ferramenta de lavagem de dados, pode economizar uma quantidade significativa de tempo, sendo menos dispendioso do que corrigir os erros manualmente.

Vantagens em manter os dados higienizados:

Acelera a entrega de informações críveis,

Incorpora qualidade aos dados,

Reduz erros dispendiosos, impede a propagação de dados ruins, corrige os erros na origem,

Mantém os dados atuais e precisos com uma auditoria regular,

Padroniza os dados de várias fontes,

Reduz a redundância dos dados corporativos para dar suporte a relatórios mais precisos, além das análises e das decisões de negócio.

Adiciona valor aos dados existentes, gerando e / ou acrescentando informação a partir de outras fontes.

Tags: 
data, scrubbing, cleansing, raw data, source data, atomic data, data-driven decision management (DDDM), data-driven disaster, synthetic backup, data governance,DG, fixed data, data hygiene, data quality

Excel Tips - Aplicando Zoom correto aos seu Dashboards



Qualquer um que tenha desenvolvido um Dashboard no MS Excel provavelmente já experimentou este problema:

O meu painel que se encaixa muito bem na minha tela, não fica tão bem no meu cliente.

Sim, é o antigo problema de diferentes monitores, resoluções, tamanho das fontes e outras configurações que fazem o que parece ótimo em sua tela parecer muito pequeno ou muito grande em outra.

Já implementei algumas idéias bem diferentes para contornar este problema, os quais incluem redimensionar a planilha, redimensionar a janela do MS Excel.

Mas aqui está a ideia que me ocorre no momento:

Provavelmente, o seu Dashboard atual foi ampliado para a sua "melhor visualização. Com isso quero dizer a sua planilha atual está no nível de zoom adequado de tal forma que o seu painel é exibido de forma eficaz. Se não for, vá em frente e coloque-o no zoom ideal para a sua tela. Use a imagem abaixo como um guia.


Como próximo passo vai querer tomar nota das colunas que medem sua tela.

Acima, verá que selecionei colunas "A1: Z1", mas deixei a última coluna, "AA1" desmarcada.

Anote a sua seleção, vamos usá-la em um momento.

Vá até o VBE (Editor Visual Basic) para o configurarmos.

Uma vez que queremos que o nosso Dashboard proporcionem uma visualização correta sempre que alguém o abrir, caso contrário de que adianta, adicionaremos algum código para ser executado direito quando o workbook for aberto pela primeira vez.

No canto superior esquerdo do VBE verá uma caixa que contém os objetos do Microsoft Excel. Dê um duplo clique em Thisworkbook da pasta de trabalho pertencente ao nosso projeto.


Ao lado direito, na janela de código, selecione "Workbook" no objeto dropdown a esquerda. Então selecione o método "Open" no dropdown a direita.

Uma Procedure workbook_Open() aparecerá na janela abaixo. 


Agora digite o seguinte código acima, dentro da sua nova procedure. Lembre-se do Range A1:Z1

Para ver se o nosso código realmente funciona volte para a planilha para testar, aplique um zoom enorme, num nível que o Dashboard nunca deva estar. Agora salve e saia.
(Ahh, certifique-se de salvá-lo como um macro xlsm enabled na sua pasta de trabalho)

Abra o seu Dashboard!

Há algumas coisas que eu deveria mencionar:

- O usuário talvez precise "Habilitar Macros" antes do código entra em vigor.
- Se o Excel não foi fechado corretamente em uma utilização anterior, a caixa mostrando os arquivos que não foram salvos provavelmente aparecerão no seu painel
- Às vezes o MS Excel não abrirá num estado maximizado - mas pode corrigir isso com algum código VBA.

Este código pareceu ser uma boa solução em alguns dos meus projetos, mas não trabalhei com ele em todos os computadores, nos mais diversos clientes diferentes.

Deixe-me saber o que você pensa - foi útil? Como você começa exibindo a mesma coisa em telas diferentes?

Tags: VBA, Excel, workbook, zoom, 




A&A - Dados ou Informações?



Empresas em todo o mundo estão permeadas de dados oriundos de diversas fontes distintas e apesar do fácil acesso a estes, têm dificuldades em obter as necessárias informações para suas relevantes tomadas de decisões.

Não é menos verdade, nem tão pouco raro, o fato de que em muitas reuniões a maioria dos diretores, e/ou gerentes presentes estejam munidos de 
informações
 pouco relevantes ou totalmente irrelevantes. É certo que têm acesso aos seus próprios dados de A a Z
, mas estes estão completamente desprovidos de conteúdo útil. Geralmente tais amontoados de dados não contém nem a abrangência necessária e tão pouco a diversidade apropriada, que lhes propiciem dinamicidade na análise.

Em alguns casos as corporações têm acesso a uma megabase de 
dados distribuidos nos seus servidores, não raramente reunidos sob os acrônimos: 
BIDW (Datawarehouse) e cubos OLAP (online analytical processing)

informação, [algo que realmente agregue, aponte, antecipe, ou mesmo complemente] decisões é muito preciosa e deve ser obtida de forma rápida e exata.

Quando a questão é reunir informações de diferentes países, traduzindo-as nas 
estratégias e objetivos das suas respectivas companhias, os executivos têm deparado-se com um enorme desafio para a grande maioria deles, isso em todo o mundo. Não é difícil que os KPIs (Indicadores de Performance) definidos corporativamente não estejam alinhados com as suas estratégias.

A diversidade de 
bases de dados nas quais as informações se encontram são muito variáveis. O verdadeiro desafio ocorre no momento de consolidá-las em Dashboards e Scorecards por exemplo. Estas precisam ser reunidas de modo coerente e sucinto. 


No caso dos Balanced Scorecards (BSCs), estes oferecem aos executivos as ferramentas para atingirem o sucesso na obtenção de suas informações. Esta importante ferramenta sim, traduz a missão e a estratégia das suas empresas num conjunto abrangente de medidas de desempenho que servem como base para o sistema de medição e gestão estratégica, perseguindo os objetivos financeiros, incluindo os vetores de desempenho desses objetivos.

O grande dilema é: M
esmo cercado por dados de todas as origens, como posso obter informações relevantes para tomar minhas decisões?
 Tags: A&A, dados, informações

Excel Tips - Enviando e-mails a partir do Excel



Estender certa praticidade aos nossos clientes, facilitando-lhes o dia-a-dia, é um prazer para nós desenvolvedores, certo?

Abaixo replico um post antigo, e agora ampliado, com uma funcionalidade que visa facilitar o compartilhamento dos nossos 

BIs (Business Information), 

BSCs

Dashboards

Scorecards 

Ou mesmo dos relatórios e gráficos que estão contidos em nossos MISs. 

Como? 

Enviando-os por e-mail. Sugiro algumas aplicabilidades práticas para a utilização do envio automatizado e e-mails:

: : Sabe quando você está responsável por consolidar diversas planilhas em uma só e o pessoal que precisa enviar-lhe as planilhas (ou disponibilizá-las em algum lugar) não o fazem? então, automatize a cobrança por e-mail


: : Ao invés de gastar tempo reunindo todas as planilhas após o fechamento e enviá-las uma-a-uma a todos os gestores, reúna os dados em um só recipiente, crie uma lista de quem receberá as planilhas e pronto!

A primeira opção utiliza o método SEND, e serve como incentivo a sua pesquisa e estudo. 

Sub SendPlanNow()
    ActiveWorkbook.SendMail _

    Recipients:="bernardess@gmail.com", _

    Subject:="Enviando e-mail da aplicação Excel em: " & Format(Date, "dd/mm/yyyy")
End Sub
Outras necessidades vão se desenrolando com o passar do tempo, como por exemplo copiar a pasta ativa (ActiveSheet), envindo a planilha em seguida:

Sub Send1Sheet_ActiveWorkbook()
    ' Criando uma nova planilha (workbook) contendo um Sheet, e enviando-a 
      como um arquivo anexado.

    ThisWorkbook.Sheets(1).Copy   

    With ActiveWorkbook

         .SendMail Recipients:="bernardess@gmail.com", _

          Subject:="Tente contatar-me em: " & Format(Date, "dd/mmm/yy")

         .Close SaveChanges:=False

    End With

End Sub

Outro método que pode ser usado é o Método de Roteirização, este encaminha a pasta de trabalho (worksheet), a partir de uma lista seguindo o roteiro atual, isto nos permite especificar inúmeros destinatários.

Sub RoutingActwBook()
    With ActiveWorkbook

       Let .HasRoutingSlip = True

           With .RoutingSlip

                Let .Delivery = xlOneAfterAnother
                Let .Recipients = Array("bernardess@gmail.com", "inanyplace01@gmail.com", "inanyplace02@gmail.com")
                Let .Subject = "Por favor, dê atenção a este relatório"
                'Let.Message = ""

          End With

        .Route

    End With
End Sub

Um outro problema comum encontrado em diversos códigos onde se faz citação ao envio de e-mails de modo automatizado é a aparição de mensagens similares a:

"A program is trying to automatically send e-mail..."

"Um programa está tentando enviar..."

Como eliminar de vez esta constante mensagem de exibição? 

Bem, a solução não está no MS Excel, neste caso, pois esta solução pode ser implementada em qualquer um dos produtos do MS Office.

Crie um novo módulo no MS Outlook e cole o código abaixo (Agradecimentos antecipados ao Waine Phillips, dono da solução):

Public Function FnSendMailSafe(strTo As String, _

                                strCC As String, _

                                strBCC As String, _

                                strSubject As String, _

                                strMessageBody As String, _

                                Optional strAttachments) As Boolean

    On Error GoTo ErrorHandler:

    Dim MAPISession As Outlook.NameSpace
    Dim MAPIFolder As Outlook.MAPIFolder
    Dim MAPIMailItem As Outlook.MailItem
    Dim oRecipient As Outlook.Recipient
    Dim TempArray() As String
    Dim varArrayItem As Variant
    Dim strEmailAddress As String
    Dim strAttachmentPath As String
    Dim blnSuccessful As Boolean

    'Obtendo o MAPI do objeto NameSpace

    Set MAPISession = Application.Session

    If Not MAPISession Is Nothing Then

      'Logando-se na sessão MAPI

      MAPISession.Logon , , True, False

      'Criando um ponteiro na pasta Outbox

      Set MAPIFolder = MAPISession.GetDefaultFolder(olFolderOutbox)

      If Not MAPIFolder Is Nothing Then

        ' Criando um novo item de e-mail item na pasta "Outbox"

        Set MAPIMailItem = MAPIFolder.Items.Add(olMailItem)

        If Not MAPIMailItem Is Nothing Then
         
          With MAPIMailItem

            'Criando um novo recipiente para TO

                Let TempArray = Split(strTo, ";")

                For Each varArrayItem In TempArray

                    Let strEmailAddress = Trim(varArrayItem)

                    If Len(strEmailAddress) > 0 Then

                        Set oRecipient = .Recipients.Add(strEmailAddress)

                        Let oRecipient.Type = olTo

                        Set oRecipient = Nothing

                    End If
               
                Next varArrayItem
           

            'Criando um recipiente para CC

                Let TempArray = Split(strCC, ";")

                For Each varArrayItem In TempArray

                    Let strEmailAddress = Trim(varArrayItem)

                    If Len(strEmailAddress) > 0 Then

                        Set oRecipient = .Recipients.Add(strEmailAddress)

                        Let oRecipient.Type = olCC

                        Set oRecipient = Nothing

                    End If

                Next varArrayItem
           
            'Criando recipiente para BCC

                Let TempArray = Split(strBCC, ";")

                For Each varArrayItem In TempArray

                    Let strEmailAddress = Trim(varArrayItem)

                    If Len(strEmailAddress) > 0 Then

                        Set oRecipient = .Recipients.Add(strEmailAddress)

                        Let oRecipient.Type = olBCC

                        Set oRecipient = Nothing

                    End If
               

                Next varArrayItem
           

            'Configurado a mensagem do SUBJECT

                Let .Subject = strSubject
           

            'Configurando a mensagem do corpo od e-mail (em HTML ou texto)

                If StrComp(Left(strMessageBody, 6), "<HTML>", vbTextCompare) = 0 Then

                    Let .HTMLBody = strMessageBody

                Else

                    Let .Body = strMessageBody

                End If


            'Adicionando qualquer anexo especificado

                'Let TempArray = strAttachments

                For Each varArrayItem In strAttachments

                    Let strAttachmentPath = Trim(varArrayItem)

                    If Len(strAttachmentPath) > 0 Then
                        .Attachments.Add strAttachmentPath
                    End If
               

                Next varArrayItem

            .Send


            Set MAPIMailItem = Nothing

          End With

        End If

        Set MAPIFolder = Nothing

      End If

      MAPISession.Logoff

    End If


    Let blnSuccessful = True
   

ExitRoutine:

    Set MAPISession = Nothing
    Let FnSendMailSafe = blnSuccessful

    Exit Function


ErrorHandler:

    MsgBox "Occoreu um erro na função VBA FnSendMailSafe()" & vbCrLf & vbCrLf & _

            "Nº do erro: " & CStr(Err.Number) & vbCrLf & _

            "Descrição do erro: " & Err.Description, vbApplicationModal + vbCritical

    Resume ExitRoutine

End Function

Já no MS Excel (ou qualquer outro produto do MS Office), cole o código abaixo:Chame essa função com os parâmetros da mensagem.
No parâmetro TO (Para) e CC é só separar os e-mails com ;[ponto-e-vírgula], e os anexos precisarão estar numa matriz.

Function SendMail (para As String, cc As String, assunto As String, mensagem As String, Anexos) As Boolean
         'enviar e-mail via Outlook
         Dim objOutlook As Object ' Note: Must be late-binding.
         Dim objNameSpace As Object
         Dim objExplorer As Object
         Dim blnSuccessful As Boolean
         Dim blnNewInstance As Boolean 

         On Error Resume Next

         Set objOutlook = GetObject(, "Outlook.Application")

         On Error GoTo 0

         If objOutlook Is Nothing Then
             Set objOutlook = CreateObject("Outlook.Application")

             Let blnNewInstance = True

             Set objNameSpace = objOutlook.GetNamespace ("MAPI")
             Set objExplorer = objOutlook.Explorers.Add (objNameSpace.Folders(1), 0)

             objExplorer.CommandBars.FindControl(, 1695).Execute
                   
             objExplorer.Close
               
             Set objNameSpace = Nothing
             Set objExplorer = Nothing
         End If

         Let blnSuccessful = objOutlook.FnSendMailSafe (para, cc, "", assunto, mensagem, Anexos)

         If blnNewInstance = True Then objOutlook.Quit

         Set objOutlook = Nothing

         Let EnviarEmail = blnSuccessful
End Function


Tags: VBA, e-mail, send, Excel

Excel Tips - Interações com APIs - UserForms With Windows API Functions



Disponibilizar diversas funcionalidades que propiciem interferência nos formulários que criamos no MS Excel através de chamadas as suas APIs é muito prático ,rápido e funcional.

Bem, como sempre, estou usando um exemplo simples como o de fazer um botão aparecer e sumir num formulário criado por nós mesmos no MS Excel. Mas veja esta como uma oportunidade para aprender a utilizar códigos de terceiros dentro das suas aplicações VBA.

O que é uma API?
API, é o acrônimo, sim, mais prá nossa coleção, de Application Programming Interface (ou Interface de Programação de Aplicativos) é um conjunto de rotinas e padrões estabelecidos por um software para a utilização das suas funcionalidades através de aplicativos que não pretendem envolver-se em detalhes da implementação do software, mas apenas usar seus serviços.

De modo geral, a API é composta por uma série de funções acessíveis somente por programação, as quais nos permitem utilizarmos características de software menos evidentes aos programadores mais tradicionais.

Por exemplo, um sistema operacional possui uma grande quantidade de funções na API, que permitem ao programador criar janelas, acessar arquivos, criptografar dados etc. Mas as APIs dos sistemas operacionais costumam ser dissociadas de tarefas mais essenciais, como a manipulação de blocos de memória e acesso a dispositivos. Essas tarefas são atributos do núcleo (kernel) de sistema e raramente são programáveis. Outro exemplo são os programas de desenho geométrico que possuem uma API específica para criar automaticamente entidades de acordo com padrões definidos pelo utilizador.

Mais recentemente, o uso de API tem se generalizado nos plugins (acessórios que complementam a funcionalidade de um programa). Os autores do programa principal fornecem uma API específica para que outros autores criem plugins, estendendo as funcionalidades do programa.

Agora que já ampliamos um pouco mais a nossa compreensão do que são as APIs, façamos melhor, vamos utilizar algumas chamadas às suas funcionalidades.

Ativar no formulário o botão Maximize
Mostra ou torna invisível o botão de Maximizar e o de Minimizar no formulário ativo. Os botões ficarão visíveis, mas somente terão funcionalidades de acordo com a respectiva chamada da sua função. ShowMinimizeButton ou ShowMaximizeButton.

Function ShowMaximizeButton (UF As MSForms.UserForm, HideButton As Boolean) As Boolean

Function ShowMinimizeButton (UF As MSForms.UserForm, HideButton As Boolean) As Boolean

Bem, antes de efetuar chamadas as funções acima, precisa criar um módulo no qual colocará os códigos abaixo, pois estes são quem efetuarão as chamadas as APIs do Windows

Existem inúmeras funções com chamadas intrínsecas, e será muito produtivo que tire tempo para estudar cada uma destas, a fim de ampliar a sua compreensão de como efetuar tais chamadas. 

Este post é apenas uma pincelada na utilização desta técnica, que poderá ser ampliada até mesmo ao uso das APIs do GoogleGoogleMapsGMailSkype, etc...

As funções que não encontrar constantes abaixo, podem ser facilmente encontradas com o Google na Internet. E isso foi proposital, para que pesquise outras idéias em outros Blogs e fóruns.

Function ShowMaximizeButton (UF As MSForms.UserForm, _

    HideButton As Boolean) As Boolean

'
' ShowMaximizeButton
' Mostra (Se HideButton estiver como False) ou esconde (Se HideButton estiver como True)
' O botão de maximizar da janela.
'
Dim UFHWnd As Long

Dim WinInfo As Long

Dim R As Long

Let UFHWnd = HWndOfUserForm (UF)

If UFHWnd = 0 Then

    Let ShowMaximizeButton = False

    Exit Function

End If

Let WinInfo = GetWindowLong (UFHWnd, GWL_STYLE)



If HideButton = False Then

    Let WinInfo = WinInfo Or WS_MAXIMIZEBOX

Else

    Let WinInfo = WinInfo And (Not WS_MAXIMIZEBOX)

End If

Let R = SetWindowLong (UFHWnd, GWL_STYLE, WinInfo)

Let ShowMaximizeButton = (R <> 0)

End Function

Function ShowMinimizeButton (UF As MSForms.UserForm, _

    HideButton As Boolean) As Boolean
Dim UFHWnd As Long

Dim WinInfo As Long

Dim R As Long

Let UFHWnd = HWndOfUserForm (UF)


If UFHWnd = 0 Then

    Let ShowMinimizeButton = False

    
    Exit Function

End If

Let WinInfo = GetWindowLong (UFHWnd, GWL_STYLE)


If HideButton = False Then

    Let WinInfo = WinInfo Or WS_MINIMIZEBOX

Else

    Let WinInfo = WinInfo And (Not WS_MINIMIZEBOX)

End If


Let R = SetWindowLong (UFHWnd, GWL_STYLE, WinInfo)



Let ShowMinimizeButton = (R <> 0)

End Function



Function HWndOfUserForm (UF As MSForms.UserForm) As Long

' HWndOfUserForm
' This returns the window handle (HWnd) of the userform referenced
' by UF. It first looks for a top-level window, then a child

' of the Application window, then a child of the ActiveWindow.

Dim AppHWnd As Long

Dim DeskHWnd As Long

Dim WinHWnd As Long

Dim UFHWnd As Long

Dim Cap As String

Dim WindowCap As String

Let Cap = UF.Caption

' First, look in top level windows

Let UFHWnd = FindWindow (C_USERFORM_CLASSNAME, Cap)

If UFHWnd <> 0 Then

    Let HWndOfUserForm = UFHWnd


    Exit Function

End If


' Not a top level window. Search for child of application.

Let AppHWnd = Application.hwnd

Let UFHWnd = FindWindowEx (AppHWnd, 0&, 
C_USERFORM_CLASSNAME, Cap)


If UFHWnd <> 0 Then

    Let HWndOfUserForm = UFHWnd


    Exit Function

End If


' Not a child of the application.

' Search for child of ActiveWindow (Excel's ActiveWindow, not

' Window's ActiveWindow).


If Application.ActiveWindow Is Nothing Then

    Let HWndOfUserForm = 0


    Exit Function

End If


Let WinHWnd = WindowHWnd (Application.ActiveWindow)


Let UFHWnd = FindWindowEx (WinHWnd, 0&, C_USERFORM_CLASSNAME, Cap)


Let HWndOfUserForm = UFHWnd

End Function


Tags: VBA, FORM, userform, API, functions, Chip Pearson, ShowMaximizeButton, HWndOfUserForm, GetWindowLong, SetWindowLong, FindWindow, FindWindowEx, WindowHWnd

eBooks VBA na AMAZOM.com.br

LinkWithinBrazilVBAExcelSpecialist

Related Posts Plugin for WordPress, Blogger...

Vitrine