sexta-feira, 4 de dezembro de 2009

VBA Error 3275 - Unexpected error from external database driver

Pois é, erros e mais erros...

Conforme já tive chance de escrever aqui antes, invariavelmente somos expostos a erros quando estamos desenvolvendo soluções através das nossas aplicações, não raramente acompanhadas de uma demanda alta e com pouco tempo.

Especialmente quando envolve o inter-relacionamento entre aplicações distintas, neste caso utilizo o
MS Office 2007.

As interações podem ocorrer entre o MS Access e o MS Excel, numa constante troca de dados, com a criação de diversas planilhas repletas de fórmulas, ou mesmo a exportação de diversos painéis de dados (como um Dashboard) para apresentações MS PowerPoint dentro de um ciclo contínuo.

No cenário descrito acima é muito provável que nos deparemos com o famoso, pouco conhecido, mas muiiitooo chato: Erro 3275.

Este erro, quando pesquisado na literatura Microsoftniana, está acompanhado da seguinte definição:
Unexpected error from external database driver <error number>, ou,
Erro inexperado causado pelo driver de banco de dados externo <número do erro>

Este erro torna-se ainda mais comum durante a execução repetitiva da seguinte linha de comando:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, nquery, PlanTarget

Pode percebê-lo melhor dentro da funcionalidade abaixo, a qual é evocada dentro de um ciclo constante.
Function Qualquer
    ' 1ª FASE - Copia a planilha enviada como referência.
    ' ----------------------------------------------------------------------------------------
    Set objExcel = CreateObject("Excel.Application")
    Set objWorkBook = objExcel.Workbooks.Open(PlanBase)

    ' Salva planilha com o nome temporário.
    objExcel.Workbooks(1).SaveAs (PlanTarget)
    objExcel.Quit
   
    ' Cria Query tmp, base da planilha.
    Set Cria_Query = CurrentDb.CreateQueryDef(nquery, strSQL)

    Call Sleep(2000)  ' Pausa para o sistema operacional não fundir...
    Debug.Print Right(Now(), 8), nquery, strSQL, PlanTarget

    ' Insere planilha com dados.
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, nquery, PlanTarget

    ' Delete a query temp
    DoCmd.DeleteObject acQuery, nquery

    ' Final - Limpa as variáveis.
    ' ----------------------------------------------------------------------------------------
    Set Cria_Query_PXBR = Nothing
    Set objWorkBook = Nothing
    Set objExcel = Nothing
End Function

Certamente percebeu a ocorrência da função Sleep() no trecho de código colado aí acima. Este foi
implementado com o único propósito de 'atrasar' a funcionalidade para que esta possa ter tempo de
exportar os dados para a planilha e em seguida dar continuidade ao processo.

Percebi, pelo menos neste meu problema, que a interação entre as aplicações necessita de um tempo para o processamento completo, o qual envolve:

- Busca dos dados dentro da base;
- Exportação destes dados para uma planilha, que tem como base um modelo;
- Adequação dos dados nesta planilha modelo.

Ao passo que o MS Access executava suas funcionalidade de uma forma rápida, o mesmo não ocorria com MS Excel que ficava 'agarrado' no seu processamento de forma mais lenta (letárgica diria). Para tanto, precisei dar um sossega leão no MS Access, utilizando a função Sleep().

Call Sleep(4000)  ' Pausa para o sistema operacional não fundir...
Pode ser que necessite dessa funcionalidade em outros aspectos, por isso te passo o modo como
resolvi aqui nesta Sleep(), mas poderá fazer de outro modo:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Seria muito legal, caso já tenha se deparado com este problema, que o comentasse, e como fez
para resolvê-lo. Desse modo criaremos um repositório para elucidar aqueles que forem atacados
pelo mesmo inconveniente Erro 3275.
 
Twitter: @officespecialis
             @brzexceldevelop
             @brzaccessdevel


