Você está offline; aguardando reconexão

CORREÇÃO: O ADO insere dados em colunas erradas no Excel

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 314763
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.
Sintomas
Quando você usar o ADO para inserir novas linhas de dados em uma planilha do Microsoft Excel, se os dados incluem campos que contêm valores de seqüência de caracteres vazia, ADO pode inserir os valores de dados dos campos numéricos subseqüentes para as colunas erradas no Excel.

Esse problema ocorre no Microsoft OLE DB Provider for Jet versão 4.0 e o Driver de ODBC do Microsoft Excel. Esse problema ocorre se você usar uma instrução SQL INSERT ou AddNew e os métodos de atualização do objeto ADO Recordset .

Esse problema não ocorre se a pasta de trabalho do Excel é aberta no aplicativo Excel ao ADO insere novos registros.

No entanto, Microsoft desencoraja essa prática porque um vazamento de memória ocorre se o Excel esteja aberto durante as operações de ADO.Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
319998 Erro: Vazamento de memória quando você consultar a planilha do Excel aberta com o ADO
Consulte a seção "Mais informações" para obter detalhes sobre as circunstâncias em que esse problema ocorre.
Resolução
Para resolver esse problema, obtenha o service pack mais recente do Jet 4.0 service pack mais recente. Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
239114 Como: Obter o Service Pack mais recente para o Microsoft Jet 4.0 Database Engine
Situação
A Microsoft confirmou que esse é um problema nos produtos da Microsoft listados no começo deste artigo.
Mais Informações

Passos para reproduzir o comportamento

  1. Abra o Microsoft Excel e, em seguida, crie uma nova pasta de trabalho.
  2. Em Sheet1, digite os seguintes dados de exemplo, começando com a célula A1 no canto superior esquerdo:
    Coluna aColuna bColumnCColumnDColumnEColumnF
    11teste11teste
    22teste22teste

  3. Salve a pasta de trabalho como xls. Você pode deixar o aplicativo Excel aberta, mas você deve fechar a nova pasta de trabalho.
  4. No Microsoft Visual Basic, crie um novo projeto Standard EXE. Form1 é criado por padrão.
  5. Sobre o Projeto menu, clique em Referências. Na lista de referências disponíveis, selecione Microsoft ActiveX Data Objects 2.x Biblioteca.
  6. Local de um CommandButton controlar no Form1 e, em seguida, cole o seguinte código no Clique em procedimento de evento para o botão. Observe que esse código insere uma seqüência vazia na coluna do meio, a coluna c
    Private Sub Command1_Click()   Dim strCn As String   Dim cn As ADODB.Connection   Dim rs As ADODB.Recordset   Dim fld As ADODB.Field   'Open connection   strCn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _      "Data Source=" & App.Path & "\Test.xls;" & _      "Extended Properties=Excel 8.0"   Set cn = New ADODB.Connection   cn.Open strCn       'Add new values.   Set rs = New ADODB.Recordset   With rs      .CursorLocation = adUseClient      .Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic      .AddNew      .Fields("ColumnA").Value = 3      .Fields("ColumnB").Value = 3      .Fields("ColumnC").Value = ""      .Fields("ColumnD").Value = 3      .Fields("ColumnE").Value = 3      .Fields("ColumnF").Value = "testing"      .Update      .Close   End With   Set rs = Nothing   cn.Close   Set cn = NothingEnd Sub					
  7. Salve seu projeto de teste do Visual Basic na mesma pasta como a pasta de trabalho, xls.
  8. Executar o projeto e, em seguida, clique no botão. Na primeira vez que você executar o projeto no Visual Basic Integrated Development Environment (IDE), você receberá a seguinte mensagem de erro:
    Erro de tempo de execução '-2147467259 (80004005)':Sequência de agrupamento não suportada pelo sistema operacional selecionada
    Este é um problema conhecido.Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
    246167 Agrupamento seqüência erro inicial ADODB Recordset na primeira vez contra um Excel XLS
  9. Na caixa de diálogo de mensagem de erro, clique em Debuge, em seguida, pressione a tecla F5 para continuar a executar o projeto. Observe que isso insere duas novas linhas de dados em vez de um, porque Atualização executar duas vezes.
  10. Feche o formulário para finalizar o projeto. Abra xls no Excel e, em seguida, examinar os dados de Sheet1. Você espera que os seguintes resultados:

    Coluna aColuna bColumnCColumnDColumnEColumnF
    11teste11teste
    22teste22teste
    3333teste

    No entanto, você verá os seguintes dados:

    Coluna aColuna bColumnCColumnDColumnEColumnF
    11teste11teste
    22teste22teste
    3333teste

    Ela aparece como se a seqüência de caracteres vazia é inserida no ColumnC foi ignorada e desapareceu. Portanto, quaisquer valores numéricos subseqüentes são inserida uma coluna à esquerda de seus destinos pretendidos. A coluna de seqüência de caracteres subseqüentes não é afetada.

