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

VBA Excel - 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 Google, GoogleMaps, GMail, Skype, 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


ReferênciaChip Pearson 

Tags: Bernardes, MS, Microsoft,  Office, Excel, VBA, FORM, userform, API, functions, 
Chip Pearson, ShowMaximizeButton, HWndOfUserForm, GetWindowLong, SetWindowLong, FindWindow, FindWindowEx, WindowHWnd
 

André Luiz Bernardes
A&A® - Work smart, not hard.



VBA Excel - Array - Carregando o conteúdo de uma célula num vetor.

Os desenvolvedores sempre precisam lidar com bases de dados esdrúxulas. Às vezes estas tem como fonte planilhas do MS Excel, e invariavelmente precisamos popular as nossas bases de dados com este conteúdo sem qualquer higienização.

Imagine que você tenha uma lista de dados onde uma das colunas contém inúmeros endereços de e-mail da mesma pessoa, ou inúmeros telefones de contato, ou dois ou três endereços de contato, mas a sua tabela tem um campo para cada uma dessas ocorrências.

Isso seria bem trabalhoso não é mesmo?

Suponha que eu tenha uma planilha com o faturamento da minha rede de sorveterias. Mas coloquei tudo nas seguintes 2 colunas:

Faturamento    Cidades
R$ 5,500,00       Abatiá, Altamira do Paraná, Alto Paraíso, Alto Paraná, Alto Piquiri, Altônia
R$ 3.700,00       Campina da Lagoa, Campo Bonito, Campo Mourão, Cândido de Abreu, 
R$ 3.700,00       Godoy Moreira, Goioerê, Grandes Rios, Guaíra, Guairaçá, Guapirama, 

Mas a minha tabela tem 10 campos onde posso desmembrar as cidades, como faço?

Utilizei a função FillCitiesVector (nFrase As String, nOccurs As Single)

Dentro do meu módulo de funções defini uma variável como pública, conforme abaixo:

Public MyNames (1 To 500) As String  ' (500) é o Nº máximo de cidade que podem ser encontradas numa célula.

A minha chamada à função FillCitiesVector é precedida das seguintes linhas de código:

Dim nCharss As Single

Let nCharss = Val (fCountOccur (Range("C" & i).Value, ",")) + 1

' Coloca todas as cidades num vetor.
Call FillCitiesVector(Replace(Range("C" & i).Value, ", ", ","), nCharss)

A função fCountOccur permite contar o número de separadores dentro de uma string, que no nosso caso são as vírgulas.

A função Replace está substituindo as vírgulas seguidas de espaços, apenas por vírgulas sem espaços.

Segue a função FillCitiesVector

Function FillCitiesVector (nFrase As String, nOccurs As Single)
    ' Author:                     Date:               Contact:                 URL:
    ' André Bernardes             16/11/2011 16:41    bernardess@gmail.com     http://inanyplace.blogspot.com/
    ' .
    ' Listening: .

    Dim i As Single
    Dim ponteiro As Single
    Dim nCheck As Boolean
    
    Let nCheck = True

    For i = 1 To nOccurs + 1
        If nCheck Then
            Let MyNames(i) = Mid(nFrase, i, InStr(i, nFrase, ",") - 1)  ' Popula esta dimensão do vetor.
            Let ponteiro = Len(MyNames(i)) + 1                            ' Reposiciona o ponteiro.
            Let nFrase = Trim(Mid(nFrase, ponteiro + 1, 5000))
            Let nCheck = False
        Else
        
            If InStr(1, nFrase, ",") <> 0 Then ' Checa se ainda há mais de uma cidade
                Let MyNames(i) = Mid(nFrase, 1, InStr(1, nFrase, ",") - 1)  ' Popula esta dimensão do vetor.
                Let ponteiro = Len(MyNames(i)) + 1                          ' Reposiciona o ponteiro.
                Let nFrase = Trim(Mid(nFrase, ponteiro + 1, 5000))
            Else
                Exit For
            End If
        End If
    Next
End Function

Segue a função fCountOccur

Public Function fCountOccur (strSource As String, strMatch As String) As String
    ' Author:                     Date:               Contact:                 URL:
    ' André Bernardes             16/11/2011 16:41    bernardess@gmail.com     http://inanyplace.blogspot.com/
    ' .
    ' Listening: .

    Dim iCount As Integer
    Dim iPosition As Integer
    
    Let iCount = 0
    
    For iPosition = 1 To Len(strSource)
        If Mid(strSource, iPosition, 1) = strMatch Then iCount = iCount + 1
    Next
    
    Let fCountOccur = iCount
End Function


Tags: Bernardes, MS, Microsoft, Office, VBA, Excel, code, Array, matriz, vetor, desmembrando, count, occurs

André Luiz Bernardes
A&A® - Work smart, not hard.



VBA Excel - Barra de Progresso na Barra de Status - Show a Progress Meter in the Status Bar

Show a Progress Meter in the Status Bar



Olá pessoal!

Complementando o tópico anterior, segue novo Post com opção de utilização da nossa Barra de Status do MS Excel. Chamaremos este exemplo de SHOW A PROGRESS METER IN THE STATUS BAR.