terça-feira, 1 de dezembro de 2009

Tome posse das INFORMAÇÕES da sua empresa!

Empresas em todo o mundo estão permeadas de dados oriundos de diversas origens distintas e apesar do acesso a este, têm dificuldades em obter as necessárias informações para tomar as suas mais relevantes decisões.
 
Não é menos verdade que em muitas reuniões todos estejam munidos de INFORMAÇÕES totalmente irrelevantes. Têm acesso a dados de A a Z, completamente desprovidos de conteúdo, pois estes não contém a abrangência e nem a diversificação, que lhes propiciem dinamicidade na análise.
 
Em alguns casos as corporações têm acesso a um grande amontoado de dados distribuidos nos seus servidores como BIs, Datawarehouse e cubos OLAP.
 
Informação é algo muito precioso e deve ser obtida de forma rápida e exata.

Reunir informações de diferentes países, traduzindo-os nas estratégias e targets pré-estabelecidos tem sido um desafio para a maioria dos executivos em todo o mundo.
Não raro seus KPIs (Indicadores de Performance) não estão alinhados com as estratégias da empresa.

A diversidade de bases de dados nas quais as informações podem estar são muito variáveis, quando necessita consolidar tais informações em
Dashboards e Scorecards, estes precisam estar reundos de modo coerente e sucinto.

Os
Balanced Scorecards oferecem aos executivos as ferramentas que necessitam para alcançar o sucesso na obtenção de suas informações. Esta importante ferramenta traduz a missão e a estratégia da sua empresa num conjunto abrangente de medidas de desempenho que serve 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 é: Mesmo estando cercado por dados de todas as origens, como posso  obter INFORMAÇÕES relevantes para tomar minhas decisões?

?ui=2&view=att&th=1254a1f913f53170&attid=0.1&disp=attd&realattid=ii_1254a1f913f53170&zw
Os conceitos e as regras de negócio precisam ser aplicados aos dados de modo a atender a empresa como um TODO e não apenas a alguns departamentos e países.

Os resultados mais comuns são INFORMAÇÕES IMPRECISAS, números que não coicidem durante as reuniões, resultando no adiamento de decisões altamente relevantes, ou na tomada de decisões inseguras.

Para que a Direção da empresa possa tomar decisões abalizadas, torna-se imprescindível que o conteúdo seja coeso, sintético e direcionado para atender o foco das reuniões.

O
Management Information System é um Sistema de Informação Gerencial, que interliga todos os dados da organização. Consiste na rede de canais de comunicação da organização permeando todas as estruturas executivas. É composto por todos os componentes que recolhem, manipulam e disseminam as informações. Nele estão inclusos hardware, software, pessoas, sistemas de telecomunicação, e os dados propriamente ditos.
Essas soluções são facilmente implementadas sem que se necessite adquirir novos softwares ou sistemas. Permita-me norteá-lo.
 
Utilize o que há de melhor em técnicas de análise!

:: Consulte seus dados concentrados em Scorecards.
:: Utilize layouts funcionais que destaquem as informações mais relevantes.
:: Envie ou arraste tabelas e gráficos para suas apresentações eletrônicas.
:: Compartilhe as informações através de Dashboards funcionais.

Cause um impacto positivo em todos os níveis executivos da sua gestão.

Entre em contato, presto consultoria pontual.

:: Avalie diferentes cenários
:: Reúna as informações mais importante para sua análise.
:: Efetue simulações com os dados reais ou com estimativas.
:: Compare suas informações com dados do seu Marketshare.
:: Tenha relatórios atualizados com informações oriundas da Internet.


Não é necessário a aquisição de nenhum produto!

Implemente soluções com os produtos já disponíveis na sua Empresa ou Departamento.

Reunir informações de diferentes países, traduzindo-os nas estratégias e targets pré-estabelecidos tem sido um desafio para a maioria dos executivos em todo o mundo.

