Bonjour,
j'ai un classeur qui contient un ensemble de feuilles qui constitue ma base de données.
Les données sont utilisées dans un userform, lui aussi présent dans le même classeur. Selon les actions des utilisateurs, les données saisies ou sélectionnées dans le user form sont ensuite copiées dans une feuille finale.
je me suis basé sur le tutoriel de Laurent_ott afin d'utiliser des requêtes dans Excel sur un développement en cours.
les premières mises en application ont bien fonctionné, mais maintenant, toutes mes requêtes échouent avec l'erreur suivante : Erreur 3027 : Mise à jour impossible. La base de données ou l'objet est en lecture seule.
Je suis du coup complètement bloqué là-dessus, impossible de présenter le développement à mes clients.
Exemple de code :
la fonction de Laurent_ott
et ma procédure qui utilise la fonction afin de copier le résultat dans une cellule de la feuille finale:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 Public Function SelectTD(TD As Range, StrChamps As String, _ Optional ByVal StrSQL As String = "", _ Optional MessageSiErreur As Boolean = False, _ Optional ByRef NumErr As Long = 0) As DAO.Recordset '--------------------------------------------------------------------------------------- Dim Db As DAO.Database, Rs As DAO.Recordset ' Gestion des erreurs : Err.Clear: On Error GoTo Gest_Err ' Requête sur le tableau de données passé en argument (ou la plage avec en-tête) StrSQL = "SELECT " & IIf(StrChamps > "", StrChamps, "*") & " FROM [" & TD.Parent.Name & "$" _ & TD.CurrentRegion.Address(False, False, xlA1) & "] " & StrSQL Set Db = DAO.OpenDatabase(TD.Worksheet.Parent.FullName, False, False, "Excel 8.0;HDR=YES;") Set Rs = Db.OpenRecordset(StrSQL) ' S'il y a des enregistrements concernés: If Rs.EOF = False Then Rs.MoveFirst ' Replace le pointeur au début du jeu d'enregistrements. Set SelectTD = Rs ' Retourne les enregistrements. End If Exit Function Gest_Err: NumErr = Err.Number If Err.Number <> 0 And MessageSiErreur = True Then _ MsgBox StrSQL & Chr(10) & Chr(13) & Chr(13) & Err.Number & " : " & Err.Description Err.Clear End Function
Je précise que cette requête fonctionnait très bien il y a quelques jours.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 ' Insertion des lignes produit dans le tableau Private Sub cmdbtInsererLigne_Click() 'Déclaration des variables Dim Enr As DAO.Recordset Dim TD As Range 'Gestion d'erreur On Error GoTo SUB_Display_Error 'déclaration de la feuille et de la table Set TD = ThisWorkbook.Worksheets("STOCK").Range("STOCKPDT") 'requête sur la "table" Set Enr = SelectTD(TD, "PRODUIT, REFART, DESIGNATION, STATREG, LISTPOS, FARDELAGE, STOCKDISPO, POIDS", _ "WHERE REFART= '" & tbRefArt & "'") ' Si un jeu d'enregistrements a été retourné par la requête. If Not Enr Is Nothing Then ThisWorkbook.Worksheets("data").Range("K2").CopyFromRecordset Enr End If Exit Sub SUB_Display_Error: MsgBox "Erreur : " & Err.Number & Chr(13) & _ "Description : " & Err.Description & Chr(13) & _ "Source : " & Err.Source & Chr(13) & _ "Formulaire : Formulaire usf_Dot" & Chr(13) & _ "Fonction : Public Sub cmdbtInsererLigne_Click()", vbCritical End Sub
Quelqu'un voit-il comment solutionner ce problème?
Merci d'avance pour votre aide,
Partager