Cet article existe déjà alors que c'est faux

Bonjour à toutes et à tous,

Un problème : je crée un crédit budgétaire d'un article : je remplis les cb adéquats, je valide. Sans quitter ni fermer le formulaire (en quittant et fermant également malheureusement), je crée un nouveau crédit budgétaire d'un article de même catégorie ou pas, quand je choisis l'article, il me dit que cet article existe déjà dans le tabBDCréditsBudgétaires alors que c'est faux. Merci de m'aider à supprimer cette anomalie.

Bonnes fin de journée et continuation à toutes et à tous. Prenez bien soin de vous.

18budgets.zip (423.18 Ko)

Bonjour,

la BD articles budgétaires est déjà bien rempli, il y a donc de grandes chances pour que le nouvel article saisi soit déjà présent dans le tableau.

Citez un article qui n'est pas présent dans le tableau et qui renvoie le message annonçant qu'il existe déjà.

Il y a alors un hic : dans le tableau que j'ai joint à mon message, le TabBDCréditsBudgtéaires n'a que huit lignes (tout au moins visibles). Si vous considérez que le tableau est bien rempli, alors vous devez avoir un tableau dans lequel des lignes apparaissent et que moi je ne vois pas. À toutes fins utiles, je vous joints de nouveau le fichier. J'ai relu le programme mais il est toujours fait mention du TabCréditsBudgétaires et non du TabBDArticlesBudgétaires qui, lui, est effectivement bien rempli.

15budgets.zip (423.18 Ko)

Procédure Private Sub cbCatégorie_Change() : tbNuméroCréationBP = tbCodeCatégorie & "-" & Format(WorksheetFunction.CountIfs(Range("TabBDArticlesBudgétaires[Code catégorie]"), _
tbCodeCatégorie.Value) + 1, "00")

Ne vaudrait-il pas mieux de mettre TabBDCréditsBudgétaires au lieu de TabBDArticlesBudgétaires?

Procédure : Private Sub cbArticle_Change() : tbCodeArticle.Value = Application.WorksheetFunction.VLookup(cbArticle.Value, Range("TabBDArticlesBudgétaires2"), 2, 0)

cbPériodeArticle.Value = Application.WorksheetFunction.VLookup(cbArticle.Value, Range("TabBDArticlesBudgétaires2"), 3, 0) '3 = Nombre de colonnes après la colonne Article (y compris la colonne article).
'WorksheetFunction : Cet objet est utilisé comme conteneur des fonctions de feuille de calcul Microsoft Excel que vous pouvez appeler à partir de Visual Basic pour Applications.
'WorksheetFunction.VLookup : Recherche une valeur dans la première colonne d'un tableau et renvoie une valeur dans la même ligne dans une autre colonne du tableau.
cbConditionnementArticle.Value = Application.WorksheetFunction.VLookup(cbArticle.Value, Range("TabBDArticlesBudgétaires2"), 5, 0) '5 = Nombre de colonnes après la colonne Article (y compris la colonne Article).

mêmeremarque que pour la procédure précédente.

Mon pouvoir nul de déduction ne me permet d'assurer à coup sûr que le problème vient de là. Je compte sur vos capacités hors norme pour m'éclairer. Si c'est la source du problème, pourquoi pour les crédits budgétaires déjà créés, le message ne s'est-il pas alors affiché ? Je sais que vous embête, pour parler poliment, mais j'essaie de comprendre le pourquoi de la chose qui s'avère, en plus, aléatoire.

Pour code article : modifier en créant un TabBDCréditsBudgétaires2 le cas échéant et si nécessaire). Pour numéro création : je suggère de modifier. Pour cbPériodeArticle et cbConditionnementArticle : ne pas modifier. Quitte à recréer les crédits budgétaires déjà présents et que cela ne cause pas de nouveaux problèmes.

Je renouvelle ma demande, jamais satisfaite, même si cela peut vous paraître égoïste, à savoir me féliciter si vous pensez que certaines suggestions, déductions que je fais sont bonnes, pour moi cela me sera un très grand réconfort.

Il y a alors un hic : Non, c'est moi qui me suis trompé de feuille.

Je regarderai demain.

Cdlt

Pour code article : modifier en créant un TabBDCréditsBudgétaires2 le cas échéant et si nécessaire) : ou alors ne pas faire référence à TabBDArticles2 ni de créer TabBDCréditsBudgétaires2 et mentionner uniquement TabBDCréditsBudgétaires. Comme je n'ai pas bien compris l'instruction, je ne sais pas trop bien quoi faire.

Bonjour,

Je réponds à la question initiale:

Lors du remplissage de l'userform, et suite au remplissage de "cbNomArticleBudgétaire", le code doit aller chercher l'indice dans le tableau "TabBDCréditsBudgétaires" or, il va le chercher dans le tableau "TabBDArticlesBudgétaires", qui lui, est bien rempli donc, il trouvera toujours l'article.