Sim, é bom lembrar que este exemplo de código serve para ampliar a visão sobre como utilizar outras informações úteis na Barra de Status, fica mais um exemplo!

PASSO ÚNICO


Insira o código da função e efetue chamadas a ela.

Sub ShowProgress2()
    ' Author                        Contact                        Place
    ' André Luiz Bernardes          bernardess@gmail.com           http://inanyplace.blogspot.com/
    ' Show a Progress Meter in the Status Bar

    Let Application.DisplayStatusBar = True

    ' 1ª Mensagem
    Let Application.StatusBar = String(5, ChrW(9609)) & "Processando..."

    Application.Wait Now + TimeValue("00:00:02")

    ' 2ª Mensagem
    Let Application.StatusBar = String(10, ChrW(9609)) & "Ainda processando..."

    Application.Wait Now + TimeValue("00:00:02") '-- Replace this line with your own code to do something

    ' 3ª Mensagem
    Let Application.StatusBar = String(15, ChrW(9609)) & "Finalizando..."

    Application.Wait Now + TimeValue("00:00:02") '-- Replace this line with your own code to do something

    Let Application.StatusBar = False
End Sub

References: André Luiz BernardesDataPigTechnologies.com

Tags: Bernardes, iniciantes, MS, Microsoft, Office, VBA, Excel, Status Bar, Barra de Status, Status, information, range, selected


André Luiz Bernardes
A&A® - Work smart, not hard.


VBA Excel - Barra de Status Informativa - Info Status Bar

Info Status Bar

Automate Excel VBA - Status Bar Updating
Changing Microsoft Excel Status Bar

Olá pessoal!

Podemos aumentar  a quantidade de visualizações sobre o que estamos fazendo, colocando detalhes na nossa Barra de Status do MS Excel. Chamaremos este exemplo de INFO STATUS BAR.

Como sempre fazemos, é bom lembrar que este exemplo de código serve para que possamos ampliar a nossa visão sobre como utilizar outras informações muito mais úteis do que estas na Barra de Status, fica o exemplo!

Ahhh, e faremos passo a passo para incluir os iniciantes.

Início
Já percebeu que ao selecionarmos um range de células, não conseguimos observar o range selecionado na  
'Name Box'? (Veja abaixo)


Tampouco, observamos este Range na Barra de Status.


PASSO 01
Com o intuito de inserirmos um código que possa demonstrar o que selecionamos, vá para o VBE (pressione Alt + F11), e então dê um duplo clique em 'EstaPasta_de_trabalho' (ou 'ThisWorbook' se a sua versão do MS Office estiver em inglês).



PASSO 02
Ao lado direito, na área do editor, copie e cole o código abaixo:

Private Sub Workbook_SheetSelectionChange
(ByVal Sh As Object, ByVal Target As Range)
    ' Author                        Contact                        Place
    ' André Luiz Bernardes          bernardess@gmail.com           http://inanyplace.blogspot.com/
    ' Mostra as células que foram marcadas na barra de status.
    
    Dim cCell As Variant, i As Range
  
    For Each i In Selection.Areas
        Let cCell = cCell + CDec(i.Rows.Count) * i.Columns.Count
    Next

    Let Application.StatusBar = Replace(Selection.Address(0, 0) & " selecionadas (" & cCell & Left(" Célula(s)", 11 + (cCell = 1)) & ")", ",", ", ")
End Sub


PASSO 03
Agora quando selecionar qualquer parte da planilha, sempre observará algo similar a isso:


Muito bem, o exemplo acabou aqui. Mas lembre-se, este foi apenas uma aplicabilidade para a utilização da Barra de Status. Colocarei outras aplicações abaixo para que continue se exercitando:

Exemplo 01
Se você, no código VBA, desligou a atualização da tela, e seus códigos levarem algum tempo para processar, o usuário pode pensar que o computador parou de responder. Por isso, uma boa regra de programação é informar ao usuário sobre a evolução do processamento, exibindo [no mínimo] uma mensagem na Barra de Status na parte inferior da tela.

Sub StatusBarSample()
    Let Application.ScreenUpdating = False 
    ' Desliga a atualização da tela.
    
    ' Certifica-se de que a Barra de Status estará funcional.
    Let Application.DisplayStatusBar = True    
    Let Application.StatusBar = "Por favor, aguarde a execução da 1ª Parte..."

    ' No ponto abaixo, algum código é adicionado para o processamento.
    Application.Wait Now + TimeValue("00:00:02")
    Let Application.StatusBar = "Aguarde a execução da 2ª Parte..."
    
    ' Adicione algum código para o processamento da 2ª Fase.
    Application.Wait Now + TimeValue("00:00:02")
    Let Application.StatusBar = False 
End Sub

Exemplo 02
Você tem um processo que leva algum tempo para ser executado. Talvez uns 30 segundos, talvez 10 minutos. De qualquer forma você quer que o usuário saiba que a macro está sendo executado e em que parte do processe está:

Sub StatusBar()
    ' Author                        Contact                        Place
    ' André Luiz Bernardes          bernardess@gmail.com           http://inanyplace.blogspot.com/
    ' Efetua um contador.
         
    Dim x               As Integer
    Dim MyTimer         As Double
     
    Let Application.StatusBar = True
    
    ' Adapte este loop se for necessário.
    For x = 1 To 250
        Let MyTimer = Timer
        
        Do
        Loop While Timer - MyTimer < 0.03
         
        Application.StatusBar = "Progresso: " & x & " de 250: " & Format(x / 250, "Percent")
        
        DoEvents
    Next x
     
    Let Application.StatusBar = False
End Sub


References: André Luiz BernardesRick Rothstein, DataPigTechnologies.com, erlandsendata.no

Tags: Bernardes, iniciantes, MS, Microsoft, Office, VBA, Excel, Status Bar, Barra de Status, Status, information, range, selectec
 
André Luiz Bernardes
A&A® - Work smart, not hard.




ENVIE-ME SUA PLANILHA - E FAÇO A SUA Tabela Dinâmica - Promoção de Novembro/2011



QUE TAL MELHORAR A PERFORMANCE E A APARÊNCIA DAS SUAS PLANILHAS?

Precisa regularmente construir relatórios com layouts diferentes e perde muito tempo com isto?

Seus arquivos texto têm dezenas, centenas de milhares de linhas e você fica copiando para outras planilhas para poder caber?

Precisa consolidar informações de fontes diferentes?

Tem arquivos imensos, com dezenas de megabytes onde coloca dados extraídos de ERP e sistemas de gestão diversos?

Percebe que o filtro do MS Excel não está mais te atendendo?

Gasta mais tempo montando o relatório do que o analisando?

ACRESCENTE TABELAS DINÂMICAS!

Traga dados de fora do Excel

Importando dados de arquivos: Texto, Access, Dbase, Oracle, SQL Server, CSV e outros arquivos de Excel

Usando o MS Query para fazer consultas avançadas

Trazendo dados para suas planilhas sem a necessidade da tabela dinâmica

Tags: Bernardes, MS, Microsoft, Office, MS Excel, Excel, Planilhas, Dados, Data, workshet, workbook, Pivot Table, Tabela Dinâmica, Gráfico Dinâmico, Dynamic Chart, Texto, Access, Dbase, Oracle, SQL Server, CSV, query
 
 
André Luiz Bernardes
A&A® - Work smart, not hard.



Promoção de Novembro/2011 - Tabela Dinâmica - Pivot Table.



QUE TAL MELHORAR A PERFORMANCE E A APARÊNCIA DAS SUAS PLANILHAS?


Precisa regularmente construir relatórios com layouts diferentes e perde muito tempo com isto?

 

Seus arquivos texto têm dezenas, centenas de milhares de linhas e você fica copiando para outras planilhas para poder caber?

 

Precisa consolidar informações de fontes diferentes?

 

Tem arquivos imensos, com dezenas de megabytes onde coloca dados extraídos de ERP e sistemas de gestão diversos?

 

Percebe que o filtro do MS Excel não está mais te atendendo?


Gasta mais tempo montando o relatório do que o analisando?


ACRESCENTE TABELAS DINÂMICAS!

Traga dados de fora do Excel

    • Importando dados de arquivos: Texto, Access, Dbase, Oracle, SQL Server, CSV e outros arquivos de Excel;
    • Usando o MS Query para fazer consultas avançadas
    • Trazendo dados para suas planilhas sem a necessidade da tabela dinâmica

Tags: Bernardes, MS, Microsoft, Office, MS Excel, Excel, Planilhas, Dados, Data, workshet, workbook, Pivot Table, Tabela Dinâmica, Gráfico Dinâmico, Dynamic Chart, Texto, Access, Dbase, Oracle, SQL Server, CSV, query, 
 
André Luiz Bernardes
A&A® - Work smart, not hard.



André Luiz Bernardes convidou você para se juntar a ele no Google+

André Luiz Bernardes convidou você para se juntar a ele no Google+
Participar do Google+
O Google+ torna o compartilhamento na web mais parecido com o compartilhamento na vida real.
Círculos
Uma maneira fácil de compartilhar algumas coisas com amigos da faculdade, outras com seus pais e quase nada com seu chefe. Assim como na vida real.
Hangouts
As conversas são melhores face a face. Participe de um hangout por vídeo a partir de seu computador ou telefone celular para botar a conversa em dia, assistir a vídeos do YouTube juntos ou trocar histórias com até nove amigos de uma só vez.
Mobile
Bate-papo em grupo na velocidade da luz. Fotos que fazem o próprio upload. Uma visão panorâmica do que está acontecendo nas proximidades. Criamos o Google+ com dispositivos móveis em mente.
Você recebeu esta mensagem porque André Luiz Bernardes convidou brz.exceldeveloper.blog@blogger.com para participar do Google+. Cancelar a inscrição desses e-mails.

eBooks VBA na AMAZOM.com.br

LinkWithinBrazilVBAExcelSpecialist

Related Posts Plugin for WordPress, Blogger...

Vitrine