CORRECTIF : ADO insertions de données dans colonnes incorrectes dans Excel

Traductions disponibles Traductions disponibles
Numéro d'article: 314763 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsque vous utilisez ADO pour insérer les nouvelles lignes de données dans une feuille de calcul Microsoft Excel, si les données comprennent des champs contenant des valeurs de chaîne vide, ADO peut insérer les valeurs de données des champs numériques suivants dans les colonnes incorrectes dans Excel.

Ce problème se produit dans fournisseur Microsoft OLE DB pour Jet version 4.0 et le pilote Microsoft ODBC pour Excel. Ce problème survient si vous utilisez une instruction INSERT SQL ou la méthode AddNew et les mises à jour de l'objet Recordset .

Ce problème ne se produit pas si le classeur Excel est ouvert dans l'application Excel LORSQU'ADO insère les nouveaux enregistrements.

Toutefois, Microsoft décourage cet exercice pratique, car une fuite de mémoire se produit si Excel est ouvert pendant les opérations ADO. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
319998 BOGUE : fuite de mémoire lorsque vous requête ouvrez une feuille de calcul Excel avec ADO
Reportez-vous à la section « Plus d'informations » pour détails sur les circonstances dans lesquelles ce problème se produit.

Résolution

Pour résoudre ce problème, procurez-vous le dernier service pack Jet 4.0 service Pack. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
239114 Comment : obtenir le dernier Service Pack pour le moteur de base de données Microsoft Jet 4.0

Statut

Microsoft a confirmé qu'il s'agit un bogue dans les produits Microsoft répertoriés au début de cet article.

Plus d'informations

Procédure pour reproduire le problème

  1. Ouvrez Microsoft Excel et créez un nouveau classeur.
  2. Dans la feuille Sheet1, tapez les données exemples suivants, commençant par la cellule A1 dans le coin supérieur gauche :
    Réduire ce tableauAgrandir ce tableau
    ColumnAColumnBColumnCColumnDColumnEColumnF
    11Test11Test
    22Test22Test

  3. Enregistrez le classeur en tant que test.xls. Vous pouvez laisser l'application Excel ouvert, mais vous devez fermer le nouveau classeur.
  4. Dans Microsoft Visual Basic, créez un nouveau projet EXE standard. Form1 est créé par défaut.
  5. Dans le menu projet , cliquez sur Références . Dans la liste des Références disponibles, sélectionnez Microsoft ActiveX Data Objects 2. x bibliothèque .
  6. Placez un contrôle CommandButton sur Form1 et puis collez le code suivant dans la procédure événementielle clic pour le bouton. Notez que ce code insérer une chaîne vide dans la colonne du milieu, la colonne 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. Enregistrez votre projet de test Visual Basic dans le même dossier que votre classeur Test.xls.
  8. Exécutez le projet, puis cliquez sur le bouton. La première fois que vous exécutez le projet dans le Visual Basic intégré Development Environment (IDE), vous pouvez recevoir le message d'erreur suivantes :
    Erreur d'exécution '2147467259 (80004005)': sélectionné interclassement ordre non pris en charge par le système d'exploitation
    Il s'agit d'un problème connu.Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
    246167 Classement séquence erreur ouverture ADODB Recordset la première fois avec un fichier XLS Excel
  9. Dans la boîte de dialogue message d'erreur, cliquez sur débogage et appuyez sur la touche F5 pour continuer à exécuter le projet. Notez que cela insère deux nouvelles lignes de données au lieu d'une comme mise à jour est exécuté deux fois.
  10. Fermez l'écran pour terminer le projet. Rouvrez Test.xls dans Excel, puis examiner les données dans la feuille Sheet1. Vous pensez les résultats suivants :

    Réduire ce tableauAgrandir ce tableau
    ColumnAColumnBColumnCColumnDColumnEColumnF
    11Test11Test
    22Test22Test
    3333Test

    Cependant, vous voir les données suivantes :

    Réduire ce tableauAgrandir ce tableau
    ColumnAColumnBColumnCColumnDColumnEColumnF
    11Test11Test
    22Test22Test
    3333Test

    Elle apparaît comme si la chaîne vide est insérée dans ColumnC a été ignorée et a disparu. Par conséquent, les valeurs numériques suivantes sont insérée une colonne à gauche de leurs destinations prévues. La colonne de chaîne suivante n'est pas affectée.

Variante 1

Configurez les données de test comme suit :

Réduire ce tableauAgrandir ce tableau
ColumnAColumnBColumnCColumnDColumnE
1Test11Test
2Test22Test

Dans le projet Visual Basic, modifiez la section pour ajouter les nouvelles valeurs comme suit :
   '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
				
lorsque vous ouvrez Test.xls dans Excel, la feuille « Sheet1 » affiche les données suivantes :

Réduire ce tableauAgrandir ce tableau
ColumnAColumnBColumnCColumnDColumnE
1Test11Test
2Test22Test
333Test

Notez que ce problème ne se produit pas lorsqu'une colonne numérique unique précède la valeur de chaîne vide.

Variante 2

Configurez les données de test comme suit :

Réduire ce tableauAgrandir ce tableau
ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11TestTest11Test
22TestTest22Test

Dans le projet Visual Basic, modifiez la section pour ajouter les nouvelles valeurs comme suit :
   '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
				
lorsque vous ouvrez Test.xls dans Excel, la feuille « Sheet1 » affiche les données suivantes :

Réduire ce tableauAgrandir ce tableau
ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11TestTest11Test
22TestTest22Test
3333Test

Si ADO insère deux valeurs de chaîne vide, il apparaît que si les chaînes vides sont insérés dans ColumnC et ColumnD sont ignorées et ont disparu. Par conséquent, les valeurs numériques suivantes sont insérées deux colonnes à gauche de leurs destinations prévues. La colonne de chaîne suivante n'est pas affectée.

Références

Pour plus d'informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la Base de connaissances Microsoft :
294410 ACC2002 : Null remplacé avec des données du champ suivant lorsque vous exportez vers Excel
257819 Comment faire pour utiliser ADO avec des données Excel à partir de Visual Basic ou VBA

Propriétés

Numéro d'article: 314763 - Dernière mise à jour: lundi 26 septembre 2005 - Version: 1.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft OLE DB Provider for Jet 4.0
Mots-clés : 
kbmt kbhotfixserver kbqfe kbbug kbfix kbiisam kbjet kbqfe KB314763 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 314763
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Exclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.

Envoyer des commentaires

 

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