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.
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.
Existem duas medidas para contornar este comportamento:
- 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.
- 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.
Este comportamento ocorre por predefiniçã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:
- 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.
- Adicione um CommandButton ao Formulário novo.
- 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.
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