Affecter une valeur en fonction d'un champ d'une table
ludobalu
Messages postés
286
Statut
Membre
-
Heliotte Messages postés 1561 Statut Membre -
Heliotte Messages postés 1561 Statut Membre -
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 pour l'instant réalisé :
Voici l'erreur que j'obtiens, pour le For :
Malheureusement je ne vois pas trop à quoi correspond réellement cette erreur, pourriez-vous m'aider ?
Je vous remercie d'avance,
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 pour l'instant réalisé :
Sub essai()
'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
For Each Card In 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.i_Card = i Then
t_Card.Total_Channels = nbre_channels_occupes
End If
Next
End Sub
Voici l'erreur que j'obtiens, pour le For :
Incompatibilité de type
Malheureusement je ne vois pas trop à quoi correspond réellement cette erreur, pourriez-vous m'aider ?
Je vous remercie d'avance,
A voir également:
- Affecter une valeur en fonction d'un champ d'une table
- Table ascii - Guide
- Fonction si et - Guide
- Table des matières word - Guide
- Excel remplir automatiquement une cellule en fonction d'une autre ✓ - Forum Excel
- [Excel 2010] Remplir cellule d'après contenu d'une autre ✓ - Forum Excel
6 réponses
EDIT-1 : Je cherche énormément pour essayer d'améliorer ce code, j'ai changé le For Each (après avoir initialiser la variable Card en tant qu'objet), voilà ce que j'ai mis maintenant :
Dim Card As Object
For Each Card In CurrentDb().TableDefs("t_Card")
Et j'ai un nouveau message que voici :
Opération non autorisée pour ce type d'objet.
Dim Card As Object
For Each Card In CurrentDb().TableDefs("t_Card")
Et j'ai un nouveau message que voici :
Opération non autorisée pour ce type d'objet.
Bonjour ludobalu,
Une bonne pratique en Visual Basic est de mettre "Option Explicit" en haut de chaque feuille ou module, de cette façon, tes variables doivent toujours être déclarée, et pour ne rien gâcher, on sait ce que l'on met dedans !!
Travailles-tu avec SQL ou MySQL ?
Tu peux m'expliquer
- "DCount("[i_Channel]", "t_Channel", "[i_Card] ='& i&'")" et
- "DCount("[i_Channel]", "t_Channel", "IsNull([i_Signal_input])")"
Je veux dire, tu ne peux pas faire ta sélection en concaténant les deux, style :
Je veux que tu me compte le nombre d'occurence correspondant à "i_Card".i dont le champ "machin" n'est pas vide ?
Une bonne pratique en Visual Basic est de mettre "Option Explicit" en haut de chaque feuille ou module, de cette façon, tes variables doivent toujours être déclarée, et pour ne rien gâcher, on sait ce que l'on met dedans !!
Travailles-tu avec SQL ou MySQL ?
Tu peux m'expliquer
- "DCount("[i_Channel]", "t_Channel", "[i_Card] ='& i&'")" et
- "DCount("[i_Channel]", "t_Channel", "IsNull([i_Signal_input])")"
Je veux dire, tu ne peux pas faire ta sélection en concaténant les deux, style :
Je veux que tu me compte le nombre d'occurence correspondant à "i_Card".i dont le champ "machin" n'est pas vide ?
Bonjour,
Tout d'abord merci pour ta réponse, oui "Option Explicit" est une bonne habitude à prendre que je n'ai pas encore assimilée désolé.
Je travaille avec SQL.
Non, j'ai cherché mais je n'ai pas trouvé de fonction tel que IsEmpty ou IsNull qui correspondrait à "n'est pas vide" ou "n'est pas nul".
Tout d'abord merci pour ta réponse, oui "Option Explicit" est une bonne habitude à prendre que je n'ai pas encore assimilée désolé.
Je travaille avec SQL.
Non, j'ai cherché mais je n'ai pas trouvé de fonction tel que IsEmpty ou IsNull qui correspondrait à "n'est pas vide" ou "n'est pas nul".
EDIT-2 :
En cherchant encore, j'ai réussi à arriver à ce résultat en essayant de comprendre comment fonctionne le VB sous Access :
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.i_Card = i Then
t_Card.Total_Channels = nbre_channels_occupes
End If
Next Card
End Sub
Maintenant l'erreur se situe au niveau du If à la fin du code, il me disent que les données sont introuvables pour le "t_Card.i_Card", sauriez vous comment indiquer en VBA que je souhaite que le champ "i_Card" de ma table "t_Card" soit égal à ma variable i ? Merci.
En cherchant encore, j'ai réussi à arriver à ce résultat en essayant de comprendre comment fonctionne le VB sous Access :
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.i_Card = i Then
t_Card.Total_Channels = nbre_channels_occupes
End If
Next Card
End Sub
Maintenant l'erreur se situe au niveau du If à la fin du code, il me disent que les données sont introuvables pour le "t_Card.i_Card", sauriez vous comment indiquer en VBA que je souhaite que le champ "i_Card" de ma table "t_Card" soit égal à ma variable i ? Merci.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Edit-4 :
Voici où j'en suis arrivé, je crois que j'ai réussi à situer comment indiquer les tables et les champs, voici mon code :
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 !
Voici où j'en suis arrivé, je crois que j'ai réussi à situer comment indiquer les tables et les champs, voici mon code :
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 !
Bonjour ludobalu,
Je vois que tu travaille avec "DAO" qui, je crois, n'est plus supporté.
Le but est de faire avancer le smilblick, je vais essayer de comprendre car je ne suis pas très doué en ce qui concerne DAO et Cie
Donc:
- Card As Object --> Card est un Object
- t_Card As DAO.TableDef --> une définition de table ?
. Pourquoi t_Card, qui est une table, devrait recevoir les propriétés d'une table ?
Je vois que tu travaille avec "DAO" qui, je crois, n'est plus supporté.
Le but est de faire avancer le smilblick, je vais essayer de comprendre car je ne suis pas très doué en ce qui concerne DAO et Cie
Donc:
- Card As Object --> Card est un Object
- t_Card As DAO.TableDef --> une définition de table ?
. Pourquoi t_Card, qui est une table, devrait recevoir les propriétés d'une table ?