- Torne a informação clara e compreensível nos seus relatórios
- Complete suas planilhas com mais funcionalidades.
- Melhore a apresentação das suas informações.
- Aplique layouts modernos.
- Envie dados diretamente para as apresentações do Powerpoint.
- Envie análises consolidadas diretamente para os seus clientes.
- Capte informações do marketshare diretamente da Web
.

Implemento soluções com os produtos já instalados na sua Empresa e Departamento.

Organizo os dados disponíveis, deixando seus novos relatórios com layouts funcionais.

Amplie a visão:
       Demonstração 1
       Demonstração 2
 
 

terça-feira, 24 de novembro de 2009

Review - MS Excel 2010 X MS Excel 2007.

Bem às portas da liberação da nova versão do MS Excel 2010, queremos efetuar uma pequena e singela comparação entre as versões 2007 e 2010 (incluindo a versão 2003 quando possível). Convido-o a observar esses estudos simples mas bem elucidativos quanto a melhora de performance do MS Excel 2010.
 
Este artigo é uma tradução livre e ampliada do que foi publicado em DATABISON.

Excel 2010 x Excel 2007

Os desempenhos forma medidos em quatro parâmetros:
1. Tempo abrangido para a criação de tabela dinâmica;
2. Tempo abrangido para a criação de gráficos;
3. Tempo abrangido para preencher um intervalo com números;
4. Tempo abrangido para preencher um intervalo com fórmulas.

Todos os testes foram realizados em arquivos já salvos em pastas de trabalho, de modo que qualquer interferência do formato do arquivo fosse excetuada. (Aviso: Obviamente não foram feitos testes "cientificos" e, portanto, os resultados são apenas indicativos [e não conclusivos]. A execução variará de acordo com configurações de hardware e software).

Tempo abrangido para a criação de tabela dinâmica:

2007-12,08 sec
2010-10,38 sec

excel-2010-excel-2007-pivot-table.png

Foi utilizado o código do exemplo abaixo para criar um conjunto de tabelas dinâmicas (Pivot Tables). O MS Excel 2003 não pôde participar deste ensaio, a versão do código utilizado para criar a PT (Pivot Table) seria um pouco diferente das utilizadas para o MS Excel 2007 e MS Excel 2010. O MS Excel 2010 teve um tempo de execução médio de 10,38 segundos o que foi cerca de 14% inferior ao MS Excel 2007.  

Sub create_pivot()
t = Timer
For i = 1 To 100
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "Sheet1!R1C1:R3457C6", Version:=xlPivotTableVersion12).CreatePivotTable _
        TableDestination:=ActiveSheet.Cells(1, 1), TableName:="PivotTable1", DefaultVersion _
        :=xlPivotTableVersion12
Next i
MsgBox Timer - t
End Sub

Tempo abrangido para preencher um intervalo com números:

2003-14,86 sec
2007-32,57 sec
2010-10,86 sec

excel-2010-excel-2007-comparison-fill-range-with-number.png
A melhoria mais perceptível está neste desempenho ao preencher uma planilha com números. O MS Excel 2010 ficou em primeiro lugar com um tempo de 10,86 segundos. Deixando para trás o MS Excel 2003, que ficou em segundo lugar com um tempo de 14,86 segundos. Já o MS Excel 2007 ficou para trás, com um tempo de 32,57 segundos. Melhoria de 119%.

Sub fill_range()
t = Timer
For i = 1 To 5000
For j = 1 To 10
Cells(i, j).Value = 10
Next j
Next i
MsgBox Timer - t
End Sub
 
 
Tempo abrangido para preencher um intervalo com fórmulas

2003-6,24 sec
2007-14,32 sec
2010-8,84 sec

excel-2010-excel-2007-comparison-fill-range-with-formulas.png

