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

Traduções de Artigos Traduções de Artigos
Artigo: 314763
Expandir tudo | Reduzir tudo

Nesta página

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

Ponto Da Situação

A Microsoft confirmou que esse é um problema nos produtos da Microsoft listados no começo deste artigo.

Mais Informação

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:
    Reduzir esta tabelaExpandir esta tabela
    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 = Nothing
    End 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:

    Reduzir esta tabelaExpandir esta tabela
    Coluna aColuna bColumnCColumnDColumnEColumnF
    11teste11teste
    22teste22teste
    3333teste

    No entanto, você verá os seguintes dados:

    Reduzir esta tabelaExpandir esta tabela
    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:

Reduzir esta tabelaExpandir esta tabela
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:

Reduzir esta tabelaExpandir esta tabela
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:

Reduzir esta tabelaExpandir esta tabela
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:

Reduzir esta tabelaExpandir esta tabela
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

Artigo: 314763 - Última revisão: 21 de março de 2013 - Revisão: 3.0
Palavras-chave: 
kbhotfixserver kbqfe kbbug kbfix kbiisam kbjet kbmt KB314763 KbMtpt
Tradução automática
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 314763
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com