Connexion ADODB simultanées

nak

XLDnaute Occasionnel
Bonjour à tous,

J'utilise un fichier partagé avec un système d'enregistrement dans une base.xlsx

Malheureusement si plusieurs personnes enregistrent en même temps, j'ai une jolie erreur :(

J'ai vu que Excel ne gérait pas les verrouillages optimistes ou pessimistes. Exist-il quand même une parade, une fonction similaire ?

Merci

A+

Code:
Sub Fermer_et_sauvegarder()
Dim Cn As ADODB.Connection
Dim Cd As ADODB.Command
Dim Rst As ADODB.Recordset
Dim Fichier As String, NomFeuille As String
Dim VSearch As String, i As Integer, L As Integer
Dim DernLigne As Long

' Chemin d'accès de la base
Fichier = "D:\Base\Base_FI.xlsx"
'Nom de la feuille dans le classeur fermé
NomFeuille = "BaseFI"

' Créer la connexion
Set Cn = New ADODB.Connection
With Cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
        & Fichier & ";Extended Properties=""Excel 12.0;HDR=NO;"""
    .Open
End With

Set Cd = New ADODB.Command
Cd.ActiveConnection = Cn

' Ouvrir 1000 lignes d'enegistrement
Cd.CommandText = "SELECT * FROM [BaseFI$A1:AA65000]"
Set Rst = New ADODB.Recordset
Rst.Open Cd, , adOpenKeyset, adLockOptimistic

' Boucler sur plusieurs lignes
DernLigne = Sheets("Fiche").Range("A" & Rows.Count).End(xlUp).Row
For L = 20 To DernLigne

' Chercher la valeur dans la BdD
Rst.Find "F1 = '" & Cells(L, 1) & "'", , adSearchForward, 1
    
' Si on se retrouve à la fin des enregistrement
' On en créé un nouveau
If Rst.EOF = True Then Rst.AddNew

    ' On rempli la ligne d'enregistrement avec les valeurs
    For i = 0 To 26 ' Mettre ici le nombre de champs -1
    Rst(i).Value = Sheets("Fiche").Cells(L, 1 + i)
    Next i

Next L

' Metre à jour la ligne d'enregistrement
Rst.Update
    
' Fermer la connexion
Cn.Close

' Effacer les variables objet
Set Cn = Nothing
Set Cd = Nothing
Set Rst = Nothing

End Sub
 

nak

XLDnaute Occasionnel
Re : Connexion ADODB simultanées

Bonsoir,

Alors personne n'a de solution pour mon problème ?

Voici la piste sur laquelle je suis en train de faire des tests.

Lorsque un utilisateur clique sur le bouton enregistrer :
- Je regarde si un fichier reserve.txt est présent dans un dossier temp.
- Si non :
- Je crée le fichier reserve.txt
- Je lance l'enregistrement avec ADODB
- Je temporise 2 secondes pour être certain que la connexion est fermée
- J'efface le fichier reserve.txt
- Si oui :
- MsgBox pour inviter l'utilisateur à relancer l'enregistrement

Que pensez vous de cette astuce ? Qui ressemble à du bricolage je vous l'accorde :)

A+
 

tototiti2008

XLDnaute Barbatruc
Re : Connexion ADODB simultanées

Bonsoir nak,

ça peut marcher, mais Excel n'est pas une base de données multi-utilisateur
Vouloir en faire une avec Excel, c'est peut-être se tromper d'outil, mais bon, ça peut marcher
Si j'ai compris, ton classeur est partagé ? Les expériences que j'ai eu sur classeur partagé et macros ne m'ont pas laissé de bons souvenirs, pas de soucis de ce côté là ?
Si tu utilises ton classeur partagé comme juste une base de données (celle à laquelle tu te connectes pour ajouter un enregistrement avec ADO), alors je te conseillerais de te connecter à une vraie base de données (même Access devrait pouvoir gérer une dizaine d'accès concurrents simultanés)
 

Discussions similaires

Statistiques des forums

Discussions
312 326
Messages
2 087 312
Membres
103 513
dernier inscrit
adel.01.01.80.19