Views

Important:

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

...

30 de maio de 2013

Lista 2013 - 200 Livros de Excel - VBA





Aprendermos coisas online é muito comum hoje em dia. Entramos no Youtube e temos video aulas, buscamos por tutoriais, manuais e Guias. Tudo disponível com fácil acesso na Internet.

Mas o que aconteceu com a aprendizagem da maneira antiga através da leitura de livros?

Aaqueles que preferem aprender Excel através de um bom livro impresso ficará feliz em saber que existem muitos livros em circulação sobre o assunto.

O MS Excel é um grande negócio e há uma abundância de textos para escolher. 

Estou disponibilizando a Lista 2013 - 200 Livros de Excel nas seguintes categorias:

Análise de Dados

Análise de Dados e Visualização

Ciências

Estatística

Excel para MAC

Financeiro

Funções

Gráficos

Negócios

Outras Especialidades

Referências Gerais

Tabela Dinâmica / Pivot Tables

VBA

Solicite o arquivo com os 200 Títulos. Apenas deixe o seu nome com o e-mail nos comentários para que envie a lista para você. A lista tem links para que possa visualizar o conteúdo dos livros diretamente nos respectivos sites.

Vou publicando a lista aos poucos aqui no Blog e espero que gostem.






Se desejarem deixem alguns títulos nos comentários.

Tags: Books, Excel, Livros, Lista 2013, VBA



29 de maio de 2013

VBA Tips Exclusive - Geração Espontânea de Datas Retroativas



Se olharmos para o passado, analisando os inúmeros anos de experiência que temos, quais desenvolvedores, às vezes temos a impressão de que neste anos todos, várias vezes, desenvolvemos diversas funcionalidades (códigos) que serviram exclusivamente as nossas necessidades pontuais. Pensamos: 'Não é possível que alguém mais no mundo, precise de algo sequer parecido com esse código que acabei de desenvolver'.

Tal impressão de que os nossos códigos são tão proprietários que até seria inútil compartilhá-los com outros, impede-nos de trazer à tona soluções criativas que poderiam auxiliar muitos desenvolvedores mundo à fora.

O que segue é uma reflexão neste sentido. Olhando o passado, olha a ironia da funcionalidade do código, Percebi que tinha um código desenvolvido para a Geração Espontânea de Datas Retroativas. E este parecia-me encaixar-se na descrição do primeiro parágrafo. Os seus comentário a posteriori, é que me dirão se ele foi útil, ou não.

Sintaxe: GeraMonths(<Parâmetro>) <Retorna data no formato mmm|yy>

Se parametrizarmos com '0' (zero), retorna uma lista retroativa com todos os próximos 11, além do atual.

? GeraMonths(0) ' Supondo que estejamos no mês 05/2013:

mai|13
abr|13
mar|13
fev|13
jan|13
dez|12
nov|12
out|12
set|12
ago|12
jul|12
jun|12

Qualquer outro número, retornar o respectivo mês retroativo a partir do atual.

? GeraMonths(1) ' Supondo que estejamos no mês 05/2013:

mai|13

? GeraMonths(2) ' Supondo que estejamos no mês 05/2013:

abr|13

? GeraMonths(12) ' Supondo que estejamos no mês 05/2013:

jun|12

Divirta-se!

Function GeraMonths (MonthNumber As Byte) As String
    '        Author: André Luiz Bernardes - Bernardess@gmail.com.
    '          Date: 28/05/2012 - 10:30.
    '   Application:
    ' Functionality: Gera uma lista de 12 meses retroativos ao atual no formato "mmm|yy".
    
    Dim nMonth As String
    Dim i As Integer
    Dim j As Integer
    Dim k As Boolean
    Dim l As Boolean

    Let i = 0
    Let j = 0
    Let k = True
    Let l = True
    
    ' Gera 12 meses a partir do mês atual.
    While i < 12
    
        ' Na 1ª vez gera o mês atual.
        If k Then
            Let nMonth = Format(Now(), "mmm") & "|" & Format(Now(), "yy")
            
            Let k = False
        Else ' Apartir da 1ª vez subtrai 31 dias.

            ' A partir do mês de Jan o ano precisa ser subtraido por 1.
            If InStr(1, nMonth, "jan") <> 0 Then
                Let l = False
            End If

            If l Then
                Let nMonth = Format(Now() - j, "mmm") & "|" & Format(Now(), "yy")
            Else
                Let nMonth = Format(Now() - j, "mmm") & "|" & Format(Now(), "yy") - 1
            End If
        End If

        Let i = i + 1
        Let j = j + 31

        If MonthNumber = i Then
            Let GeraMonths = nMonth
            
            Debug.Print i & " - " & nMonth
        ElseIf MonthNumber = 0 Then
            Let GeraMonths = nMonth

            Debug.Print i & " - " & nMonth
        End If
    Wend