Variação 1

Configure os dados de teste da seguinte maneira:

Coluna aColuna bColumnCColumnDColumnE
1teste11teste
2teste22teste

No projeto do Visual Basic, modifique a seção para adicionar novos valores da seguinte maneira:
   'Add new values.   Set rs = New ADODB.Recordset   With rs      .CursorLocation = adUseClient      .Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic      .AddNew      .Fields("ColumnA").Value = 3      .Fields("ColumnB").Value = ""      .Fields("ColumnC").Value = 3      .Fields("ColumnD").Value = 3      .Fields("ColumnE").Value = "testing"      .Update      .Close   End With   Set rs = Nothing   cn.Close   Set cn = Nothing				
Quando você abrir xls no Excel, Sheet1 exibe os seguintes dados:

Coluna aColuna bColumnCColumnDColumnE
1teste11teste
2teste22teste
333teste

Observe que esse problema não ocorre quando uma coluna numérica única precede o valor de seqüência de caracteres vazia.

Variação 2

Configure os dados de teste da seguinte maneira:

Coluna aColuna bColumnCColumnDColumnEColumnFColumnG
11testeteste11teste
22testeteste22teste

No projeto do Visual Basic, modifique a seção para adicionar novos valores da seguinte maneira:
   'Add new values.   Set rs = New ADODB.Recordset   With rs      .CursorLocation = adUseClient      .Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic      .AddNew      .Fields("ColumnA").Value = 3      .Fields("ColumnB").Value = 3      .Fields("ColumnC").Value = ""      .Fields("ColumnD").Value = ""      .Fields("ColumnE").Value = 3      .Fields("ColumnF").Value = 3      .Fields("ColumnG").Value = "testing"      .Update      .Close   End With   Set rs = Nothing   cn.Close   Set cn = Nothing				
Quando você abrir xls no Excel, Sheet1 exibe os seguintes dados:

Coluna aColuna bColumnCColumnDColumnEColumnFColumnG
11testeteste11teste
22testeteste22teste
3333teste

Se o ADO insere dois valores de seqüência de caracteres vazia, ele aparecerá como se as seqüências de caracteres vazias que são inseridas em ColumnC e ColumnD são ignoradas e desapareceram. Portanto, quaisquer valores numéricos subseqüentes são inseridas duas colunas à esquerda aos destinos pretendidos. A coluna de seqüência de caracteres subseqüentes não é afetada.
Referências
Para obter informações adicionais, clique nos números abaixo para ler os artigos na Base de dados de Conhecimento da Microsoft:
294410 ACC2002: Nulos substituídos pelos dados do campo próximo ao exportar para Excel
257819 COMO: Usar o ADO com dados do Excel do Visual Basic ou VBA

Propriedades

ID do Artigo: 314763 - Última Revisão: 03/21/2013 10:48:00 - Revisão: 3.0

  • kbHotfixServer kbqfe kbbug kbfix kbiisam kbjet kbmt KB314763 KbMtpt
Comentários
; m=document.createElement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?"> ;