Aqui observamos mais uma tarefa na qual MS Excel 2010 não é melhor do que MS Excel 2007, quando se trata de preencher uma planilha com fórmulas. Mais uma vez percebemos que o trabalho imposto na Microsoft foi em melhorar o desempenho aparente. Embora o MS Excel 2003 bata seus sucessores em 6,24 segundos, o MS Excel 2010 não está muito atrás em 8.84 segundos, enquanto o MS Excel 2007 chafurda na poeira em 14,32 segundos. Aperfeiçoamento - 38%.

Sub fill_formula()
t = Timer
For i = 1 To 500
For j = 1 To 10
Cells(i, j).FormulaR1C1 = "=SUM(10+20)"
Next j
Next i
MsgBox Timer - t
End Sub

Tempo abrangido para a criação de gráficos

2007-29,62 sec
2010-10,74 sec

Este último teste foi executado para medir os progressos da área gráfica. Gostaria muito de poder comparar estes resultados com os informações do MS Excel 2003, mas, como no caso das tabelas dinâmicas, o próprio código teria sido um pouco diferente e, portanto, não estaríamos comparandor maçãs-com-maçãs. Mais uma vez, o MS Excel 2010 supera o MS Excel 2007 pela larga vantagem de 64%.

excel-2010-excel-2007-charting.png


Sub create_chart()
t = Timer
For i = 1 To 10
    Range("A1:K4").
Select
    Range("K4").Activate
    ActiveSheet.Shapes.AddChart.
Select
    ActiveChart.SetSourceData Source:=Range("Sheet1!$A$1:$K$4")
Next i
MsgBox Timer - t
End Sub
 
Pois bem senhoras e senhores, sim, há melhorias que ajudam na pontuação do MS Excel 2010 em detrimento do MS Excel 2007 em todas as suas muitas áreas.
 
Agora, não fiquemos cegos ao fato de que ao compará-lo com o MS Excel 2003, este ainda deixa poderia ser melhor.
 
Não desconsideremos o fato de que:
O MS Excel 2003 suporta     16.777.216 células por planilha,
O MS Excel 2010 suporta 17.179.869.184 células por planilha,
 
Ou seja, 1.024 vezes mais células.
 
Convido-o a ampliar os testee e a retornar-me com seus comentários e acréscimos. Assim poderemos compreender melhor e mais profundamente as reais vantagens produtivas dessa nova versão.
 

Twitter: @officespecialis
             @brzexceldevelop
             @brzaccessdevel


André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com

segunda-feira, 23 de novembro de 2009

VBA Access - Criando uma planilha (MS Excel com gráfico) a partir de uma aplicação MS Access.

Vez por outra recebo pedidos sobre como criar planilhas através do Access, ou seja, a partir de uma aplicação MS Access que alguém já tem desenvolvida.

Na verdade isso é muito simples, por isso estou ampliando alguns passos nesta criação. Além de demonstrar como criar a planilha, estou populando-a com dados e inserindo um gráfico, tudo programaticamente (ou de modo automatizado, como preferem alguns).

Espero que gostem, ampliem o exemplo e me retornem opiniões e acréscimos...Ahhh e o mais importante para toda a comunidade de desenvolvedores, compartilhe com o máximo de pessoas que conhecer!

Boa diversão!

 
Private Sub cmdMakeChart_Click()
    '  Author:                           Date:                     Contact:                           URL:
    '  André Bernardes             23/11/2009 10:40   