End Function

Ahh, claro, mas que desenvolvedor sou eu que não explico qual a funcionalidade para tal código.

Pois bem meus caros, regularmente recebia um arquivo texto com dados de MAT (Últimos 12 meses, mês-a-mês). O cabeçalho deste arquivo vinha com a descrição pouco aplicável ao relatório no qual iria utilizá-lo, algo como: UN12, UN11, UN10, etc...

Precisei criar uma interface, que no momento da importação, imprimisse um novo cabeçalho a tais campos. Este deveria ser indicado pelo usuário responsável pelo processamento.



Pode observar na imagem acima, no canto extremo à direita do formulário, um botão com a imagem de '2 olhos'.
Quando este é pressionado os campos anteriores são automaticamente preenchidos.

O código para isso?

Segue:

Function PreTyping (nField As Byte)
    '        Author: André Luiz Bernardes - Bernardess@gmail.com.
    '          Date: 28/05/2012 - 10:30.
    '   Application:
    ' Functionality: Preenche automaticamente os campos de meses

    'Carrega o nome dos meses.
    If nField = 1 Then
        Let Form_frm_Months.cxExercise01.Value = GeraMonths(1)
        Let Form_frm_Months.cxExercise02.Value = GeraMonths(2)
        Let Form_frm_Months.cxExercise03.Value = GeraMonths(3)
        Let Form_frm_Months.cxExercise04.Value = GeraMonths(4)
        Let Form_frm_Months.cxExercise05.Value = GeraMonths(5)
        Let Form_frm_Months.cxExercise06.Value = GeraMonths(6)
        Let Form_frm_Months.cxExercise07.Value = GeraMonths(7)
        Let Form_frm_Months.cxExercise08.Value = GeraMonths(8)
        Let Form_frm_Months.cxExercise09.Value = GeraMonths(9)
        Let Form_frm_Months.cxExercise10.Value = GeraMonths(10)
        Let Form_frm_Months.cxExercise11.Value = GeraMonths(11)
        Let Form_frm_Months.cxExercise12.Value = GeraMonths(12)
    End If
End Function

Pois é, acho que ninguém vai precisar de uma solução assim. O que você acha? Deixe seus comentários...

Tags: Tips, Exclusive, VBA, geração










28 de maio de 2013

Business Intelligence - 03 de 10 - Regras Clássicas para implementação

Antigamente as empresas gastavam muito dinheiro com BI, mas nem sempre conseguiam alcançar os resultados pretendidos. Prova disso são as reclamações generalizadas de usuários sobre a falta da qualidade dos dados e a dificuldade de utilização dos respectivos sistemas e ferramentas de BI. Não raro detectam-se relatórios incompletos e/ou dados imprecisos que impactam severamente na tomada de decisões. Tais deficiências são causadas por fraquezas funcionais e organizacionais na implementação de projetos deBusiness Intelligence.

Sim meus caros, é essencial aprendermos com os erros de outros projetos de implementação de um Business Intelligence, o que segue são 10 dicas para a implementação de um BI.

3. Envolver os utilizadores numa fase inicial

Na fase inicial, o departamento de TI deve criar um protótipo simples da solução. Desta forma, pode ser feita uma revisão assegurar que os requisitos essenciais serão incluídos desde o início. Na implementação de um projecto de BI, os colaboradores dos departamentos especializados devem sempre ser incluídos lelamente, uma vez que são esses indivíduos que, no futuro, irão trabalhar com as aplicações. Quando se testar o protótipo, esses colaboradores podem determinar se o projeto segue o escopo.

Tags: BI, Business Inteligence,



27 de maio de 2013

VBA Access - Exportando os Relatórios para o Powerpoint - Working with PowerPoint Presentations from Access Using Automation















É interessante podermos criar uma apresentação com slides no PowerPoint a partir de dados contidos no MS Access.

Adicionalmente poderemos exibir e controlar a apresentação dos slides a partir de um formulário de acesso.

Durante o transcorrer deste artigo procure por soluções e explore maneiras de estender o modo de demostrá-las nos seus próprios aplicativos.

Talvez algum cliente peça-lhe que crie manualmente slides do Microsoft Office PowerPoint regularmente em base semanal com dados oriundos do Microsoft Office Access

Bem, não podemos exportar dados diretamente do Access para o PowerPoint. No entanto, podemos simplificar a tarefa, dependendo das nossas necessidades e desejo de escrevermos no VBA (Microsoft Visual Basic for Applications).

Analisaremos aqui duas formas de interação entre o Access e PowerPoint.

