DetailPage-MSS-KB

Base de Dados de Conhecimento

Artigo: 194124 - Última revisão: sexta-feira, 28 de Dezembro de 2007 - Revisão: 4.0

Nesta página

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  (http://support.microsoft.com/kb/190195/ ) : HOWTO: Extract Information From Excel Sheet with DAO

A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbprb KB194124
Partilhar
Opções de suporte adicionais
Fóruns de Suporte da Comunidade Microsoft
Contacte-nos directamente
Encontre um parceiro certificado Microsoft
Loja Microsoft