CORRECTIF : ADO insère les données dans des colonnes incorrectes dans Excel

Exclusion de responsabilité du contenu obsolète de la base de connaissances

Cet article a été rédigé sur les produits pour lesquels Microsoft n’offre plus aucune prise en charge. Par conséquent, cet article est proposé « en l’état » et ne sera plus mis à jour.

Symptômes

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


Ce problème se produit dans le fournisseur OLE DB Microsoft pour Jet version 4.0 et le pilote Microsoft ODBC pour Excel. Ce problème se produit si vous utilisez une instruction SQL INSERT ou AddNew et les méthodes de mise à jour de l’objet ADO 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éconseille cette application pratique car une fuite de mémoire se produit si Excel est ouvert pendant les opérations d’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 interrogez ouvrir Excel feuille de calcul avec ADO
Reportez-vous à la section « Plus informations » pour plus de 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 de 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

État

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

Plus d'informations

Procédure pour reproduire le comportement

  1. Ouvrez Microsoft Excel, puis créez un nouveau classeur.
  2. Dans la feuille Sheet1, tapez les données suivantes, à partir de la cellule A1 dans le coin supérieur gauche :
    ColumnAColumnBColumnCColumnDColumnEColumnF
    11test de11test de
    22test de22test de

  3. Enregistrez le classeur dans Test.xls. Vous pouvez laisser l’application Excel ouverte, mais vous devez fermer le nouveau classeur.
  4. Dans le 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 à Form1, puis collez le code suivant dans la procédure événementielle Click pour le bouton. Notez que ce code insère 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 l’environnement de développement intégré Visual Basic (IDE), le message d’erreur suivant peut s’afficher :
    Erreur d’exécution '-2147467259 (80004005)' : sélectionné de classement 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 :

    Jeu d’enregistrements ADODB séquence erreur ouverture la première fois sur un fichier XLS Excel de classement 246167
  9. Dans la boîte de dialogue de message erreur, cliquez sur Déboguer, puis appuyez sur la touche F5 pour continuer à exécuter le projet. Notez que cela permet d’insérer deux nouvelles lignes de données au lieu d’une mise à jour étant exécuté deux fois.
  10. Fermez l’écran pour terminer le projet. Rouvrez Test.xls dans Excel et examinez les données dans la feuille Sheet1. Vous attendez les résultats suivants :

    ColumnAColumnBColumnCColumnDColumnEColumnF
    11test de11test de
    22test de22test de
    3333test de

    Toutefois, vous consultez les données suivantes :

    ColumnAColumnBColumnCColumnDColumnEColumnF
    11test de11test de
    22test de22test de
    3333test de

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

Variante 1

Configurer les données de test comme suit :

ColumnAColumnBColumnCColumnDColumnE
1test de11test de
2test de22test de

Dans le projet Visual Basic, modifiez la section pour ajouter de 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 :

ColumnAColumnBColumnCColumnDColumnE
1test de11test de
2test de22test de
333test de

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

Variante 2

Configurer les données de test comme suit :

ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11test detest de11test de
22test detest de22test de

Dans le projet Visual Basic, modifiez la section pour ajouter de 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 :

ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11test detest de11test de
22test detest de22test de
3333test de

Si ADO insère deux valeurs de chaîne vide, il s’affiche comme si les chaînes vides qui sont insérées dans la ColonneC et ColumnD sont ignorés et ont disparu. Par conséquent, toutes 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 : valeurs NULL sont remplacées par les données du champ suivant lors de l’exportation vers Excel
257819 comment faire : utiliser ADO avec des données Excel à partir de Visual Basic ou de VBA
Propriétés

ID d'article : 314763 - Dernière mise à jour : 27 janv. 2017 - Révision : 1

Commentaires