O primeiro exemplo ilustra como criar uma apresentação do PowerPoint a partir dos dados de uma tabela do Access usando automação.

O segundo exemplo mostra como exibir e manipular uma apresentação do PowerPoint existente num formulário do Access, usando também Automation. A Automação lhe dá a capacidade de controlar uma aplicação a partir de outra, manipulando as propriedades e métodos disponíveis no aplicativo controlado, respondendo a eventos.

Criando uma apresentação PowerPoint a partir de dados do Access

Este exemplo cria uma apresentação de slides usando os dados do MS Access. Um objeto Recordset é criado a partir dos dados de uma tabela. Os dados deste conjunto de registros é usado para preencher um slide da apresentação.

Faça o seguinte para criar a apresentação de slides:

1 - inicie o MS Access e abra um banco de dados.

2 - Crie um formulário com base em qualquer tabela, que contenha as seguintes características e objetos:

     Formulário: CreateFromAccessData
     Caption: PowerPoint Demo
     Botão de comando: cmdPowerPoint

          Nome: cmdPowerPoint
          Caption: PowerPoint Example
          Largura: +/- 5 cm

3 - No menu View, clique em código.

4 - No menu Ferramentas, clique em Referências.

5 - Nas caixas de referências disponíveis, clique na opção:
 
Microsoft PowerPoint 9.0 Object Library and Microsoft Office 9.0 Object Library

6 - Clique em OK para fechar a caixa de diálogo.

7 - Adicione a seguinte linha de código na seção de Declaração Geral:

Option Explicit

8 - Digite ou cole o seguinte código:

Sub cmdPowerPoint_Click()
    Dim db As Database, rs As Recordset
    Dim ppObj As PowerPoint.Application
    Dim ppPres As PowerPoint.Presentation
    
    On Error GoTo err_cmdOLEPowerPoint
    
    ' Open up a recordset on the Employees table.
    Set db = CurrentDb
    Set rs = db.OpenRecordset("Employees", dbOpenDynaset)
    
    ' Open up an instance of Powerpoint.
    Set ppObj = New PowerPoint.Application
    Set ppPres = ppObj.Presentations.Add
    
    ' Setup the set of slides and populate them with data from the
    ' set of records.
    With ppPres
        While Not rs.EOF
            With .Slides.Add(rs.AbsolutePosition + 1, ppLayoutTitle)
                .Shapes(1).TextFrame.TextRange.Text = "Hi!  Page " & rs.AbsolutePosition + 1
                .SlideShowTransition.EntryEffect = ppEffectFade
                With .Shapes(2).TextFrame.TextRange
                    .Text = CStr(rs.Fields("LastName").Value)
                    .Characters.Font.Color.RGB = RGB(255, 0, 255)
                    .Characters.Font.Shadow = True
                End With
                .Shapes(1).TextFrame.TextRange.Characters.Font.Size = 50
            End With
            rs.MoveNext
        Wend
    End With
    
    ' Run the show.
    ppPres.SlideShowSettings.Run
    
    Exit Sub
    
err_cmdOLEPowerPoint:
    MsgBox Err.Number & " " & Err.Description
End Sub


9 - Salve o formulário PowerPointDemo e abra-o como visualizar.

10 - Clique no exemplo do PowerPoint.

Note que a apresentação com os slides no PowerPoint será criada e exibida na tela. Clique a seta do mouse e a mova-se através dos slides.

Usando a Automação para exibir uma apresentação do PowerPoint

Este exemplo mostrará como exibirmos os slides do PowerPoint num formulário do Access. Esta técnica utiliza a automação do Access para abrir uma apresentação do PowerPoint conectada ao primeiro slide. Ao exibir os outros slides alteraremos a propriedade SourceItem, o que nos permitirá conectar-nos aos diferentes slides.

Observação: Para usarmos esta técnica, devemos ter tanto PowerPoint quanto o b instalados na estação de trabalho.Também precisaremos criar uma apresentação PowerPoint (. Ppt). Durante todo o processo, substitua o seguinte nome de arquivo com o nome e o caminho do arquivo: C: \ Program Files \ Microsoft Office \ Office \ Pptexample.ppt. Há um exemplo fornecido abaixo para download, ele  contém uma apresentação de amostra.

Este exemplo cria um formulário com cinco botões e um controle de objeto para vincular a uma apresentação PowerPoint que permitirá mover-se através dos seus slides.

