Quelle est la bonne façon de configurer VBA connexion ADO à partir d'Excel pour l'Accès à plusieurs utilisateurs et les fichiers?

J'ai plusieurs fichiers excel qui sont utilisés pour la saisie de données. Les fichiers sont identiques en termes de fonctionnalités, un pour chaque centre de service de la nôtre. Dans le formulaire il y a un bouton qui lance une macro qui transforme les données de format de tableau sur une autre feuille qui est ensuite plus tard téléchargé à l'Accès db.

Tout a bien fonctionné sur mon propre ordinateur. L'ajout de nouvelles lignes, la mise à jour des lignes existantes et la suppression de postes existants. J'avais utilisé au début de liaison qui conduisent à des problèmes quand j'ai déplacé les fichiers dans notre lecteur réseau. J'ai réussi à convertir les fichiers de la liaison tardive mais ensuite d'autres problèmes ont surgi.

La plupart du temps, le téléchargement de l'Accès n'est pas de travail, en particulier lorsque plusieurs utilisateurs essaient de faire des trucs en même temps. La plupart des communes code d'erreur, c'est que je ne suis pas à l'aide de mises à jour de la requête ou que cette méthode ne prend pas en charge l'arrière de défilement. Je regrette de ne pas les chiffres réels des codes d'erreur, mais je ne peux pas les reproduire à l'heure actuelle.

Mon code de connexion est la suivante, c'est un peu un mélange de copier coller le code à partir de différents exemples.

L'ouverture de la connexion et d'autres prestuff

Sub excel2access()

Const adUseClient = 3  
Const adUseServer = 2
Const adLockOptimistic = 3
Const adOpenKeyset = 1
Const adOpenDynamic = 2

Dim oConn As Object
Dim cmd As Object
Dim rs As Object
Dim r As Long
Dim criteria As String
Dim Rng As Range

Set oConn = CreateObject("ADODB.Connection")
Set cmd = CreateObject("ADODB.Command")

oConn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source= '" & Range("dbpath").Value & "\" & Range("dbfile").Value & "' ;"

Set rs = CreateObject("ADODB.Recordset")
rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic
rs.LockType = adLockOptimistic
rs.Open "Select * from need_rows WHERE service_center = '" & Range("scenter_name").Value & "'", oConn

r = 2 ' the start row in the worksheet

Sheets("data").Select

Cette suite de bits regarde à travers les données dans la feuille excel et essaie de trouver des match de jeu d'enregistrements trouvés pour ce centre de service. Si la correspondance n'est trouvée nouvel enregistrement est créé et si une correspondance est trouvée, l'ancien enregistrement est mis à jour.

Do While Len(Range("A" & r).Formula) > 0
    With rs
        criteria = Range("D" & r).Value
        .Find "identifier='" & criteria & "'"
        If (.EOF = True) Or (.BOF = True) Then
            .AddNew ' create a new record
            .Fields("service_center") = Range("scenter_name").Value
            .Fields("product_id") = Range("A" & r).Value
            .Fields("quantity") = Range("B" & r).Value
            .Fields("use_date") = Range("C" & r).Value
            .Fields("identifier") = Range("D" & r).Value
            .Fields("file_type") = Range("file_type").Value
            .Fields("use_type") = Range("E" & r).Value
            .Fields("updated_at") = Now
            .Update             
        Else
            If .Fields("quantity") <> Range("B" & r).Value Then
                .Fields("quantity") = Range("B" & r).Value
                .Fields("updated_at") = Now
                .Update ' stores the new record
            End If                      
        End If
        .MoveFirst 
    End With
    r = r + 1 
Loop

rs.Close
Set rs = Nothing
Set oConn = Nothing

MsgBox "Confirmation message"
End Sub

Edit: Basé sur le lien en barrowc j'ai changé de type de curseur pour adOpenStatic. J'ai fait un test avec plusieurs utilisateurs en essayant de télécharger des données en même temps et tout a fonctionné parfaitement. Jusqu'à ce qu'un utilisateur est resté dans le fichier et passé un bon moment de modifier les données, puis il a essayé de télécharger des données pour la base de données et a obtenu message d'erreur suivant: https://dl.dropbox.com/u/3815482/vba_error.jpg

Encore une fois, je suis de retour là où j'ai commencé à partir.

Aussi, je suis ouvert aux commentaires sur mon code, en général, ainsi.

J'utilise Office 2010.

Suis-je le fais mal? Toute aide est très appréciée.

  • "Seul un contexte de adOpenStatic est pris en charge si la propriété CursorLocation adUseClient" - voir msdn.microsoft.com/en-us/library/windows/desktop/...
  • Ce n'est pas la voie à suivre à ce sujet, si je suis en train de lire correctement, tous les utilisateurs sont en mesure de se connecter à l'emplacement du fichier d'accès. Vous feriez mieux d'en développer une front de la fin de l'application d'accès pour tous à installer qui des liens vers les principales back-end. L'accès peut créer un beaucoup plus dynamique/riche en entrée format de Excel.
  • Ceux-ci sont utilisés pour la planification de consommables d'achats pour chaque semaine de l'année. Je n'ai pas trouvé un moyen de le faire dans un Accès d'une manière qui donne une bonne image de la situation globale.
  • Barrowc, merci. Semble fonctionner maintenant.
  • Ajouté le message d'erreur et un peu plus de explanatin. Aussi, retiré dernier code que ce n'est pas le problème majeur ici.
InformationsquelleAutor thepanu | 2012-10-24