Views

Histats

Vitrine

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


LinkWithinBrazilVBAExcelSpecialist

Related Posts Plugin for WordPress, Blogger...