Private Sub insertShow_Click()
    On Error GoTo insertShow_Click_Error
    
    ' Open PowerPoint
    Dim strPowerPointFile As String
    Dim pptobj As PowerPoint.Application
    Set pptobj = New PowerPoint.Application
    pptobj.Visible = True
    pptobj.WindowState = ppWindowMinimized
    
    Let strPowerPointFile = CurrentProject.Path & "\Access2PowerPoint.ppt"
    
    ' Fill a collection with all Slide IDs.
    With pptobj.Presentations.Open(strPowerPointFile)
        Set mcolSlideIDs = New Collection
        Dim ppSlide As PowerPoint.Slide
        For Each ppSlide In .Slides
            mcolSlideIDs.Add ppSlide.SlideID
        Next
        .Close
    End With
    
    ' Close PowerPoint
    pptobj.Quit
    Set pptobj = Nothing

    ' Make object frame visible and enable "navigation" buttons.
    pptFrame.Visible = True
    frstSlide.Enabled = True
    lastSlide.Enabled = True
    nextSlide.Enabled = True
    previousSlide.Enabled = True

    ' Specify OLE Class, Type, SourceDoc, SourceItem and other properties.
    With pptFrame
        .Class = "Microsoft Powerpoint Slide"
        .OLETypeAllowed = acOLELinked
        .SourceDoc = strPowerPointFile
    End With
    SetSlide 1
    
    frstSlide.SetFocus
    insertShow.Enabled = False
    
    Exit Sub

insertShow_Click_Error:
    MsgBox Err.Number & " " & Err.Description
    Exit Sub
End Sub

Private Sub SetSlide(ByVal ID As Integer)
    On Error GoTo ErrorHandler
    
    Select Case ID
    Case Is > mcolSlideIDs.Count
        MsgBox "This is the last slide."
    Case 0
        MsgBox "This is the first slide."
    Case Else
        mlngSlideIndex = ID
        With pptFrame
            .SourceItem = mcolSlideIDs(mlngSlideIndex)
            .Action = acOLECreateLink
        End With
    End Select

    Exit Sub
ErrorHandler:
    MsgBox Err.Number & " " & Err.Description
    Exit Sub
End Sub

23 de maio de 2013

VBA Access - Inserindo SQL Dinâmico na Query - Access 2013 Generate dynamic SQL statements


O MS Access é tão flexível e dinâmico, que nos permite facilidades criativas inimagináveis. Bem, agora são imagináveis. Veja  a seguir...

Antigamente, a dois ou três anos atrás, quando desejávamos alterar uma query que não servia mais aos nossos propósitos, usávamos a velha técnica de apagá-la, criando uma nova com os comandos SQL que desejávamos.

De fato, isso não causava grandes transtornos dentro do banco de dados, uma vez que não ocorresse excessivamente, transformando-se numa ação de processamento paralelo. Mas (sempre há um mas), se esta ação fosse constante e requeresse processamento contínuos, essa técnica não se aplicaria tão bem, trazendo transtornos tais como a corrupção do banco, dependendo do tipo de código SQL que estivermos gerando. 

A versão do MS Access 2013 permiti-nos aplicar uma técnica mais simples, avançada, e eficiente. Esta não trará quaisquer transtornos e tão trará morosidade as nossas aplicações.

Qual o segredo?

Reflitamos um pouco:

Uma query nada mais é do que mais um objeto dentro do banco de dados.

Ao alinharmos esse conceito básico, podemos começar a ter ideias. Por exemplo, todo objeto é composto por propriedades.

O código que compõe o objeto é, de certo modo, parte das suas propriedades. E se pudermos trocar o valor da propriedade?

Sim, podemos fazer isso. Como?

Execute as seguintes funcionalidades:

Dim nSQL01 as String
Let nSQL01 = "Select * from Tbl_Bernardes"

    ' Criando a query fisicamente.
    'Call ShowProcess ("Criando a query fisicamente: 'qry_01_Bernardes'", nSQL01)  ' Essa função mostra uma mensagem na tela.
    Call UpdateQuery ("qry_01_Bernardes", nSQL01)

Sub UpdateQuery (QueryName, SQL)
    '        Author: André Luiz Bernardes - Bernardess@gmail.com.
    '          Date: 22/01/2013 - 09:30.
    '   Application: Bernardess Application
    ' Functionality: Criando fisicamente uma query.

    ' Usa o nome e a String SQL, caso a query não exista altera o conteúdo dela.
    If IsNull(DLookup("Name", "MsysObjects", "Name='" & QueryName & "'")) Then
        '' cria-a ...
        CurrentDb.CreateQueryDef QueryName, SQL
    Else
        '' Caso contrário, altera o seu conteúdo.
        Let CurrentDb.QueryDefs(QueryName).SQL = SQL
    End If
End Sub

Simples e limpo! Divirta-se.

Tags: VBA, Excel, SQL, query, queries, generate, dynamic, statements, Access 2013, 



eBooks VBA na AMAZOM.com.br

Vitrine