Boucle avec si sous VBA

  • Auteur de la discussion lepetitrossi
  • Date de début

lepetitrossi

Nouveau membre
Bonjour,


Je suis un peu perdu avec Visual Basic, J'ai réussi à faire une programmation plutot lourde et long sous excel pour embarqué du personnel dans un véhicule tout en faisant attention que les compétences des personnes répondent .

Je dois pouvoir utiliser la fonction BD Lire mais d'après ce que j'ai pu lire, VBA ne gere pas cette fonction.

Un véhicule peut etre constitué d'un conducteur d'un chef et de plusieurs équipiers

Alors voici ce que j'ai pensé faire pour passé outre cette fonction en Macro:

-Une base de donné sur la 2eme feuille "personnel". Dans la colonne A on a les noms, dans la colone B pour savoir si la personne à le permis ou non colonne C compétence à gerer une équipe et colonne D vérifier si cette personne à déja un poste dans un autre véhicule.

-Dans la première feuille "véhicule", une base de donné dans la colonne A le nom du véhicule (peu d'importance dans le recherche des personnes) dans la colonne B on fera apparaitre le nom de la personne choisi par la macro, dans la colonne C compétence requise pour le permis de conduire, colonne D compétence requise pour géré les équipes.

Voila en gros les 2 bases de données.

Je souhaiterais que la fonction face:

-Se positionne dans la première ligne de la base de donné "véhicule" , et dans celle de la base de donné véhicule

vérifie:


avec n=1ere ligne de la BD personnel (personnel)
avec l=1ere ligne de la BD dans véhicule (place dans le véhicule)
avec r=Colone B de la BD personnel (compétence 1 valide ou non)
avec s=colone C de la BD véhicule (compétence requise pour le poste)

Si la case personnel est vide ou égale à aucun
-alors Si compétence r de l'ouvrier n = compétence requise s place l
-alors si compétence r+1 de l'ouvrier n =compétence requise s+1 place l
-alors si occupation de l'ouvrier n =0
-Choisir ce nom et le copier dans la ligne l colonne B et passé l'occupation de la personne à 1

-Sinon recommencé avec l'ouvrier n+1 jusqu'a l'ouvrier 200

-Si aucun ouvrier répond aux attendes écrire Aucun

Un fois cette étape fini on passé à la place l+1
et on recommence depuis le départ

Sinon passé à l+1 et recommencer depuis le départ

En vous remerciant pour tout par avance! N'hésitez pas à me demander des précisions et en espérant que tout soit claire pour vous.
 

sphynxounet

Habitué


Y en a encore qui vont apprécier :D

Ton explication de programme ne semble pas trop compliquée mais c'est plutôt au début que je comprends pas trop. Tu parles de ta fonction BD lire mais d'où viennent les données que tu veux lire ? (parce qu'accessoirement Excel c'est un tableur, pas un gestionnaire de base de données).
 

lepetitrossi

Nouveau membre
enfaite les données sont rentrées sous excel , je ne détourne pas l’utilisation d'excel.

Le personnel est répertorié dans toute la feuille personnel. Car le nombre de compétence peut évoluer dans le temps.

Est-ce bien ça que tu voulais savoir?
 

sphynxounet

Habitué
Non en fait ce que je ne comprends pas c'est ce que tu n'arrives pas à faire.
 

sphynxounet

Habitué
Ça j'ai compris en fait c'était plus la fonction BDLIRE que je ne comprenais pas trop, j'ai toujours du mal avec des fonctions qu'on insère directement dans une cellule. Surtout quand on se retrouve avec une ligne assez longue et presque illisible.

Bon si j'ai bien compris ce que tu veux faire c'est remplir automatiquement tes véhicules en fonction de critères des personnes.
Tout d'abord il faut fixer les termes :
■au début tu parles d'un chef d'un conducteur et d'équipiers, dans l'explication de ton programme tu parles d'ouvriers.
■les noms des colonnes c'est parfois un peu confus, par exemple au début colonne B de la feuille personnel c'est le permis, en colonne C tu parles de compétences et dans l'explication tu parles de compétence pour la colonne B.

En fixant les termes on aura des variables claires et ça sera plus simple et plus lisible dans le programme pour toi. Si tu commences à nommer tes colonnes r, s, ... tu risque de faire ami ami très vite avec aspégic et doliprane.
De plus autant pour le permis je suppose que c'est un booléen, comme pour savoir si cette personne est déjà affectée à une voiture. Pour la compétence à gérer une équipe aussi ?
Avant de lancer la fonction il peut y avoir des gens qui sont déjà affectés à une voiture ? Parce que si ce n'est pas le cas comme on passe en revue les 200 personnes à la fin elles devraient toutes être affectées. Sauf si y a pas assez de voiture. Dans ce cas quelle est la solution envisagée ?

Par contre ce que je comprends pas trop c'est l'organisation des lignes de ta feuille voiture. Tu as combien de lignes pour le même nom d'une voiture ? (dans une smart y a 2 places, dans un mini van Wolkswagen on fait rentrer toute une tribu).
Au lieu d'avoir 2 colonnes pour les "compétences" dans la feuille voiture, on peut pas en avoir une seule qu'on pourrait appeler "rôle" et que l'on remplirait en fonction du rôle de la personne ? (chef, conducteur et équipier).
Quand on passe à une nouvelle voiture (nouveau nom dans la colonne A) on enchaine directement sans laisser de ligne vide ?
T'as déjà les noms de toutes les voitures ?
On pourrait rêver en imaginant que si y a 200 personnes, ça fait 50 voitures, 50 conducteurs, 50 chefs et 100 qui ramènent la bierre ?
 

lepetitrossi

Nouveau membre
Oki je comprends le malaise. Donc BDLire n'est que pour expliquer l'historique, j'ai réaliser une feuille en programmation pure sous excel. Mais c'est trop lourd à géré voila pourquoi je voudrais essayer d’allégé ça avec VBA.

En logique oui, toutes les personnes devraient être affecté mais il ce peut que non si jamais une personne n'a pas de compétence requise pour rentrer dans les places restantes des véhicules. C'est pour ça que je voudrais voir l'occupation des personnes.

Si cela simplifie la recherche alors le booléen peut être utilisé pour gérer toutes les compétences et même l'occupation.

Dans un véhicule on peut mettre de 2 à 8 personnes, en effet ça va de la smart au minibus

je préfere compétence car par exemple je peu avoir un véhicule spécialiser dans l'électricité et je veux que toutes les personnes de ce véhicule soit compétentes en électricité.
Au total j'ai une 10ene de compétence à géré mais ça après je m'en débrouille.

Mais je suis entrain de penser est-ce plus simple d’attribuer un code à chaque personne en fonction de leur compétence? car ce n'est pas un souci à programmé sous excel.

Pour répondre à une autre question, si jamais je n'arrive pas à remplir le véhicule complétement, ou si je rajoute des véhicules je ne veux pas risquer de modifier le personnel déjà embarqué dans tout les véhicules. Par contre entre les véhicules je comptais laissé une ligne vide. Est-ce un problème?

J'ai voulu essayé de faire simple avec des n,l,r et s mais sa embrouille je vois.
je pense que fournir un exemple simplifiera la compréhension.

En tout cas merci bien pour tout!!
 

sphynxounet

Habitué


Tu m'étonnes. Pour une fonction mathématique ok mais quand on veut commencer à gérer des données c'est bien plus simple de faire un peu de VBA.



Si on met les compétences en booléen cela signifie que pour chaque personne on aura 10 colonnes de compétences. Autant fixer les noms des compétences et avoir une seule colonne ça sera plus simple et plus facile à remplir dans les 2 feuilles.



D'où ma question de savoir si tu as déjà les noms des voitures. Si oui ça veut dire que la colonne A de la feuille voiture est déjà remplie et donc on peut tester cette colonne pour identifier une voiture vu qu'elles n'ont pas toutes le même nombre de places. Si y a rien dans la colonne A ça sera dur de connaitre le nombre de places maximum dans une voiture. Ou alors rajouter une colonne dans la feuille voiture en indiquant le nombre max de places.



Non comme dit plus haut on fixe un terme pour chaque compétence, pas besoin de se prendre la tête à faire un code qu'il faudra ensuite décortiquer dans le programme pour retrouver chaque compétence.



Ok ça veut dire que tes feuilles vont se remplir petit à petit donc bien prendre en compte les places restantes dans les voitures et les personnes qui ne sont pas dans une voiture quand on relance la fonction.
Pour la ligne j'allais te demander au début si tu laissais une ligne vide histoire que ce soit plus lisible :D . Ça pose pas de problème. Par contre du coup pour tester à savoir si on est à la dernière voiture on testera si on a 2 lignes vides.



Pas tant que ça car ton explication tient en peu de lignes mais le code risque d'en avoir un peu plus. Pour la compréhension et pour éviter de faire des erreurs entre les variables il est préférable de mettre des noms compréhensibles dans le code (sans que ce soit des noms à rallonge non plus).
 

lepetitrossi

Nouveau membre
Je ne comprenais pas vraiment ou tu voulais en venir par rapport au nombre de personne dans chaque véhicule. En effet chaque type de véhicule embarque le même nombre de personnes. Pour ça je pensais plutot à tester la présence de la demande de compétence.

Pour en revenir aux compétences, en gros il faudrait que dans la même case je précise si le conducteur à un compétence autre (comme électricien ou plombier ou autre), ou si le chef à ces compétences?

Si c'est le cas, ceci devrait être gérable.

Merci par avance
 

sphynxounet

Habitué
Pour le nombre maximum de places par véhicule va bien falloir qu'on retrouve cette information quelque part, la fonction pourra pas le deviner toute seule.

Pour les compétences faudrait bien séparer 2 choses : le rôle dans le véhicule (conducteur, chef ou un accompagnateur) et les compétences propres aux personnes (électricien, plombier, ...).
Pour le rôle on peut soit faire 2 colonnes de booléen (une pour conducteur, une pour chef et si les 2 sont à Faux on a un accompagnateur) soit faire une seule colonne et préciser le rôle dedans. A toi de voir ce qui te parait le plus simple, surtout pour remplir les colonnes de la feuille "personnel".
Pour les compétences tu as le même choix sauf que dans le cas de booléens on se retrouve avec 10 colonnes au lieu d'une seule.
 

lepetitrossi

Nouveau membre
Partons sur du booléen pour la gérance des conducteurs et chefs et sur les compétence faisons sur l'idée de comparaison entre ce qui est demandé et ce qu'a la personne. Comme tu le dis, cela fera moins de critère à rentrer.

Pour la gérance des véhicules je pensais raisonner pas en véhicules mais en places disponibles dans la logique de recherche. Ce qui fait que c'est à moi de raisonner en véhicule et en demandant par exemple sur la première ligne le conducteur, sur la deuxième le chef et d'ajouter (à titre d'exemple) 2 équipiers sur les 2 lignes suivantes en rentrant les critère requis. Car toi tu partirais du principe c'est un minibus donc c'est 6 personnes?
 

sphynxounet

Habitué
Si dans un minibus tu peux mettre 6 personnes il faut bien que cette information apparaisse quelque part pour que la fonction arrête de remplir le véhicule une fois qu'il sera plein.

En fait j'aimerai savoir comment sont rentrées les infos des véhicules dans la feuille. Est-ce que la colonne A, le nom du véhicule de la feuille "véhicule" est déjà remplie ? Si oui comment ?

Car imaginons que tu aies mis par exemple pour le 1er véhicule 4 fois le nom, donc sur les 4ères lignes, on pourra tester si la cellule de la colonne est vide ou non pour savoir si on a rempli le véhicule (la 5ème ligne étant vide).
Si tu mets juste une fois le nom du véhicule mais avec le nombre de places maximum dedans, on pourra récupérer l'information puis insérer des lignes jusqu'à remplir le véhicule. Comme ça tu n'auras qu'à mettre le nom de code du véhicule une seule fois en espaçant d'une ligne à chaque fois dans ta colonne A. Exemple PE-206-4, RE-MEG-4, ME-CLA-2 ([nom de la marque]-[nom du modèle]-[nombre max de places]).

Si tu veux comme le modèle véhicule change (quand je parle de modèle je parle de l'organisation des données, pas des marques de véhicule), il n'est pas possible d'avoir une boucle prédéfinie en disant "je teste de la ligne 1 à la ligne 4, si la ligne 4 est remplie le véhicule est plein". On a "je teste de la ligne 1 à la ligne X, si la ligne X est remplie alors le véhicule est plein". Et c'est ce X qu'il va falloir récupérer. Il faut que cette information apparaisse dans ta feuille véhicule.
 

lepetitrossi

Nouveau membre
Je suis ouvert à toute suggestion, je n'ai pas de contrainte la dessus. Concernant l'ajout de véhicule sa sera géré par autres Macros, mais la c'est bon, ça me va bien toute la présentation.
 

sphynxounet

Habitué
Ah enfin on arrive au moment où on apprend comment l'ajout des véhicules est géré ... et c'est par une autre macro :pt1cable:

Cette macro existe déjà ou tu dois la faire aussi ?

Si elle existe déjà autant nous dire tout de suite comment elle ajoute les véhicules.
 

lepetitrossi

Nouveau membre
Je devais la faire hier soir, mais un petit imprévu c'est glissé dans ma soirée. Donc pour l'instant rien n'est concrètement créé et défini.
 

sphynxounet

Habitué


Si cet imprévu s'est glissé dans ton lit on va pas t'en vouloir hein :D

Bon vu que cette fonction n'existe pas encore du coup on se retrouve un peu avec la liberté de faire ce que l'on veut. J'ai énuméré 2 possibilités pour les noms et l'organisation des voitures mais tu es libre de faire comme tu veux. Ça reste tes programmes il vaut mieux donc que les données soient organisées de manière à ce que tu t'y retrouves le plus rapidement et le plus simplement possible.
 

lepetitrossi

Nouveau membre
Si tu mets juste une fois le nom du véhicule mais avec le nombre de places maximum dedans, on pourra récupérer l'information puis insérer des lignes jusqu'à remplir le véhicule. Comme ça tu n'auras qu'à mettre le nom de code du véhicule une seule fois en espaçant d'une ligne à chaque fois dans ta colonne A. Exemple PE-206-4, RE-MEG-4, ME-CLA-2 ([nom de la marque]-[nom du modèle]-[nombre max de places]).

Pour le repérage des véhicules ça me va bien. Quand au choix des occupants, on part sur une fonction booléenne pour le conducteur et chef, par contre pour les compétences, sur un mode de comparaison entre ce qui est demandé et ce qui est possédé. Par contre est il possible avec la fonction de modifié l'état de la personne (de libre à occupé) immédiatement après le choix de cette personne? Pour ceci, je voudrais le géré en booléen aussi. J'y trouve plus simple.
 

sphynxounet

Habitué
Bien sur, tu peux modifier toutes les infos de toutes les feuilles de ton fichier donc une fois qu'on a placé une personne dans un véhicule on peut modifier un booléen dans une colonne de la feuille "personnel".
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 124
Messages
6 717 730
Membres
1 586 356
Dernier membre
TommyStam
Partager cette page
Haut