PROBLEMA: Valores do Excel Devolvidos como NULL Utilizando OpenRecordset de DAO

Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Sintomas
Quando liga a uma Folha de Cálculo do Excel utilizando o método OpenRecordset de DAO, alguns valores existentes numa coluna do Excel poderão ser devolvidos como Nulo, apesar do valor subjacente não ser Nulo. Normalmente, isto ocorre quando os tipos de dados numérico e texto estão misturados na mesma coluna do Excel.
Causa
Este problema é causado por uma limitação do controlador ISAM do Excel que, após determinar o tipo de dados de uma coluna do Excel, devolve um Nulo para qualquer valor que não tenha o tipo de dados que o controlador ISAM assumiu para essa coluna do Excel. O controlador ISAM do Excel determina o tipo de dados de uma coluna do Excel examinando os valores reais nas primeiras colunas e seleccionando um tipo de dados que representa a maioria dos valores existentes nessa amostragem.
Resolução
Existem duas medidas para contornar este comportamento:
  1. Certifique-se de que os dados são introduzidos como texto no Excel. Reformatar a coluna do Excel para Texto não resolve o problema. Tem de reintroduzir os valores existentes depois de reformatar a coluna do Excel. No Excel, pode utilizar F5 para reintroduzir os valores existentes na célula seleccionada.
  2. Pode adicionar a opção IMEX=1; à cadeia de ligação do Excel no método OpenDatabase. Por exemplo:
          Set Db = OpenDatabase("C:\Temp\Book1.xls", _            False, True, "Excel 8.0; HDR=NO; IMEX=1;")						
    NOTA: Definir IMEX=1 indica ao controlador para utilizar o modo de Importação. Neste estado, a definição de ImportMixedTypes=Text no registo será utilizada. Isto força os dados mistos a serem convertidos para texto. Para que esta resolução funcione com fiabilidade, também terá de modificar a definição do registo TypeGuessRows=8. Por predefinição, o controlador ISAM analisa as oito primeiras linhas e determina o tipo de dados a partir dessa amostragem. Se esta amostragem de oito linhas for apenas constituída por dados numéricos, a definição de IMEX=1 não converterá o tipo de dados predefinido para Texto; o tipo de dados permanecerá numérico.

    Tem de ter cuidado para não utilizar IMEX=1 indiscriminadamente. Trata-se do modo IMPORT, pelo que os resultados poderão ser imprevisíveis se tentar anexar ou actualizar dados neste modo.

    As definições possíveis de IMEX são:
            0 é o modo de Exportação        1 é o modo de Importação        2 é o modo Associado (capacidades de actualização plenas)						
    A chave do registo onde as definições descritas acima estão localizadas é:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\Engines\Excel

    Consulte a secção REFERÊNCIAS deste artigo para obter informações sobre o que acontece quando a folha de cálculo do Excel tem títulos de coluna de texto com dados numéricos.
Ponto Da Situação
Este comportamento ocorre por predefinição.
Mais Informação

Passos para Reproduzir o Comportamento

Para duplicar este problema, tem de criar primeiro uma Folha de Cálculo do Excel com uma folha de cálculo predefinida Folha1. Na primeira coluna da Folha1, introduza os seguintes valores - 123, aaa, 456, bbb, 789. Guarde este Livro no directório C:\Temp com o nome Livro1.XLS.

No Visual Basic, crie um novo projecto EXE Padrão e siga estes passos:
  1. Crie uma referência à Microsoft DAO 3.5 Object Library. No Visual Basic 6.0, terá de utilizar a Microsoft DAO 3.51 Object Library.
  2. Adicione um CommandButton ao Formulário novo.
  3. Coloque o código seguinte na secção General Declarations do Formulário:
          Dim Db As Database      Dim Rs As Recordset      Private Sub Command1_Click()          Set Rs = Db.OpenRecordset("Sheet1$")          'This will print the spreadsheet Text values as Nulls.          Do While Not Rs.EOF              Debug.Print Rs(0)              Rs.MoveNext          Loop      End Sub      Private Sub Form_Load()          'HDR refers to the Excel header row.      Set Db = OpenDatabase("C:\Temp\Book1.xls", _               False, True, "Excel 8.0; HDR=NO;")      End Sub      Private Sub Form_Unload(Cancel As Integer)          Db.Close          Set Db = Nothing      End Sub						
    Execute o Projecto premindo a tecla F5; note que, na janela Debug, os valores de texto são impressos como Nulo. Se a maior parte dos valores da Folha de Cálculo do Excel eram texto, o resultado do código acima seria invertido. Por outras palavras, os valores numéricos seriam devolvidos como Nulos.
Referências
Para obter informações adicionais, consulte o seguinte artigo na Base de Dados de Conhecimento Microsoft:

190195 : HOWTO: Extract Information From Excel Sheet with DAO
kbDSupport kbdse spreadsheet workbook kbDAO350 kbDAO300 kbDAO250 kbIISAM kbExceL kbVBp400 kbVBp500 kbVBp600 kbVBp kbRegistry
Propriedades

ID do Artigo: 194124 - Última Revisão: 12/05/2015 09:27:52 - Revisão: 4.0

  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 4.0 Enterprise Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
  • kbnosurvey kbarchive kbprb KB194124
Esta informação foi útil?