bernardess@gmail.com     http://al-bernardes.sites.uol.com.br/
    '  Cria uma planilha, popula-a com uma periodicidade e dados, cria um gráfico.
 
    Dim AppMSExcel As Excel.Application
    Dim the_date As Date
    Dim stop_date As Date
    Dim r As Integer
    Dim new_chart As Chart
    Dim new_book As Workbook
    Dim active_sheet As Worksheet
 
    ' Abre a aplicação MS Excel.
    Set AppMSExcel = CreateObject("Excel.Application")
 
    ' Mantém aplicação escondida.
    Let AppMSExcel.Visible = True
 
    ' Cria uma nova planilha (spreadsheet).
    Set new_book = AppMSExcel.Workbooks.Add()
 
    ' Gera valores randômicos dentro de um período.
    Set active_sheet = new_book.Sheets(1)
   
    Let the_date = CDate("01/11/09")
    Let stop_date = CDate("23/11/09")
    Let r = 1
   
    Do While the_date < stop_date
        Let active_sheet.Cells(r, 1) = the_date
        Let active_sheet.Cells(r, 2) = Int(Rnd * 90) + 10
        Let the_date = DateAdd("d", 1, the_date)
        Let r = r + 1
    Loop
 
    ' Cria um gráfico (chart) conectado a estes dados.
    Set new_chart = Charts.Add()
   
    With new_chart
        Let .ChartType = xlLineMarkers
       
        .SetSourceData Source:=active_sheet.Range("A1:B" & Format$(r - 1)), PlotBy:=xlColumns
        .Location Where:=xlLocationAsObject, Name:=active_sheet.Name
    End With
 
    Let active_sheet.Shapes(active_sheet.Shapes.Count).Top = 10
    Let active_sheet.Shapes(active_sheet.Shapes.Count).Left = 100
    Let active_sheet.Shapes(active_sheet.Shapes.Count).Width = 600
    Let active_sheet.Shapes(active_sheet.Shapes.Count).Height = 400
 
    ActiveChart.ChartArea.Select
 
    ' Acerta primeira fase de detalhes.
    With ActiveChart
        Let .HasTitle = True
        Let .ChartTitle.Characters.Text = "Valores de Fevereiro"
        Let .Axes(xlCategory, xlPrimary).HasTitle = True
        Let .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Data"
        Let .Axes(xlValue, xlPrimary).HasTitle = True
        Let .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Valores"
    End With
 
    ' Fecha a pasta (workbook) salvando.
    AppMSExcel.ActiveWorkbook.Close True
 
    ' Fecha o MS Excel.
    AppMSExcel.Quit
    Set AppMSExcel = Nothing
 
    MsgBox "Planilha Gerada!"
End Sub
 


André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com
 
Twitter: @officespecialis
                 @brzexceldevelop
                 @brzaccessdevel
 

 

A&A: Feedback - Ajuda em VBA.

Caro Vinicius,
Bom dia.
 
Primeiramente quero agradecer-lhe pelos acessos aos meus Blogs de VBA:
 
Acredito que, para pessoas que estão iniciando como você, estes sejam relevantes
por propiciar acesso a vários códigos prontos.
 
Bem, quanto a rotinas de interação com as classes gráficas, estas são extensas e
muito produtivas para a utilização.
 
Sugiro-lhe alguns sites para o seu estudo pessoal (caso não tenha problemas com a
língua inglesa, caso contrário aguarde por mais códigos em novos artigos, nos meus
Blogs):
 
 
No mais, não deixe de comprar bons livros, focando especialmente o Office 2007,
bem com a mais nova suíte 10!
 
Se possível retorne comentando sua evolução e aproveitamento...Compartilhe o
endereço dos meus Blogs com outros.
 
Obrigado e forte abraço!
 
André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com

Twitter: @officespecialis
            @brzexceldevelop
            @brzaccessdevel

2009/11/21 Vinicius Figueiredo de Castro <sssvinicius@yahoo.com.br>


Bernardes
 
Parabéns pelo seu blog e currículo.
 
Gostaria de tirar uma dúvida com você. Estou começando a programar agora em excel e no inicio gostaria de ter algumas rotinas pre prontas. PRINCIPALMENTE EM GRÁFICO. Como eu consigo interagir uma planília de VBA com os gráficos de excel
 
Muito obrigado
 
Vinicius Figueiredo de Castro
sssvinicius@yahoo.com.br