Projet demande de Vacance avec Excel et VBA

Parce que je ne voulais pas que ça s’écrase mais en fait effectivement je peux copier la première ligne et insérer une ligne coupée sur celle-ci effectivement, je n’avais pas cette vision

Oui je vais essayer aujourd’hui de reprendre l’orientation que tu m’as donné

Tu penses que une macro pour 2 fichiers différents semble compliqué ?

Bonjour

Je te transmets ton fichier « ExempleFichier Zone.xlsm » avec l’adaptation pour une intégration fichier « Organisation du personnel - 22 Picks Proget Donnée Absence.xlsm » onglet « a traité » à la première ligne libre de celui-ci car je pense que tu n’as pas bien compris ce que je cherchais à t’expliquer

Testes et regardes le résultat dans cet onglet

J’ai rajouté un deuxième bouton « Envoyé2 » relié à une macro simplifiée « Sub envoyé2() » fichier « ExempleFichier Zone.xlsm » onglet « Gestion des Absences »

Fais le test aussi avec ce bouton et tu constateras la différence concernant le temps d’exécution

Regardes aussi les lignes de code à comparer avec les tiennes

Fais moi un retour

ExempleFichier Zone.xlsm (218,8 Ko)

Merci pour cet apprentissage FFO,

j’en deviens de plus en plus passionné :blush:

Workbooks(« Organisation du personnel - 22 Picks Proget Donnée Absence.xlsm »).Sheets(« a traité »).Range(« A » & derligne).Value = Range(« A6 »).Value

Si j’ai bien compris grâce à cela tu as dit à Excel :

Envoie sur le classeur avec (Workbboks) a la feuille « A traité » avec (.Sheets) de la cellule « A » (avec .Range) et la dernier ligne(avec Derligne), les valeurs a partir de la cellule « A6 » ( avec .Value). ?

Assez incroyable la différence effectivement le code est beaucoup plus courts délais traitement de meilleure qualité, Je me réjouis d’apprendre davantage

La première étape de mon idée et franchise. Je peux maintenant visualiser la possibilité que les 9 zones puissent envoyer en même temps sans trop impacté le fichier principal des manageurs