Dans la "Function IndiceCréationArticleBudgétaire" remplacez:

IndiceCréationArticleBudgétaire = WorksheetFunction.Match(CodeCréationArticleBudgétaire, Range("TabBDArticlesBudgétaires[Code article]"), 0)

par:

IndiceCréationArticleBudgétaire = WorksheetFunction.Match(CodeCréationArticleBudgétaire, Range("TabBDCréditsBudgétaires[Code article]"), 0)

Cdlt

Bonjour Arturo83,

Je vais rectifier comme proposé. et je vous tiendrai au courant. J'avais donc un peu raison : cela se jouait entre articlesbudgétaires et créditsbudgétaires.

Bonjour Arturo83,

J'ai rectifié comme vous l'avez indiqué mais un message d'erreur : variable non définie : (CodeCréationArticleBudgétaire)

IndiceCréationArticleBudgétaire = WorksheetFunction.Match(CodeCréationArticleBudgétaire, Range("TabBDCréditsBudgétaires[Code article]"), 0)

17budgets.zip (412.36 Ko)

Bonsoir,

Peut-être que nous ne parlons pas de la même chose car chez moi cela marche bien.

J'ai repris votre dernier fichier, y ai fait la modification, et l'exécution s'est déroulée sans problème.

revoici le fichier modifié, si cela ne va pas, décrivez les actions que vous faites et qui génèrent une erreur.

Bonsoir Arturo83,

J'ai apporté des modifications dans function pour faire disparaître les erreurs (remplacement d'articles budgétaires par crédits budgétaires). Ceci fait, je crée un crédit budgétaire pour agneau : pas de problème, je valide. Je crée un autre crédit budgétaire (avocats desserts) et là j'ai de nouveau le message que cet article existe déjà.

Que l'on soit bien d'accord, je travaille sur le formulaire UF02CréerCréditsBudgétairesBP.

Que l'on soit bien d'accord, je travaille sur le formulaire UF02CréerCréditsBudgétairesBP.

C'est peut-être par là qu'il aurait fallu commencer,

Dans la "Function IndiceCréditsBudgétaires" à la ligne:

IndiceCréationArticleBudgétaire = WorksheetFunction.Match(CodeCréationArticleBudgétaire, Range("TabBDCréditsBudgétaires[Code article]"), 0),

on recherche "CodeCréationArticleBudgétaire" or, il faudrait rechercher le "CodeArticle" (ce qui est entre parenthèse dans le nom de la fonction)

donc la ligne serait plutôt:

IndiceCréationArticleBudgétaire = WorksheetFunction.Match(CodeArticle, Range("TabBDCréditsBudgétaires[Code article]"), 0)

ensuite, il ne connait pas la variable "IndiceCréationArticleBudgétaire", qu'à cela ne tienne, il suffit de la déclarer au début de la fonction avec :

Dim IndiceCréationArticleBudgétaire

Private Function IndiceCréditsBudgétaires(ByVal CodeArticle As String) As Long

'Renvoie l'indice de l'article dans le tableau structuré TabBDCréditsBudgétaires, de la feuille BD crédits budgétaires, pour le code article donné si l'article existe. Renvoie zéro si

'l'article n'existe pas.

IndiceCréditsBudgétaires = 0

'On Error resume Next : Lorsqu'une erreur d'exécution survient, le contrôle est transmis à l'instruction qui suit immédiatement celle où l'erreur s'est produite, et l'exécution conti-

'nue. Il est recommandé d'utiliser cette formulation plutôt que l'instruction On Error GoTo pour accéder à des objets.

On Error Resume Next

