Bonjour à tous,

C'est ma première intervention sur ce forum. Avant de vous contacter, j'ai beaucoup travaillé à partir notamment comme premier départ du cours de Silkyroad sur la lecture/écriture dans des fichiers excel fermés, et j'ai mis en place une macro VBA qui me permet de lire et écrire dans un fichier excel fermé que j'utilise comme base de données (dans ses limites contournées avec quelques astuces (clés, reconnaissance de type) car je n'ai aujourd'hui pas d'autres choix.
Cela fonctionne globalement très bien sauf sur quelques points, dont deux majeurs : Problème aléatoire de sauvegarde des modifications, et gestion de l'accès multiple au fichier excel.

L'objet de ce post est de vous présenter le premier point et de voir avec vous si vous avez rencontré ce problème et si vous possédez une solution.

La connexion au fichier excel fermé est réalisée en VBA avec ADODB. J'utilise comme c'est obligé un recordset pour récupérer le résultat d'une requête de sélection.
Par contre, je réalise les fonctions UPDATE et INSERT sans recordset, soit en requête normale, soit en requête paramétrée. C'est un choix du fait de mes besoins de réaliser mes mises à jour sans passer par le recordset. Et 95% du temps, cela fonctionne très bien.

Cependant, aléatoirement, lors de certaines mises à jour (UPDATE ou INSERT), la mise à jour s'effectue bien dans le fichier excel (propriété iAffected correcte, retour de contrôle par une requête sélection montre la mise à jour). Par contre, à la fermeture de la connexion, la mise à jour disparait car une nouvelle requete sélection de contrôle me renvoie l'état précédent. Donc le fichier excel fermé n'a pas enregistré la mise à jour qui a été pourtant bien réalisée.

Mes questions :
=> Connaissez-vous cette problématique, et si oui, a-t-elle une solution ?
=> Existe-t-il un moyen/paramètre (dans l'objet connexion ou autre), de contrôler la sauvegarde du fichier excel fermé à la fermeture de la connexion ?
=> Existe-t-il un moyen de savoir si un fichier excel fermé à bien été enregistré, de la même manière que l'on sait si une mise à jour a été réalisée avec iAffected.

Ci-dessous mon code actuel pour l'insertion dans la base :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
'Fonction gérant une création/mise à une base de données (excel fermé)
Sub insertOuUpdateBdd(texte_SQL As String, BddEx As String)
    'Définit la requête.
    Cmd.Execute iAffected, , adExecuteNoRecords 'ou Cnn.Execute texte_SQL, iAffected, adExecuteNoRecords si exécution sans objet command
    'Si tout va bien, cela permet de s'assurer que l'écriture a fonctionné.
    If iAffected = 0 Then
        'Debug.Print "Records Affected = " & iAffected
        MsgBox "Records Affected = " & iAffected
    End If                     
End Sub
Je vous remercie par avance pour votre considération, et votre support.

En espérant avoir donné suffisamment de précision.

Luckydigit