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

Résolu/Fermé
ludobalu Messages postés 276 Date d'inscription dimanche 18 mai 2008 Statut Membre Dernière intervention 13 février 2015 - 29 oct. 2012 à 16:20
ludobalu Messages postés 276 Date d'inscription dimanche 18 mai 2008 Statut Membre Dernière intervention 13 février 2015 - 5 nov. 2012 à 09:51
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é :

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 :

Opération non autorisée pour ce type d'objet.


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

2 réponses

Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
29 oct. 2012 à 21:03
Card représente un Objet, lequel ?
0
ludobalu Messages postés 276 Date d'inscription dimanche 18 mai 2008 Statut Membre Dernière intervention 13 février 2015 6
30 oct. 2012 à 09:35
Bonjour,

Merci pour ta réponse, depuis hier on m'a aidé et j'en suis arrivé à ce code :


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...

Saurais-tu m'aider ?

Merci beaucoup d'avance !
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
30 oct. 2012 à 13:09
Salut,
C'est dans un recordset que tu écrit !
If rst.Fields("i_Card") Then
rst.Fields("Total_Channels") = nbre_channels_occupes
End If

Si tu veux faire une mise à jour d'enregistrements, ce n'est pas un UPDATE qu'il faut utiliser ?
0
ludobalu Messages postés 276 Date d'inscription dimanche 18 mai 2008 Statut Membre Dernière intervention 13 février 2015 6
30 oct. 2012 à 13:24
Oui, cela sert à enregistrer les modifications effectuées, mais cela ne fait pas ces dites modifications,

Il faudrait quelque chose du style :

If rst.Fields("i_Card") Then
Ecris la valeur de nbre_channels_occupes dans le champ Total_Channels de la table t_Card pour l'enregistrement correspondant
rst.Update
End If


Seulement, ce qu'il y a en italique je n'arrive pas à le traduire en VBA, j'ai essayé en faisant ça :

rst.Edit.Fields("Total_Channels") = nbre_channels_vides

Et cela me met ce message d'erreur (pareil en remplaçant Edit par AddNew) :
Erreur de compilation :
Fonction ou variable attendue.


Au niveau du ".Edit"

Aurais-tu une idée ?

Merci !
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
Modifié par Heliotte le 30/10/2012 à 13:34
Je pense plutôt utiliser INSERT INTO Si tu veux ajouter un enregistrement
CurrentDb.Execute "INSERT INTO [NomDeLaTable.Total_Channels] VALUES (nbre_channels_vides);"

Dans le cas où tu veux modifier (mettre à jour) un enregistrement, c'est UPDATE qu'il te faudra écrire
A tester !
0
ludobalu Messages postés 276 Date d'inscription dimanche 18 mai 2008 Statut Membre Dernière intervention 13 février 2015 6
30 oct. 2012 à 13:49
J'ai essayé et je crois que je vais devenir totalement fou ... Voila le message d'erreur que j'obtiens :
Erreur d'execution '3011' :
Le moteur de base de données Microsoft Jet n'a pas pu trouver l'objet 't_Card.Total_Channels'. Assurez-vous que l'objet existe et que vous avez correctement saisi son nom et son chemin d'accès.


Et pourtant, ma table possède exactement ce nom, de même pour la colonne à remplir, la preuve en image :

http://imagik.fr/view-rl/4756

Je ne sais vraiment plus quoi faire, je suis totalement perdu !
0
Heliotte Messages postés 1491 Date d'inscription vendredi 26 octobre 2012 Statut Membre Dernière intervention 28 janvier 2013 92
Modifié par Heliotte le 30/10/2012 à 14:07
travailles-tu avec ACCESS, car si c'est le cas, par prudence met des crochets aux noms de tableaux et aux noms de champs. ex : '[t_Card].[Total_Channels]'
La base de données est toujours accessible ? ouverte ?
Montre-moi la ligne que tu as écrite, stp
Réessaye
0