'WorksheetFunction.Match : Renvoie la position relative d'un élément dans une matrice (matrice : permet de créer des formules uniques permettant d’obtenir plusieurs résultats

'et qui agissent sur un groupe d’arguments répartis dans des lignes et des colonnes. Une plage matricielle partage une même formule tandis qu’une constante matricielle est un

'groupe de constantes qui sert d’argument.), qui correspond à une valeur spécifiée dans un ordre spécifié. Utilisez la fonction MATCH au lieu de l'une des fonctions LOOKUP

'lorsque vous avez besoin de la position d'un élément dans une plage au lieu de l'élément proprement dit.

IndiceCréditsBudgétaires = WorksheetFunction.Match(CodeArticle, Range("TabBDCréditsBudgétaires[Code article]"), 0)

'On Error Goto 0 : Invalide dans la procédure en cours tout gestionnaire d'erreurs validé.

On Error GoTo 0

End Function

La function après modification. Je n'ai plus les messages d'erreur mais je continue à avoir cet article existe déjà.

À moins que cela vienne de période et conditionnement qui font référence à Article budgétaire. Dans ce cas, cela devrait être pour tous les articles.

Bonjour,

Inutile de recopier le code, je l'ai déjà.

J'ai refait des essais avec plusieurs articles, j'ai commencé par "Bifteck haché de veau" et là, j'ai eu le message, puis j'ai recommencé et le message ne s'est jamais plus affiché. c'est donc que l'indice n'a pas été initialisé à 0 et, effectivement en regardant de plus près, on voit "IndiceCréditsBudgétaires = 0" alors que ce devrait être : IndiceCréationArticleBudgétaire = 0

faites la correction et cela devrait aller mieux.

Cdlt

Bonjour Arturo83,

Ce n'était pas le code initial mais un code rectifié que vous n'aviez pas, d'où l'envoi.

J'ai rectifié sans comprendre le pourquoi : comme on est dans le formulaire UF02CréerCréditsBudgétairesBP, pourquoi faire référence à des instructions se trouvant dans le formulaire UF01CréerArticlesBudgétaires ? J'ai créer un crédit budgétaire pour un article inexistant , pas de message. J'ai validé. J'ai créer un autre crédit budgétaire toujours pour un article inexistant, j'ai eu à nouveau le message.

J'ai fait mon fichier sur le modèle de celui-ci qui, sauf erreur ou omissions de ma part, semble fonctionner correctement quant à la création d'un crédit budgétaire. La seule différence, c'est que les saisies se font dans un formulaire unique.

pourquoi faire référence à des instructions se trouvant dans le formulaire UF01CréerArticlesBudgétaires ?

Je n'en sais rien, je ne suis pas à l'origine du fichier, si cette référence ne vous convient pas, vous pouvez toujours lui donner le nom que vous souhaitez.

Donnez-moi les actions que vous avez fait et qui génèrent le message.

Feuille accueil : clics sur le bouton de commande Créer crédits budgétaires BP

Formulaire correspondant : Catégorie Budget primitif dépenses alimentaires; Article : un article inexistant dans le tableau structuré TabBDCréditsBudgétaires; Prix unitaire et quantité : mettez ce que vous voulez; soit le message s'affiche (à tort malheureusement), soit il ne s'affiche pas (avec raison). Pourquoi une fois sans message, une autre fois message: je n'en sais rien non plus.

Par rapport au fichier envoyé dans mon précédent message, j'ai changé dans mon fichier actuel ce qui devait l'être en ce qui concerne les objets et éventuellement le nom des procédures : je le répète, dans le fichier précédent, un seul formulaire de saisie des crédits budgétaires, dans le mien 4 formulaires de saisie des crédits budgétaires.

J'en ai essayé plusieurs, pas moyen d'obtenir le message. Citez-moi un cas où cela se produit!

Dans le fichier joint, le crédit budgétaire pour Agneau n'existe pas dans le tabBDCréditsBudgétaires. Essayez donc de le créer, moi je vais en faire de même de mon côté.

18budgets.zip (412.36 Ko)

J'ai rectifié les erreurs qui se sont signalées. Le crédit budgétaire pour agneau & bien été créé. J'ai cliqué sur Retour feuille accueil. Clic sur Créer crédit budgétaire BP : Catégorie : Budget primitif dépenses alimentaires, Article : Vinaigre assaisonnement : cet article existe déjà.

Essayez ceci:

Private Function IndiceCréditsBudgétaires(ByVal CodeArticle As String) As Long
'Renvoie l'indice de l'article dans le tableau structuré TabBDCréditsBudgétaires, de la feuille BD crédits budgétaires, pour le code article donné si l'article existe. Renvoie zéro si
'l'article n'existe pas.
    IndiceCréditsBudgétaires = 0
'On Error resume Next : Lorsqu'une erreur d'exécution survient, le contrôle est transmis à l'instruction qui suit immédiatement celle où l'erreur s'est produite, et l'exécution conti-
'nue. Il est recommandé d'utiliser cette formulation plutôt que l'instruction On Error GoTo pour accéder à des objets.
    On Error Resume Next
'WorksheetFunction.Match : Renvoie la position relative d'un élément dans une matrice (matrice : permet de créer des formules uniques permettant d’obtenir plusieurs résultats
'et qui agissent sur un groupe d’arguments répartis dans des lignes et des colonnes. Une plage matricielle partage une même formule tandis qu’une constante matricielle est un
'groupe de constantes qui sert d’argument.), qui correspond à une valeur spécifiée dans un ordre spécifié. Utilisez la fonction MATCH au lieu de l'une des fonctions LOOKUP
'lorsque vous avez besoin de la position d'un élément dans une plage au lieu de l'élément proprement dit.
    IndiceCréditsBudgétaires = WorksheetFunction.Match(CodeArticle, Range("TabBDCréditsBudgétaires[Code article]"), 0)
'On Error Goto 0 : Invalide dans la procédure en cours tout gestionnaire d'erreurs validé.
    On Error GoTo 0
End Function

Toujours le message article existant. Une suggestion : peut-être que le problème vient d'une (ou plusieurs) autre (s) procédure(s)

Rechercher des sujets similaires à "cet article existe deja que faux"