IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Utilisation des requêtes en DAO - tutoriel de Laurent_ott [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Par défaut Utilisation des requêtes en DAO - tutoriel de Laurent_ott
    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
    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
    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
    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
    Je précise que cette requête fonctionnait très bien il y a quelques jours.

    Quelqu'un voit-il comment solutionner ce problème?

    Merci d'avance pour votre aide,

  2. #2
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 022
    Par défaut
    Bonjour.
    Peut-être que si tu mettais ton fichier en pièce jointe ça pourrait nous permettre de le tester et trouver où est le problème.

  3. #3
    Membre Expert
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Par défaut
    Bonjour Laurent_ott,

    merci pour ta réponse, mais je ne peux pas mettre le fichier à disposition à cause des données présentes dans le fichier.

    ce que je peux donner comme indice, même s'il est plutôt mince, c'est que le dysfonctionnement a commencé juste après une mise à jour de la suite Office et des mises à jour de sécurité.

    Cdt,

  4. #4
    Membre Expert
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Par défaut
    Bonjour,

    j'ai finalement trouvé quelle était la raison de mon problème.

    La feuille reçoit le résultat d'une première requête. Le fichier Excel restant ouvert, il semblerait que la feuille passe de facto en lecture seule suite à la première écriture, et bloque toute tentative d'écriture suivante.

    Peut-être est-ce aussi parce que le recordset reste ouvert?

    En tout cas la fermeture et la réouverture du fichier permet de résoudre ce problème.

    Cdt,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Framework] Utilisation des Controllers/managers/Daos
    Par libuma dans le forum Spring
    Réponses: 10
    Dernier message: 31/01/2011, 10h40
  2. Utilisation des requêtes
    Par Invité dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 22/04/2008, 11h49
  3. Utilisation des requêtes SNMP
    Par Général03 dans le forum C++Builder
    Réponses: 1
    Dernier message: 19/05/2007, 23h09
  4. Réponses: 18
    Dernier message: 16/02/2006, 10h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo