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.
Vous devez vous connecter pour publier un commentaire.
Vous allez avoir beaucoup de problèmes avec la base de données étant verrouillé par d'autres utilisateurs. C'est pour plusieurs raisons:
Avoir créé un grand nombre de macros, de la connexion à une base de données MS Access, je peux vous dire vers le haut. Vous allez avoir beaucoup de problèmes de connexion où la base de données est verrouillée par des feuilles de calcul que quelqu'un a laissé ouvert toute la journée/la nuit à cause de choses comme ne pas gérer les erreurs inattendues (la connexion ne ferme jamais).
Même une fois que vous résoudre les problèmes de tous vous avez besoin est UNE personne à l'aide de la feuille de calcul avec l'ancien code et ils vont continuer à verrouiller la base de données.
Un énorme problème, c'est que si quelqu'un se connecte à la base de données lors de sa déjà ouvert par quelqu'un d'autre, je crois qu'ils héritent du type de connexion de la base de données ouverte résultant en une chaîne de verrous en écriture. Ensuite, vous devez vous assurer que toutes les connexions sont coupées afin de réinitialiser la connexion.
Vous avez également pas montré comment les données sont placées dans la feuille de calcul dans la première place. Vous êtes peut-être pas correctement la fermeture de la connexion et qui pourrait être la raison pourquoi, parfois, la base de données est verrouillée.
Il y a beaucoup de choses différentes, vous pouvez essayer de contourner cette:
Personnellement, j'aime utiliser MS Excel pour afficher MS Accéder à des données pour les utilisateurs, mais évitez comme la peste le faire de mise à jour de MS Access. Cependant, si je devais le faire, je le ferais par l'utilisation de oConn.Exécuter des commandes ne peut pas ouvrir un jeu d'enregistrements, de comparer et de ralentissement de la pousse comme qui permettrait de maintenir la connexion ouverte trop longtemps.
Désolé pour le mur de texte. Espérons que cette information vous aide à.
me semble que le Jet n'est pas assez fiable pour votre environnement. J'ai souvent l'utilisation de SQL Server /Accès aux Données des Projets afin de consolider les informations provenant de plusieurs feuilles de calcul en une seule base de données client qui n'a pas barf lorsque vous ajoutez une demi-douzaine d'utilisateurs.
Vous pouvez également essayer d'utiliser les requêtes action.
D'abord, je voudrais essayer de mettre à jour à l'aide de (vous devrez peut-être le format le maintenant de la valeur)
Si compteur est à zéro, alors la aucune ligne n'a été mis à jour, donc soit il n'y a pas de ligne de mise à jour ou la quantité n'a pas changé. De toute façon, nous pouvons essayer d'INSÉRER, qui va échouer dans ce dernier cas, mais sans causer de problèmes.