Ecriture VBA

Bonjour à tous !

J'ai déjà expliqué mon soucis sur un autre sujet mais je reviens avec des avancées et un tout autre angle de vue c'est pourquoi je prend la liberté de créer un nouveau sujet..

Alors pour m'expliquer: je suis, dans le besoin de mon projet de fin d'étude, en train de créer un planning automatisé qui répondra aux attentes de mon chef et qui lui permettra de ne plus perdre de temps à le créer manuellement.

J'ai pour cela en ma possession deux exports (mouvants): un de polyvalence (qui récapitule tout ce que sait faire les employés sur les activités et par employé) et un export des congés (qui sera changé/exporté toutes les semaines).

J'ai réussi à tout automatisé sauf que j'ai un assez gros problème pour le terminer. Je vous explique: J'ai écrit une formule avec SI et RechercheV imbriqués qui dit "va chercher dans le tableau d'export les noms des employés, si tu trouve le prénom (ce qui veut dire que l'employé sera absent a une date) alors tu m'affiche "CA" dans la case du/des jours correspondants et sinon (si tu ne trouve pas le nom) tu m'affiche les activités (présents sur un autre onglet par menu déroulant que le chef aura prédéfini précédemment).

Tout fonctionne très bien tant que l'employé n'a qu'une seule période de congé, c'est à dire qu'une seule ligne sur l'export. Or il se peut que l'employé ait plusieurs périodes de congés et donc apparaît sous forme de plusieurs lignes sur mon export (par exemple absence le lundi/mercredi et vendredi= 3 lignes différentes).

Sauf que la fonction RechercheV s'arrête à la première occurrence qu'elle trouve et donc ne me prend qu'une seule date peut importe si le nom de la personne apparaît plusieurs fois.

On m'a donc aidé a créer une macro sous la forme d'une fonction RechTous, qui, normalement devrait prendre le relais sur la RechercheV et prendre en compte toutes les fois ou le nom de l'employé apparaît.

Je l'ai donc mit en place dans VisualBasic et ait remplacé mes RechercheV dans ma formule par RecheTous sauf que ça ne marche pas et je ne comprend sincèrement pas pourquoi ...

Quelqu'un aurait-il une idée s'il vous plait ? C'est un projet très important pour moi car il définira si je valide mon année ou pas et là je sèche vraiment...

Je vous joint en PJ le fichier exemple ainsi que des imprim écrans qui j'espère illustreront bien mon projet. (Exemple pour l'employé "h" sur le fichier et en jaune les cellules ou devrait s'afficher "CA").

Merci à vous tous d'avance,

Cordialement

PS: Voici le VBA pour la fonction RechTous

Function RechTous(v As Range, champRech As Range, separateur As String) As String

Application.Volatile

Dim temp As String

Dim cel As Range

For Each cel In champRech

If cel.Value = v.Value Then temp = temp & cel.Offset(0, 1).Value & separateur

Next cel

RechTous = Left(temp, Len(temp) - Len(separateur))

End Function

forum 2 imagevba

Bonjour,

D'abord un fichier .xlsx ne contient pas de macro, donc ta fonction personnalisée est absente et n'a aucune raison de fonctionner !

Ensuite, tu l'insères en la dotant de 4 arguments alors que le code n'en montre que 3... ça va pas pouvoir marcher !

Enfin tu lui envoies une plage comportant toutes les cellules de la feuille pour rechercher, soit plus de 17 milliards !

Exactement : 17 179 869 184

Ça ce n'est pas vraiment une bonne idée !

Par ailleurs je ne comprends pas bien ce que peut faire cette fonction au vu de ton fichier ! Je ne vois pas du tout ce qu'elle pourra trouver... je ne comprends pas le rôle de séparateur en argument qui me paraît superflu et pour lequel tu envoies un nombre alors qu'il est de type String.

Désolé mais en l'état cela reste quelque peu incompréhensible.

Ah oui effectivement j'ai oublié de le passer en Xlsm..

A part cela, pour l'explication, on m'a aidé à écrire cette macro car je suis novice en écriture VBA et suis incapable de le modifier..

Le but de cette fonction pour être claire est qu'elle fonctionne exactement comme une RechercheV sauf qu'elle doit prendre en compte toutes les occurrences possibles (date de période de congé) par nom d'employé et non s'arrêter à la première occurrence trouvée comme le fait la RechercheV.

Est-ce que je peux me permettre de vous demander si il est possible que vous ou une gentille personne du forum, pouvez m'aider à l'écrire de manière à ce qu'elle fonctionne comme je l'ai décrit précédemment ? J'ai conscience que j'abuse certainement un peu mais il m'est très compliqué de comprendre comment tout cela fonctionne et j'ai déjà fait énormément de tests précédemment :/

Merci infiniment à vous tous,

cordialement

Comme je l'ai dit, je suis dubitatif sur cet argument séparateur et son rôle. D'autre part la fonction est censée renvoyer une donnée texte et je n'ai aucune idée de laquelle elle peut être, d'autant que dans son utilisation la plage de recherche est indéfinie, ce qui ne permet pas de déduire ce qu'elle doit trouver. Donc tant que tu n'indiques pas une situation précisément définie et le résultat attendu dans cette situation, je ne pense pas qu'on puisse avoir une idée précise de ce à quoi on doit aboutir...

Cordialement.

Oui je comprend, je vais essayer de m'expliquer au maximum:

J'avais écris une formule excel dans chaque cellule de mon planning (=SIERREUR(SI(ET(RECHERCHEV($B$4;'Macro congé'!$1:$1048576;11;FAUX)<=C3;RECHERCHEV($B$4;'Macro congé'!$1:$1048576;12;FAUX)>=C3);"CA";'Menu déroulant '!$G$2);'Menu déroulant '!$G$2)) qui permettait donc d'aller chercher dans mon export si le nom de l'employé apparaissait. Si il apparaissait cela se traduisait par le fait que l'employé était en congé et donc m'afficher "CA" sur les dates auxquelles il l'était et sinon, si ma formule ne trouvait pas le nom, c'est que l'employé était au travail est donc d'afficher les activités prédéfinis.

Le but de ma fonction était donc simplement de remplacer ma rechercheV dans ma formule par RechTous et que cette fois cette fonction RechTous prenne en compte toutes les dates correspondants par employé (une sorte de RechercheV mais qui continuerait a rechercher dans la totalité de mon tableau les périodes d'absences par employé peu importe le nombres d'absence(et donc de ligne) assimilées.

Le tableau est donc l'export. Il sera changeait toutes les semaines et donc je ne peux pas définir de "taille" de tableau car tout dépend du nombre d'employé en congé et également de leur nombre de congés posés.

Les noms a rechercher sont définis sur mon planning (onglet résultat) et eux ne bougeront pas.

Les noms correspondants dans l'export/le tableau d'absence seront toujours en première colonne.

Les date de début de période et de fin de période correspondent aux colonnes K et L pour l'exemple.

Le but de cette fonction est donc assimilable a la rechercheV exemple --> tu vas me chercher l'employé "h" dans le tableau de l'export, si le nom apparaît tu m'affiche "CA" dans les cellules correspondantes aux dates ou il est en congé (période de début/période de fin) et sinon tu m'affiche l’activité pré-choisi (partie menu déroulant). La particularité est simplement que l'outil devra continuer de chercher dans l'export/le tableau toutes les fois ou le nom apparaît et donc toutes les dates de congés.

Mon but est donc de créer cet outil et de remplacer ma RechercheV par RechTous dans ma fonction

(=SIERREUR(SI(ET(RECHERCHEV($B$4;'Macro congé'!$1:$1048576;11;FAUX)<=C3;RECHERCHEV($B$4;'Macro congé'!$1:$1048576;12;FAUX)>=C3);"CA";'Menu déroulant '!$G$2);'Menu déroulant '!$G$2))

Mais si une autre macro est plus simple a écrire et fait la même chose ca irait très bien également..

J'espère avoir était plus claire ?

Merci de ton et de votre aide !

Bonsoir,

J'ai regardé à nouveau pour en avoir le coeur net, mais excuse-moi ! je ne fais que trouver des incohérences supplémentaires !

Tu recherches des noms figurant en col.B (Résultat) en col.A de ta feuille Macro congé : on retrouve bien les noms... mais comme ils sont écrits différemment pour la plupart, je ne vois pas comment ils pourraient être trouvés !

On est censé ne chercher que des CA, or la colonne P (Motif) indique Congés payés, Maladie et une inscription non identifiable. Les mentions ça se normalise ! Et à ma connaissance Maladie ce n'est pas du CA !

D'autre part, ta fonction qui ne figure pas dans le classeur, je ne vois vraiment pas comment elle peut être utilisée dans ce contexte ! Elle a l'air d'avoir été faite pour toute autre chose !

Et puis, il faut redéfinir ton tableau de façon un peu plus raisonnable. 1:1048576 ! Là pour moi c'est non !

Mets un peu d'ordre dans tout ça et on y verra peut-être plus clair.

Cordialement.

Re-bonjour,

JE suis désolée d'insister j'ai l'impression d'être un gros boulet

Mais du coup, pour t'expliquer:

les noms ne correspondent pas exactement car c'est un exemple donc j'ai mit des lettres aléatoirement pour remplacer le noms des employés. Et c'est normal qu'ils n'y figurent pas tous car c'est un export du logiciel d'absence et qui donc bouge toutes les semaines. SI un employé est au travail il n'apparaît forcément pas sur l'export Ici, dans cet exemple, si tu veux le soucis va se poser par exemple pour l'employé "h" qui est absent le 05/06 et à partir du 07/06.

Et donc c'est pour ça que je pense qu'on s'est mal comprit : mon tableau est un export d'absence que mon chef importera toutes les semaines donc fatalement les noms bougent et qu'ils n'y figurent pas tous et peut importe le motif d'absence (je suis totalement d'accord avec toi que maladie n'est pas égal a congé annuel ) c'est moi, personnellement et en accord avec mon chef qui est décidait qu'a chaque fois que la personne sera absente (peu importe le motif) "CA" devra être affiché dans la case correspondant à la date d'absence.

Ma formule matricielle ? Effectivement, après de nooooombreuses recherches je me rend bien compte qu'elle ne correspond pas à mes attentes. En GROS j'aimerai créer une fonction sous VBA, qui remplace la rechercheV dans ma grosse formule dans mon planning et qui affiche "CA" dans toutes les dates d'absences, peu importe le nombre de fois où elle va trouver "h" par exemple.

Est-ce que j'arrive à être plus claire ou est ce que je nage encore ?

Et concernant la taille du tableau, je pense qu'une centaine de ligne max suffirait largement si ça te convient ? Le nombre de colonne ne bougeront jamais

Voilaaa, merci ^^

cordialement

Rechercher des sujets similaires à "ecriture vba"