Déclaration et utilisation de tableaux pour calcul
Bonjour,
j'ai un classeur excel avec deux tableaux :
Feuille 1 = Besoins (des N° de commandes avec des références articles, qté, etc)
Feuille 2 = Ressources (références articles, qtés, affectations, dispo ou non, etc)
je souhaite donc déclarer ces deux feuilles sous forme de tableaux pour pouvoir les utiliser plus facilement;
'Alimente les éléments du tableau ressources
With WsSC015
Dim TabRessources As Variant
TabRessources = VBA.Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L")
End With
'Alimente les éléments du tableau Besoins
With WsPF
Dim TabBesoins As Variant
TabBesoins = VBA.Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "j", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC")
End WithPar la suite cela se complique et c'est pourquoi je vous sollicite, je voudrais vérifier la dispo des ressources et les spécifier dans le tableau des besoins
Comment naviguer dans ces deux tableaux ?
Merci de votre retour
Bonjour
Tu devrais joindre ton fichier et expliquer ce que tu veux en faire.
Bye !
Bonjour,
Ce que tu indiques me laisse penser que tu es en train de faire quelque chose de totalement inutile...
Cordialement.
Bonjour,
J'ai normalement ajouté un fichier.
Je souhaite vérifier la disponibilité d'un stock.
Pour chaque article vérifier si il est en ressource ou non... si il est disponible.
Je ne maîtrise pas les fonctions Ubound et Lbound, c'est bien sûr ça qu'il faut partir ?
Merci d'avance.
Bonsoir,
On manque d'indications sur ce que tu veux faire exactement et comment tu entends le faire... C'est à partir d'une définition globale et suffisamment détaillée déjà d'un projet que les choix conceptuels peuvent se faire...
Là j'ai le sentiment que tu essaies de mettre la charrue avant les boeufs ! Tu pourras peut-être avoir besoin d'éléments disponibles à tout moment et que tu peux appeler de partout dans ton code, mais avant de déterminer la façon dont tu t'y prendras pour répondre à ce besoin, il convient d'appréhender le besoin et ses contours. Il y a toujours plusieurs façon de répondre et il convient toujours d'avoir une vue d'ensemble et de la conserver avant de s'engager dans telle ou telle voie particulière.
Au cas particulier, ta procédure ne te simplifiera rien, tu atteins aussi facilement les tableaux de tes feuilles sans les stocker préalablement dans des variables, surtout que là ce n'est même pas le tableau que tu stockes mais des lettres de colonnes ! C'est en soi sans utilité et cela te compliquerait plutôt l'accès à tes données. Par ailleurs, les variables locales n'ayant d'existence que durant l'exécution de la procédure, quand l'exécution atteindra le End Sub, les variables disparaîtront ! Il faudrait donc déjà déclarer des variables de niveau module et les initialiser pour ensuite les utiliser dans d'autres procédures. Mais de toutes façons avec ça tu ne ferais que charger inutilement la mémoire sans avantage en contrepartie...
Je ne peux te conseiller grand chose en l'état de ton projet... Toutefois un moyen permettant un accès plus rapide aux données est de nommer les plages, et de les nommer de façon dynamique de façon que le nom intègre les variations.
Exemples (je suppose que tu sais nommer une plage) :
Je définis un nom : BesCmd comme faisant référence à :
=DECALER(Besoins!$A$2;;;NBVAL(Besoins!$A:$A)-1)nommée au moyen de cette formule, la plage est définie comme commençant à A2 et comportant autant de lignes que de valeurs en colonne A, -1 (pour éliminer l'intitulé de champ en A1).
Le nom correspond à la première colonne de données de ton tableau Besoins. Et son utilisation couvrira à tout moment la plage telle qu'elle sera à ce moment...
Tu peux utiliser le nom en notation compacte :
[BesCmd] suffit à représenter actuellement la plage A2:A8 de ta feuille Besoins.
Tu as besoin de tout le tableau : [BesCmd].Resize(, 11) couvrira alors la plage A2:K8...
Tu veux cibler le champs Articles du tableau : [BesCmd].Offset(, 3) couvrira D2:D8...
Il en est de même pour les cellules individuelles : [BesCmd].Cells(1, 4) te fait atteindre la cellule D2, etc. (tu atteins toute cellules de la feuille en adressage relatif à partir de la plage nommée.
Tu as remarqué que je n'ai nommé qu'une colonne de données de ton tableau. On peut nommer effectivement tout le tableau en incluant tous les champs, mais pour des données dont on peut penser que tu pourras souhaiter individualiser l'accès à tel ou tel champ, Ne nommer qu'une colonne offre plus de souplesse avec moins d'écriture pour cibler un champ quelconque... Nommer la première, facilite les repères : si le nom couvrait tout le tableau, la cellule D2 serait toujours .Cells(1, 4)...
Et si tu as bien suivi les exemples, tu remarqueras que l'on ne fait plus référence à la feuille, dès lors que le nom est évalué comme nom dans le classeur (et un nom dans le classeur est unique) cela suffit sans autre qualification à atteindre ladite plage, et tout ce qu'on peut atteindre à travers elle.
Elle te permet d'atteindre la feuille : [BesCmd].Worksheet c'est la feuille Besoins ! [même chose si on utilise .Parent, mais .Worksheet est plus explicite pour t'indiquer que c'est la feuille.
Le nom te crée donc un gain réel tant en simplification d'écriture qu'en facilité d'accès (et également en rapidité, à moindre degré, mais selon les travaux à faire tu pourras toujours affecter une plage sous forme de tableau à une variable).
J'en définis un autre pour tes ressources : RessArt faisant référence à :
=DECALER(Ressources!$A$2;;;NBVAL(Ressources!$A:$A)-1)C'est la même chose, ce qui est nommé ici, c'est le champ Article de la feuille Ressources. Je ne m'étends pas.
Tu dis que tu as besoin de connaître la disponibilité d'un article. Tu peux par exemple définir une fonction qui te renverra le nombre disponible de tel ou tel article.
Function DispoArticle(art As String) As Integer
Dim i%, na%
With [RessArt]
For i = 1 To .Rows.Count
If .Cells(i, 1) = art And .Cells(i, 11) = "Dispo" Then _
na = na + .Cells(i, 6)
Next i
End With
DispoArticle = na
End FunctionVoilà une fonction qui te renverra le nombre disponible de chaque article que tu lui demandes...
Testons :
Sub Démo()
MsgBox DispoArticle("A")
End SubLa fonction se contente de te fournir le nombre d'article, elle pourrait simplement te renvoyer VRAI ou FAUX en la modifiant pour qu'elle te confirme seulement que tel nombre de tel article est disponible. On peut l'enrichir pour que outre te renvoyer les réponses elle te bascule la quantité voulue en non disponible, ou autres inscriptions.
C'est l'analyse des besoins précis sur ce point qui t'indiquera si tu as besoin de plusieurs fonctions distinctes selon le contexte d'utilisation, ce qui peut d'ailleurs se faire le cas échéant avec une même fonction réagissant diversement selon les paramètres qu'on lui passe en l'appelant.
Ce qu'il faut au départ retenir, c'est qu'ayant besoin de tester ou intervenir sur la disponibilité des articles, une fonction est un des moyens que tu peux définir pour y faire appel dans ton code de traitement à chaque fois que tu en as besoin.
Cordialement.
Bonsoir,
MFerrand, votre pédagogie est un régal ! Vous devriez alimenter les "cours vba".
Bonjour,
Merci MFerrand pour ce retour très intéressant,
je vais essayer de détailler clairement mon besoin.
l'idée est d'alerter en cas de ressources non disponibles et d'identifier les articles qui posent problèmes,
Pour chaque article de la feuille besoin, vérifier si stock dispo dans Ressource
si le stock dispo, et si l'affectation dans la feuille ressource est "G9" et différent de l'affectation dans la feuille Besoins, vérifier si une autre ligne de cet article avec une autre affectation est dispo.
Sinon indiquer "G9" dans la colonne L de la feuille besoin.
Si l'affectation de la ressource est différente de "G9" ou si le l'affectation du besoin est égal à "G9"
Vérifier si la qté est suffisante, si la qté est suffisante, indiquer dans la colonne L de la feuille Besoins la qté dispo attribuée . (= qté du besoin)
mettre la qté de la colonne F de la feuille ressource a jour, colonne F de la feuille ressource - colonne L de la feuille Besoins
si la qté est insuffisante, insérer une ligne juste en dessous, copier/coller la ligne, en modifiant la valeur de la colonne C, valeur + 0.1. et en modifier la qté du besoin sur les deux lignes 1 ere ligne : colonne G feuille besoins = valeur de la colonne L feuille besoin, sur la 2ème ligne, colonne G de la feuille besoins- qté attribuée sur la ligne du dessus (colonne L)
mettre la qté de la feuille ressource a jour,
Si il n'y a pas de stock, commenter la colonne L, en "Rupture"
Faire la même recherche avec cette nouvelle ligne 1,2.
En espérant avoir données quelques explications vous permettant de m'éclairer sur la construction du code.
Merci d'avance pour votre retour.
Bonjour,
Tu parles savamment d'éléments qui me semblent ressortir de ton organisation matérielle... Normal pour toi !
Un petit exposé sur la signification de chacun des champs de tes tableaux, et la façon dont tu les constitues au départ et les utilises pour traiter des commandes est un minimum pour se répérer sans trop de risques d'erreurs !
Je suppose que ton tableau Besoins s'établit lors du traitement d'une commande... Il faut en détailler le processus, pour pouvoir coder les opérations successives qu'il implique. On conçoit que ce traitement impacte les ressources...
Mais le tableau Ressources se constitue au départ, sans doute en lien avec des besoins établis ou anticipés, mais qui peuvent être indépendant d'une commande...
Bref, ce qu'il faut dégager ce sont tous les processus élémentaires qui interviennent dans ta gestion, et leurs interactions. C'est à partir d'une telle analyse que l'on pourra coder efficacement chacun des processus élémentaires...
Au départ donc, outre les définitions nécessaires de chaque champ, il faut savoir comment et dans quelles conditions tu ajoutes une ligne au tableau Ressources, et comment tu ajoutes une ligne au tableau Besoins.
Si tu démarres sans analyse complète, tu vas te trouver par la suite à apposer des rustines pour chaque élément non prévu au départ, et le résultat final en sera nécessairement affecté. Autrement dit, ne cherche pas à mettre en place une solution avant que le problème ne soit complètement posé, tu ne ferais que compliquer la solution apportée et t'éloignerais d'autant de la solution la plus simple et la plus efficace.
Cordialement.
JFL a écrit :Bonsoir,
MFerrand, votre pédagogie est un régal ! Vous devriez alimenter les "cours vba".
Merci pour ton appréciation...
Bonne journée.
Bonjour,
je vais donc apporter quelques précisions,
ces deux feuilles sont issues d'export de logiciel de gestion, les données sont retravaillées par un un module "import" de la macro, les données sont mis en formes comme présentées dans le classeur,
Dans la feuille "Besoins", le reste a livrer,
Colonne A et B, les N° de commandes,
Colonne C un N° de ligne incrémenté chronologiquement à la saisie de la demande dans le logiciel de gestion.
colonne D, la référence Article
Colonne E la description
Colonne F, le statut de la ligne, (toujours en attente) indique le reste a faire.
Colonne G, la qté restante a livrer, puis colonne H l'unité de délivrance,
Colonne I se trouve une date de besoin, puis colonne J une date d'expédition souhaitée.
Colonne K l'affectation de la commande, il s'agit d'un N° de contrat, d'une manière générale, toutes les affectations peuvent s'approprier une ressource si elle est disponible, sauf les ressources "G9" qui sont réservées à cette affectation.
Dans la deuxième feuille, Ressources,
on retrouve l'article colonne A
l'Emplacement colonne B
l'affectation colonne C, si la ressource a une affectation "G9", elle n'est disponible que pour les besoins en "G9", par contre un besoin "G9" peut s'approprier d'autres affectations,
Colonne D il s'agit d'une date de péremption pour les matériels qui y sont soumis.
Colonne E l'unité de délivrance,
Colonne F la qté en ressource,
Les colonnes profils définissent le type d'article, colonne G H I J
la colonne K si la ressource est dispo, en fonction de l'emplacement, de la date de péremption,
Pour un même article, il peut y avoir un certain nombre de ligne, la répartition se fait sur la clés Article, emplacement, affectation.
Peut être pourrions nous établir ensemble le code permettant de traiter de ce "problème" ?
je ne sais pas vraiment comment commencer cette partie du code, de quelle façon auriez vous déclaré vos tableaux ?
Merci d'avance pour vos conseils
Bonjour,
Tu éclaires les données de la question... sauf un point qui demeure tout de même capital :
Tu reçois ces deux tableaux, préconstitués, OK ! Mais que dois-tu faire avec ? Je suppose que tu dois répondre aux besoins figurant dans la feuille Besoins en utilisant les ressources de la feuille Ressources ! Mais de quelle manière exactement ?
Et comment dois-tu matérialiser le résultat de ton action ?
Les choix dépendent de la finalité de l'opération qui t'est dévolue !
Cordialement.
Oui effectivement,
il faut répondre aux besoins en se basant sur la feuille ressource,
Pour chaque article de la feuille besoin, vérifier la disponibilité dans la dans la feuille ressource, en se basant sur les conditions d'affectation ou de disponibilité.
Dans la feuille Besoins,
j'ajoute la colonne L, ou je souhaite que le résultat des différentes conditions soit affiché,
Cells(1,12).Value = "Attribution"Dans l'attente de ton retour.
Bonsoir,
Le problème, c'est que je peux mettre en attribution : 5, 0, 0, 3, 6, 1, 0 ou bien : 0, 3, 0, 0, 12, 0, 0 ou bien d'autres... et sauf 3 cas à 0 qui le resteront car ne pouvant du tout être servis, je n'ai aucune raison (critère, méthode, ...) permettant de faire un choix !
Bonjour,
L'important est de vérifier si le besoin peut être servi , il faut donc que l'on passe en revue le fichier dans ligne après ligne pour vérifier si une ou plusieurs lignes de ressources permettent de servir un besoin avec quelques conditions.
Ce que tu dis et rien, c'est à peu près équivalent ! Ce que j'ai dit dans mon post précédent indique que j'en fais déjà plus que ta suggestion ! Et cela n'apporte pourtant pas la solution en raison du trop grand nombre de paramètres indécidables !
Bonjour,
je vais donc essayer de faire le code avec votre aide,
peut être pourriez vous m'aider a le débugger,
j’entame donc le code de la manière suivante pour vérifier si pour un article en besoin, je trouve un article en ressource,
cependant, il se peut qu'il y est plusieurs article en ressource le code ci dessous ne correspond pas a ce que je cherche,
une fois la ressource trouvée et les conditions exécutées, il cherche un nouveau besoin et non une nouvelle ressource si nécessaire.
la macro mentionne par exemple la ressource non dispo au lieu de vérifier si une ressource dispo existe
Est ce que vous avez des pistes ?
For Each cel In WsBesoin.Range(Cells(2, 4), Cells(DerlignePF, 4)) 'Chaque article de besoin
Set C = WsRessource.Columns(1).Find(cel, , xlValues, xlWhole) 'Cherche C dans ressource
For Each Cel1 In C 'Chaque article de ressource
' condition 1
' condition 2
Next cel1
Next celMerci d'avance
Je crois bien qu'on ne s'est pas compris du tout !
Le problème n'est pas d'écrire du code ou produire une ou plusieurs macros. On peut produire une foultitude de macros qui de façon apparente répondent à la question tout en pouvant être très différentes les unes des autres, et qui dirigeront vers des objectifs divers, différents les uns des autres. Une telle situation n'est pas rationnelle, elle est due au fait qu'on ne dispose pas de l'objectif qu'il sera pertinent d'atteindre, ni des critères permettant de décider lequel doit être privilégié entre deux ou plusieurs que l'on peut tout aussi également atteindre en ayant l'air de répondre à la question. Parce que la question est insuffisamment définie !
Ce qui manque donc, c'est de l'activité intellectuelle en amont de la réalisation, pour concevoir un projet un peu plus étoffé qui puisse effectivement tenir la route.
Bonsoir,
Je crois plutôt que vous ne voulez pas comprendre.I
Il est parfois difficile quand on débute d'avoir la philosophie complète au premier jet. (J'ai pourtant déjà détaillé les attendus)
L'idée est bien d'avoir une ébauche de code, avec les règles précédemment citées. Que je pourrais utiliser ou adapter si ça ne correspond pas complètement au besoin..
Mais ce n'est pas grave.. je ferais sans..
Nous n'allons pas continuer l'envoie de messages stériles jusqu'à la fin de l'année. .. !
Encore merci pour votre aide précieuse. ..
Bonne continuation.