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

VBA Access Discussion :

[VBA] Opération non autorisée pour ce type d'objet. [AC-2003]


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [VBA] Opération non autorisée pour ce type d'objet.
    Bonjour,


    J'ai récemment appris le Visual Basic mais maintenant que je l'utilise avec Access j'ai quelques problèmes, notamment que le je veux indiquer des champs dans des tables etc... car ce n'est pas pareil qu'avec Excel, j'ai un peu de mal. J'espère donc que vous me pardonnerez si jamais vous trouviez mes erreurs grossières.

    Avant de vous expliquer mon problème, je vais vous expliquer ce compte réaliser :

    Je possède une table nommée "t_Card" dans laquelle je possède une colonne nommée "i_Card" (qui correspond à la clé primaire de cette table).
    Je possède une seconde table nommée "t_Channel" dans laquelle je possède encore cette colonne "i_Card", ce sont deux tables liées, à chaque valeur de i_Card dans la table t_Card, correspond un ou plusieurs enregistrement de la table t_Channel.

    J'aimerais pouvoir compter le nombre d'enregistrements non vides de la table t_Channel pour chaque valeur de i_Card de la table t_Card et ensuite affecter ce nombre dans une nouvelle colonne de la table t_Card pour chaque enregistrement.

    (Désolé si je m'explique mal, mais je en gros je souhaiterais afficher pour tous les enregistrements de la table t_Card, le nombre de d'enregistrements non vides qui leurs corresponds par rapport à la table t_Channel)

    Voici le code que j'ai réalisé :

    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
    Sub essai()
    Dim Card As Object
    Dim t_Card As DAO.TableDef
    Dim db As DAO.Database
    Set db = CurrentDb
    Set t_Card = db.TableDefs("t_Card")
     
    For Each Card In t_Card
    'Pour chaque enregistrement de la table t_card, i prend la valeur de i_card de la table t_card et
    'affecte la variable nbre_channels_occupes dans le champ channels_occupes de la table t_card
    i = i_Card.Value
    'Compte le nombre total de channels dans la table t_Channel pour t_card.i_card=t_channel.i_card
    nbre_total_channels = DCount("[i_Channel]", "t_Channel", "[i_Card] ='& i&'")
    'Compte le nombre de channels non occupés dans la table t_Channel pour t_card.i_card=t_channel.i_card
    nbre_channels_vides = DCount("[i_Channel]", "t_Channel", "IsNull([i_Signal_input])")
    'Calcule le nombre de channels occupés dans la table t_Channel pour t_card.i_card=t_channel.i_card
    nbre_channels_occupes = nbre_total_channels - nbre_channels_vides
    'Pour chaque valeur de i_Card de la table t_Card, le champ Total_Channels prend la valeur de la variable nbre_channels_occupes
    If t_Card.Fields("i_Card") = i Then
    t_Card.Fields("Total_Channels") = nbre_channels_occupes
    End If
    Next Card
     
    End Sub
    Le message se trouve au niveau du "For Each...", voici l'erreur que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Opération non autorisée pour ce type d'objet.

    Pourriez-vous m'indiquer un élément de réponse ? Merci beaucoup !

  2. #2
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour

    Personnellement, je passerais par un recordset.

    Quelque chose comme



    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
     
    dim sql as string
    dim rst as dao.recordset
     
     
    set rst = currentdb.openrecordset("t_Card")
     
     
    Do until rst.EOF = false
     
    i = rst.field("i_Card")
     
      'Compte le nombre total de channels dans la table t_Channel pour t_card.i_card=t_channel.i_card
            nbre_total_channels = DCount("[i_Channel]", "t_Channel", "[i_Card] ='& i&'")
            'Compte le nombre de channels non occupés dans la table t_Channel pour t_card.i_card=t_channel.i_card
            nbre_channels_vides = DCount("[i_Channel]", "t_Channel", "IsNull([i_Signal_input])")
            'Calcule le nombre de channels occupés dans la table t_Channel pour t_card.i_card=t_channel.i_card
            nbre_channels_occupes = nbre_total_channels - nbre_channels_vides
            'Pour chaque valeur de i_Card de la table t_Card, le champ Total_Channels prend la valeur de la variable nbre_channels_occupes
     
     If rst.field("i_Card") Then
                rst.field("Total_Channels") = nbre_channels_occupes
            End If
     
     
    rst.movenext
    loop

  3. #3
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 642
    Points : 34 351
    Points
    34 351
    Par défaut
    Hello,

    plusieurs petites choses pour te permettre de code et de voir "facilement" quelques erreurs :

    - place un
    en haut de ton module, cela te permet de t'assurer que toutes les variables que tu utilises ont bien été déclarées dans le code.

    Ici tu verras notamment ton
    i_card qui sort de nulle part.

    L'utilisation du type de variable Object est à éviter dans la mesure du possible. Si tu sais déjà de quel type il va s'agir, applique le bon type de variable dès la déclaration

    Attention enfin à la syntaxe de tes clauses dans les fonctions de Domaine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbre_total_channels = DCount("[i_Channel]", "t_Channel", "[i_Card] ='& i&'")
    devant s'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbre_total_channels = DCount("[i_Channel]", "t_Channel", "[i_Card] ='" & i & "'")
    voire même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbre_total_channels = DCount("[i_Channel]", "t_Channel", "[i_Card] =" & i )
    si le champ i_Card est de type numérique

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour vos réponses !
    Je reprendrais tout ça demain, et j'appliquerais tous vos conseils avec précision, merci à vous

    Je reposterai demain pour vous annoncez si cela a résolu mon problème, bonne aprèm/soirée.

    Edit : Grâce à vos deux réponses, j'ai pu arrivé à ce code :


    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
    33
    34
     
    Option Compare Database
    Option Explicit
     
    Sub essai()
     
    Dim sql As String, i As Integer, nbre_total_channels As Integer, nbre_channels_vides As Integer, nbre_channels_occupes As Integer
    Dim rst As dao.Recordset
     
     
    Set rst = CurrentDb.OpenRecordset("t_Card")
     
     
    Do Until rst.EOF = False
     
    i = rst.Fields("i_Card")
     
      'Compte le nombre total de channels dans la table t_Channel pour t_card.i_card=t_channel.i_card
            nbre_total_channels = DCount("[i_Channel]", "t_Channel", "[i_Card] =" & i)
            'Compte le nombre de channels non occupés dans la table t_Channel pour t_card.i_card=t_channel.i_card
            nbre_channels_vides = DCount("[i_Channel]", "t_Channel", "IsNull([i_Signal_input])")
            'Calcule le nombre de channels occupés dans la table t_Channel pour t_card.i_card=t_channel.i_card
            nbre_channels_occupes = nbre_total_channels - nbre_channels_vides
            'Pour chaque valeur de i_Card de la table t_Card, le champ Total_Channels prend la valeur de la variable nbre_channels_occupes
     
     If rst.Fields("i_Card") Then
                rst.Fields("Total_Channels") = nbre_channels_occupes
            End If
     
     
    rst.MoveNext
    Loop
     
    End Sub
    Seulement, il n'y a plus de message d'erreur mais rien ne se passe, c'est à dire que la colonne Total_Channels qui est censé est remplie avec la variable nbre_channels_occupes, est vide, je ne comprend pas pourquoi...

    Aussi j'ai une question, à quoi sert la variable sql déclarée en début de code ?

    Merci beaucoup d'avance à vous !

  5. #5
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour

    Réponse à la dernière question : la variable sql ne sert à rien, je l'ai écrite par habitude, car la plupart du temps j'ouvre un recordset qui est une instruction SQL et non une table.

    Je crois aussi que je me suis planté sur l'instruction Do Loop.
    Essayez

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do Until rst.EOF = true
    à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do Until rst.EOF = False

    Sinon, conseil : n'hésitez pas à suivre la progression de votre procédure pas à pas, et vérifiez, soit avec un espion, soit avec un debug.print dans la fenêtre d'exécution la valeur de vos variables.

    Pierre

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour votre aide et vos conseils !

    J'ai donc fait les modifications nécessaires mais j'obtiens un nouveau message d'erreur qui celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur d'execution '3020':
    Uptade ou CancelUpdate effectué sans appeler AddNew ni Edit.

    En fait nan c'est bon, en faisant rst.Edit juste avant, cela rempli bien la colonne Total_Channels (bon pas avec ce que je veux mais c'est déjà), je continuerais demain, merci beaucoup encore une fois.

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 017
    Points : 24 553
    Points
    24 553
    Par défaut
    Bonjour,

    Et le Update ?
    Il y a un tuto DAO pour ce type de question.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     If rst.Fields("i_Card") Then
       rst.edit
                rst.Fields("Total_Channels") = nbre_channels_occupes
       rst.update
    End If
    Cordialement,

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Oui, j'avais pensé à l'Update


    Merci à vous.

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

Discussions similaires

  1. [AC-2007] Opération non autorisée pour ce type d'objet
    Par mcryco dans le forum VBA Access
    Réponses: 2
    Dernier message: 14/02/2014, 16h25
  2. Réponses: 8
    Dernier message: 05/09/2012, 15h39
  3. Réponses: 9
    Dernier message: 12/11/2008, 11h28
  4. erreur 3251 opération non autorisé pour ce type d'objet
    Par alexkickstand dans le forum VBA Access
    Réponses: 3
    Dernier message: 28/02/2008, 21h39
  5. Erreur 3251: Opération non autorisé pr ce type d'objet
    Par Ragnarok85 dans le forum Access
    Réponses: 10
    Dernier message: 14/02/2007, 09h52

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