La 2e étape serait que sur le fichier « Organisation du Personnel 22picks » sur la feuille « Janvier-Décembre 2022 »,puisse avoir un visuel sur le nombre de ligne dans la feuille « à traiter », ( part exemple ( Demande d’absence en Attente : 12)
Comme ce que tu as mis en place sur la cellule « N6 », pour le traitement « Jour de Travail », j’ai bien essayé de regarder tes lignes de code, mais je n’ai pas vue la cellule « N6 » mentionné.

Du coup je me suis lancé :slight_smile:

J’ai essayé avec le fichier organisation du personnel 2022, de reprendre les valeurs de la feuille « A traité », pour les replacés sur la feuille « Gestion il me dit indice pas trouvé (Indice pas trouvé), L’indice c’est bien le nom de la feuille ?

Organisation du personnel - 22 Picks Proget Donnée Absence.xlsm (1,3 Mo)

« Envoie sur le classeur avec (Workbboks) a la feuille « A traité » avec (.Sheets) de la cellule « A » (avec .Range) et la dernier ligne(avec Derligne), les valeurs a partir de la cellule « A6 » ( avec .Value). ? »

Exact tu as bien compris

« J’ai essayé avec le fichier organisation du personnel 2022, de reprendre les valeurs de la feuille « A traité », pour les replacés sur la feuille « Gestion il me dit indice pas trouvé (Indice pas trouvé), L’indice c’est bien le nom de la feuille ? »

Mais tu n’as pas appliqué !!!

Envoie sur le classeur avec (Workbboks)

Workbooks(« a traité ») je doute qu’entre les parenthèses celà soit le classeur

« a la feuille « A traité » avec (.Sheets) »

Dans tes lignes copiées ou est l’instruction Sheets ???

Revoies tes lignes dans cet esprit et cela devrait le faire :

Workbooks("nom du classeur avec son extension).Sheets(nom de l’onglet) .Range(« A » & derligne).Value = Range(« A2 »).Value

Attention la variable derligne doit être déterminée avant ces lignes de code

« La première étape de mon idée et franchise. Je peux maintenant visualiser la possibilité que les 9 zones puissent envoyer en même temps sans trop impacté le fichier principal des manageurs »

Avec l’inconnu d’un classeur ouvert à alimenter ce n’est pas gagné !!!
A essayer

« La 2e étape serait que sur le fichier « Organisation du Personnel 22picks » sur la feuille « Janvier-Décembre 2022 »,puisse avoir un visuel sur le nombre de ligne dans la feuille « à traiter », ( part exemple ( Demande d’absence en Attente : 12)
Comme ce que tu as mis en place sur la cellule « N6 », pour le traitement « Jour de Travail », j’ai bien essayé de regarder tes lignes de code, mais je n’ai pas vue la cellule « N6 » mentionné. »

En cellule N6 j’ai intégré la progression du traitement avec :

le nombre de ligne à traiter/ligne traitée

Pour connaitre le nombre de ligne à traiter j’utilise cette ligne de code sur une colonne qui est toujours avec une donnée :

nblignes = Range(« M » & Rows.Count).End(xlUp).Row

la variable qui récupère l’information : nblignes

A partir de la toute dernière ligne de la feuille pour une colonne ici « M » : Range(« M » & Rows.Count)

Je remonte jusqu’à la première cellule de cette colonne qui change d’état : Range(« M » & Rows.Count).End(xlUp)

Si la dernière cellule de la feuille est vide première cellule qui sera avec une donnée (non vide)
Si la dernière cellule de la feuille est non vide première cellule qui sera sans donnée (vide)

Je récupère le numéro de cette ligne : Range(« M » & Rows.Count).End(xlUp).Row

Comme la dernière cellule d’une feuille est toujours vide le numéro de la première cellule non vide correspond à la dernière ligne saisie

A toi de trouver la bonne colonne toujours avec une donnée pour déterminer avec cette instruction la dernière ligne saisie

Pour un classeur déterminé avec un onglet déterminé il faut rajouter cette partie : Workbooks("nom du classeur avec son extension).Sheets(nom de l’onglet)

Ce qui donne :

nblignes =Workbooks("nom du classeur avec son extension).Sheets(nom de l’onglet).Range(« M » & Rows.Count).End(xlUp).Row

Si souci je suis disponible

Range = Cellule ?

Rows.count cela sert pour quel raison ?

End(Xlup) pour la dernière ligne ?

Sub Traitement()

nblignes = Range(« A » & Rows.Count).End(xlUp).Row

Range (« A ») & Rows.Count

Range(« A » & Rows.Count).End (xlUp)
Range(« A » & Rows.Count).End(xlUp).Row
Quel es la difference ? avec ou sans Row ?

nblignes = Workbooks(« Organisation du personnel - 22 Picks Proget Donnée Absence.xlsm »).Sheets("a traité ").Range(« A » & Rows.Count).End(xlUp).Row

Et comment t’as fait pour l’afficher sur la cellule ?

Pour connaître vraiment ce qu’il faut mettre au bon endroit il faut que je puisse avoir des connaissence en part cœur.

Est-ce qu’il existerait des livres pour l’étude que tu me conseillerais ?

Rows.count cela sert pour quel raison ?

Rows : lignes
count : compte
Rows.count : compte le nombre de ligne

Range = Cellule ?
Oui mais l’un Range détermine la cellule avec la lettre de la colonne et le numéro de la ligne : Range(« A1 ») cellule colonne A ligne 1 l’autre détermine la cellule avec le numéro de la colonne et le numéro de la ligne : Cells(1,1) cellule ligne 1 colonne 1 soit A1

End(Xlup) pour la dernière ligne ?

End : fin
Xlup : en remontant

Détermine la cellule qui change d’état à partir d’une cellule initiale en remontant

Exemple :

Range(« A10 »).End(xlup) donnera 5

La cellule A10 est vide End(xlup) à partir de cette cellule vide détermine la cellule A5 car elle est avec une donnée sa valeur est 5
A l’inverse :

Range(« A15 »).End(xlup) donnera 1

La cellule A15 est avec une donnée donc non vide End(xlup) à partir de cette cellule vide détermine la cellule A11 car c’est la dernière avec une donnée la suivante étant vide sa valeur est 1

« Quel es la difference ? avec ou sans Row ? »

Sans Row on obtient la valeur de la cellule déterminée
Avec Row on obtient le numéro de la ligne de cette cellule

On pourrait aussi avoir Address ainsi

Range(« A » & Rows.Count).End (xlUp).Address

On obtiendrait l’adresse de la cellule sous forme par exemple « $A$1 » pour la cellule A1

« Et comment t’as fait pour l’afficher sur la cellule ? »

Si la cellule est « N6 » je mets :

Range(« N6 ») = nblignes

Pour un onglet particulier autre que celui actif :

Sheets(« nom de l’onglet »).Range(« N6 ») = nblignes

Dans un autre classeur :

WorkBooks(« nom du classeur »).Sheets(« nom de l’onglet »).Range(« N6 ») = nblignes

« Est-ce qu’il existerait des livres pour l’étude que tu me conseillerais ? »

Ce n’est pas ce qui manque mais moi j’ai opté pour la mise des mains dans le cambouis directement rien de tel pour apprendre

On se casse les dents mais c’est très efficace

Internet est une source inépuisable tu trouveras toujours au coup par coup les réponses à tes questions

Rien ne sert de vouloir retenir des lignes d’instructions avec cette source d’information il faut simplement pratiquer
Le plus important est la manière d’aborder un traitement les différentes possibilités pour atteindre le but recherché
Les écrire n’est qu’une formalité

Donc si tu veux mon conseil pratiques le langage beaucoup de chose vont s’éclaircir au grés de tes acquis
Certes tu vas ramer au départ comme j’ai ramé à mes débuts mais en véritable autodidact (aucune formation très peux de manuel) je peux dire qu’aujourd’hui je me débrouille et beaucoup de mes interlocuteurs profitent de ce que je leur apporte
C’est à mettre au profit de la pratique ni plus ni moins
Je me suis rapidement intégré dans un forum d’aide comme celui-ci et si au début mes apports étaient rudimentaires petit à petit ils se sont enrichis pour être ce qu’ils sont aujourd’hui

Donc retrousses tes manches et bel avenir s’offre à toi

1 « J'aime »

Hello FFO

Encore merci pour ta patience

Je vais essayer de créer une ligne de code en voulant dire à Excel tu me prends les valeurs de la ligne 2 feuille « à traiter » et tu me les colles dans la feuille « Gestion des Absences » des absences, et tu supprimé les lignes 2 de la feuille a Traité.

J’ai essayé de suivre tes instructions pour refaire comme la Cellule « N6 » pour la feuille « à traiter »

Il me dit que « l’indice n’appartient pas à la sélection », ça veut dire qu’il lui manque le nom de la feuille.

Sub Traitement()

.Sheets(" a traité ") = nblignes = Range(« A » & Rows.Count).End(xlUp).Row

Range (« A ») & Rows.Count

Range(« A » & Rows.Count).End (xlUp)

Range(« A » & Rows.Count).End(xlUp).Row

nblignes = Workbooks(" Organisation du personnel - 22 Picks Proget Donnée Absence « ).Sheets( » Gestion des Absences ").Range(« A » & Rows.Count).End(xlUp).Row

.Sheets("Organisation du personnel - 22 Picks Proget Donnée Absence ").Range(« A4 ») = nblignes
.

Je vais partir en vacances pendant quelque temps et j’aurais pas loisir de mettre en exécution ce que tu m’as appris et dès que je rentre, le cambouis j’ai bien compris :blush: et je suis completement d’accord avec toi.
Organisation du personnel - 22 Picks Proget Donnée Absence.xlsm (1,3 Mo)

Macro (Absence)

Je me permets de te renvoyer le fichier j’ai essayé de faire pour que dans la feuille « a traité » , il me copie les valeurs à partir de la cellule « A2 », sur son bon emplacement dans la feuille gestion des absences à la cellule à « A6 » ainsi de suite.

Il me dit que l’indice n’appartient pas à la sélection.

J’ai essayé de changer avec les noms des feuilles mais comme je veux copier de la Feuille (a Traité) sur la feuille (Gestion des absences) j’a pas trouvé
Organisation du personnel - 22 Picks Proget Donnée Absence.xlsm (1,3 Mo)

Merci FFO

Bonsoir

Je suppose par ce que tu ne me le dis pas que cela concerne la macro « absence » qui est activé par le bouton « A Traiter » de l’onglet « Gestion des Absences »

Dans la procédure les lignes objet de ce message font appel à un classeur « Organisation du personnel - 22 Picks Proget Donnée Absence.xlsm » exemple dans cette ligne de code

derligne = Workbooks(« Organisation du personnel - 22 Picks Proget Donnée Absence.xlsm »).Sheets(« a traité »).Range(« A » & Rows.Count).End(xlUp).Row + 1

Un classeur doit être cité dans une ligne de code lorsqu’il est extérieur à celui de la macro ou si celui de la macro n est pas celui actif à l ecran sinon il ne faut pas le citer si l instruction concerne le classeur de cette macro
Le citer de manière inutile s est s exploser au risque que si son nom évolue celui utilisé dans cette citation devienne erroné et donc engendre ce dysfonctionnement

Je pense que ton souci viens de cette instruction qui n’a pas lieu d’être

au lieu de ceci :

derligne = Workbooks(« Organisation du personnel - 22 Picks Proget Donnée Absence.xlsm »).Sheets(« a traité »).Range(« A » & Rows.Count).End(xlUp).Row + 1

Il faut écrire ceci :

derligne = Sheets(« a traité »).Range(« A » & Rows.Count).End(xlUp).Row + 1

Ne pas désigner le classeur puisque c’est celui du traitement actif à l écran simplement l’onglet et la cellule

J’ai modifié dans cet esprit tout ton traitement
J’ai inhibé les lignes modifiées (elles sont en vert dans le code) et mis en suivant celles de remplacement

Regardes testes et dis moi

Organisation du personnel - 22 Picks Proget Donnée Absence (1).xlsm (1,3 Mo)

1 « J'aime »

Hello FFO,

Logique quand on y pense inutile de lui préciser que je veux ce classeur si je suis dessus.

J’ai de la peine à saisir de comment lui dire je veux que tu me copies de cette feuille (« a traite ») que tu me la colles sur (« Gestion des Absences ») sur les bonnes cellules.

Il y a plus de message d’erreur, la macro semble s’exécuter, Mais cela va pas dans gestion des absences, le collage c’est bien cela ?

Sheets(« a traité »).Range(« A » & derligne).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone
(qaund je change pour (« Gestion des Absences » ) il prend pas

Le point positif est que la suppression la ligne j’ai réussi ça fonctionne :blush:
un premier pas :slight_smile:

Sub absence()

derligne = Sheets(« a traité »).Range(« A » & Rows.Count).End(xlUp).Row + 1

Sheets(« a traité »).Range(« A » & derligne).Value = Range(« A2 »).Value
Sheets(« a traité »).Range(« B » & derligne).Value = Range(« B6 »).Value
Sheets(« a traité »).Range(« D » & derligne).Value = Range(« D6 »).Value

Sheets(« a traité »).Range(« E » & derligne, « I » & derligne).Value = Range(« A11 », « E11 »).Value
Sheets(« a traité »).Range(« J » & derligne, « N » & derligne).Value = Range(« A15 », « E15 »).Value
Sheets(« a traité »).Range(« O » & derligne, « S » & derligne).Value = Range(« A19 », « E19 »).Value

Sheets(« a traité »).Rows(derligne - 1 & « : » & derligne - 1).Copy

'Sheets(« Gestion des Absence »).Range(« A » & derligne).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone
Sheets(« a traité »).Range(« A » & derligne).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone
((là si j’ai bien compris on lui dit tu me colles le même format et la valeur )

Range(« A6,B6,D6:E6,E11,D11,B11,A11,A15,B15,D15,E15,E19,D19,B19,A19 »).Select
Range(« A19 »).Activate
Selection.ClearContents
Range(« F5 »).Select ( j’ai pas compris pourquoi la cellule F5 en selection)
Selection.Delete Shift:=xlUp
Sheets(« a traité »).Select
Rows(« 2 »).Select
Rows(« 2 »).Delete **( Ca marches :-))
**

End Sub
Organisation du personnel - 22 Picks Proget Donnée Absence.xlsm (1,3 Mo)

J’ai essayé deux version pour la vision du traitement :

Mais j’arrivé a pas comprendre comment l’affiché, tu peux m’aidé stp :slight_smile: .


Sub Traitement()
nblignes = Worksheets(« a traité ») = Range(« A » & Rows.Count).End(xlUp).Row
End Sub


Sub Traitment()

.Sheets(" a traité « ) = nblignes = Range(« A » & Rows.Count).End(xlUp).Row
Range (« A ») & Rows.Count
Range(« A » & Rows.Count).End (xlUp)
Range(« A » & Rows.Count).End(xlUp).Row
nblignes = Workbooks( » Organisation du personnel - 22 Picks Proget Donnée Absence « ).Sheets( » Gestion des Absences ").Range(« A » & Rows.Count).End(xlUp).Row
.Sheets("Organisation du personnel - 22 Picks Proget Donnée Absence ").Range(« A4 ») = nblignes
End

image

Bonjour

Que cherches tu à faire ?

compter le nombre de lignes de l’onglet « a traité » ?

Pour le mettre où ?

Merci de me dire

« J’ai de la peine à saisir de comment lui dire je veux que tu me copies de cette feuille (« a traite ») que tu me la colles sur (« Gestion des Absences ») sur les bonnes cellules. »

Attention la macro « absence » a été conçu dans son déroulement pour alimenter l’onglet « a traité » des données de l’onglet « Gestion des Absences » non pas l’inverse

Il faut bien comprendre que selon que l’on souhaite alimenter l’onglet « a traité » des données de l’onglet « Gestion des Absences » ou l’inverse les contextes sont totalement différents donc les démarches aussi

L’un « Gestion des Absences » a ses données dans des cellules fixes l’autre « a traité » a ses données dans des cellules fluctuantes

Donc il faudra pour le premier utiliser toujours les même cellules pour l’autre les déterminer

Lorsque la source est « Gestion des Absences » et la cible « a traité » la ligne de ce dernier à utiliser sera à déterminer
A l’inverse c’est la ligne du premier qu’il faudra choisir et non celle du second

Donc l’approche est inversée

c’est l’objet de cette ligne de code :

derligne = Sheets(« a traité »).Range(« A » & Rows.Count).End(xlUp).Row + 1

qui détermine la première ligne libre en utilisant les données de la colonne « A » onglet « a traité »

Et ainsi de rapporter toutes les données de l’onglet « Gestion des Absences » dans les cellules de cette ligne onglet « a traité »

Si tu souhaites inverser les onglets source et cible il faudra déterminer la ligne concernées de l’onglet source « a traité » pour alimenter les cellules fixes de l’onglet cible « Gestion des Absences »

Reste à savoir comment ?

plusieurs possibilité :

Sélection de celle-ci (nécessité d’être sur l’onglet à l’activation du traitement)
Couleur de celle-ci (en colonne « A » mettre une couleur à déterminer)
Boite de dialogue avec saisie du numéro
Clé de recherche à déterminer
Etc…

Il faut réfléchir à cette approche pour mettre en place le traitement approprié

Je te joins un exemple avec la ligne à récupérer sélectionnée onglet « a traité »
Dans cet onglet sélectionnes une ligne puis cliques sur le bouton « Récupération » en « T2 »

Constates le résultat onglet « Gestion des Absences »

Organisation du personnel - 22 Picks Proget Donnée Absence (1).xlsm (1,3 Mo)

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.