> Tous les forumsBureautique

 récupérer des données sur plusieurs feuilles excelSujet résolu
3 pages : [1] 2 3 ... Fin
Bas de la page Page Précédente Page Suivante 
Statut du sujet : RESOLU Imprimer
 pierrotd
  Posté le 12/10/2007 @ 16:56  
 Petit astucien

335 Messages

Bonjour à tous,

Je souhaite insérer un feuille de pointage de personnels (en cas d'évacuation incendie de mon établissement) dans un fichier excel qui ne m'appartient pas et sur lequel je suis seulement autorisé à ajouter un bouton de macro( sur 'pers1').Je ne dois pas modifier la mise en page et les macros existantes des feuilles 'pers1', 'pers2', 'pers3' et 'pers4'. Ce sont des bulletins d'appel dans lesquels des lignes de noms peuvent être insérées (listes modifiables) par les services autorisés mais pas moi!

Dans le fichier ci-joint, http://cjoint.com/?kmqZ3R6wea je souhaite donc récupérer les noms des 4 premiers onglets vers l'onglet 'feuil1', trier ces noms par unité, mettre cette feuille en forme et l'envoyer par émail aux destinataires (liste qui pourrait également évoluer). Toute cette manip serait lancée par un bouton sur 'pers1' qui activerait une ou plusieurs macros.

J'espère avoir bien exprimé mon besoin. Quelqu'un aurait-il une p'tite idée?

D'avance, je vous remercie de votre aide.A +

PS: Plus tard, j'envisage de lier des services aux colonnes unités en partant d'une autre source de données. Mais je verrais si j'en obtiens l'accord.

 Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 
 
Publicité
 galopin01  Posté le 12/10/2007 à 19:08  
Astucien

4321 Messages

Bonsoir,

Moi je suis un peu surbooké là je ne peux pas m'en charger.

YAKA faire une boucle sur chaque feuille :

Tant que on ne rencontre pas le mot "Total" on charge les noms dans un Array ou une New Collection... et on colle tout ça au bon endroit !

Bon on n'est pas vraiment dans le domaines des trucs et astuces, mais il te faut de la macro "clef en main" ?

je ne peux absolument pas mettre mon nez dedans avant décembre...

A+

Afficher le profil de galopin01 Voir la configuration de galopin01Envoyer un message privé à galopin01
 Revenir en haut de la page
 pierrotd  Posté le 12/10/2007 à 21:58  
Petit astucien

335 Messages

Bonsoirà tous, bonsoir Galopin,

Je suis un lecteur régulier du forum, hélas pas un contributeur et resté un nul "macro teur" . Lors de la gestation de Pinpon, j'avais un début de commencement d' à peu près comprendre les macros. Hélas, je n'ai pas approffondi et je me retrouve une fois de plus le bec dans l'eau devant un sujet épineux.

"YAKA faire une boucle sur chaque feuille :Tant que on ne rencontre pas le mot "Total" on charge les noms dans un Array ou une New Collection..." Excuses-moi, mais je n'y comprends rien; tant pis je vais attendre... .

Bonne soirée à tous!

à +

Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 Revenir en haut de la page
 gilbert_rgi  Posté le 13/10/2007 à 17:37  
Petit astucien


842 Messages

Bonjour

pierrotd
  1. je souhaite donc récupérer les noms des 4 premiers onglets vers l'onglet 'feuil1',

1°) mettre les noms des feuilles où dans la feuil1 ?

Pierrotd
  1. trier ces noms par unité,

2°) c'est à dire (par ordre alpha croissant) ?

pierrotd
  1. mettre cette feuille en forme et l'envoyer par émail aux destinataires

???? avec quoi (outlook, Mozilla, outlook express ????)

Pierrotd
  1. Toute cette manip serait lancée par un bouton sur 'pers1' qui activerait une ou plusieurs macros.

Pas de problème réalisable
Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 pierrotd  Posté le 13/10/2007 à 23:20  
Petit astucien

335 Messages

Bonsoir à tous!

Merci Gilbert_rgi de vous intéresser à mon problème. J'ai bien reçu votre essai, mais il y a une erreur '1004'et si je mets un personnel absent, ce n'est pas reporté sur'feuil1' après le lancement de la macro par le nouveau bouton.

Je crois en fait avoir mal exprimer mon besoin. Les responsables du bulletin global recoivent les bulletins partiels des services et lancent des macro par l'intermédiaire des 3 boutons au dessus du futur mien sur la feuille 'pers1'. Une fois leur synthèse faite, c'est là que je souhaite une macro qui récupère les informations de 'pers1', 'pers2', 'pers3' et 'pers4', qui les recopie en les triant par service comme sur la feuille exemple 'feuil1' et qui envoye cette feuille triée par outlook express 6 au(x) destinataire(s). Vu mon faible niveau en excel ma 'feuil1' est juste un copié-collé des noms avec des colonnes masquées et une formule enfantine pour écrire en clair 'absent'.

J'ai modifié un peu la mise en page de ce que je souhaite: http://cjoint.com/?knxIJibd35

Je précise que les responsables sont ammener à insérer ou supprimer certains personnels dans les feuilles 'pers1', 'pers2', 'pers3' et 'pers4'et qu'ils lanceraient la macro tous les jours. Je recevrais donc la 'feuil1' actualisée chaque matin.

pour répondre aux points de votre réponse:

1) non: je souhaite juste les noms des personnels, leur présence (0 ou 1, le zéro étant converti en 'absent') et leur service (colonne L).

2)je souhaite trier par service (colonne L) sur la même ligne que leur nom.

3) par OE6

J'espère m'être mieux expliqué. C'est formidable quand on comprend et on sait utliser le VBA.

Merci sincèrement de votre aide et à +

Je précise que nous travaillons avec excel 2000.



Modifié par pierrotd le 13/10/2007 23:37
Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 Revenir en haut de la page
 ferrand  Posté le 14/10/2007 à 00:21  
Astucien

1600 Messages

Bonsoir pierrotd,

A défaut de Galopin, je peux te proproser une macro pour transférer les informations sur ta feuille de pointage. Mon code est moins compact que le sien mais ça fonctionne quand même...

Je pars de tes souhaits : bouton dans feuille PERS1 (même type de boutons que ceux déjà existants), je l'ai appelé Pointage mais tu peux mettre le nom que tu veux ; macro (sub Pointage) affectée à ce bouton, je l'ai casée pour essai dans le module 7 (inutile d'en créer un, vu qu'il y a déjà de nombreux modules vides dans ton classeur). Au vu de ton classeur existant, j'ai considéré que ta feuille cible dans sa forme actuelle était permanente et qu'il suffisait d'actualiser les informations (si ce n'est pas le cas, il faudrait aménager mais pour cela savoir précisément ce qui peut varier et selon quelle amplitude) ; au stade actuel, la macro ne modifie pas la mise en forme de la feuille. Il s'agit donc de récupérer les informations à reproduire sur les 4 premières feuille, les répartir par catégorie (ce que tu appelles me semble-t-il unités) et les trier dans chaque catégorie, reporter ces informations sur la feuille cible.

Je reproduis la macro ci-dessous, en y intercalant des commentaires explicatifs (en rouge) pour te permettre le cas échéant de la modifier selon tes besoins.

Sub Pointage()
Dim lisBVD(), lisDIR(), lisGAT(), lisGEMA()
Dim liste, nom
Dim h As Integer, i As Integer, j As Integer, m As Integer, n As Integer

Les variables utilisées sont toutes déclarées (ci-dessus) : 4 variables tableaux dynamiques (pour récupérer les infos de chaque catégorie ou unité, 2 variables de type variant et 5 de type integer dont l'utilisation sera vue plus loin).


' Préparation

La préparation (ci-dessous) consiste d'abord à vider la feuille pointage des informations existantes (éventuellement périmées). Celles-ci figurent sur 3 blocs d'information sur les lignes 2 à 42, les colonnes 1, 6 et 11 étant les premières de chaque bloc (la variable n sert pour traiter successivement chacun des blocs) : on efface la 1e et la 4e colonne de chaque bloc, on laisse la 3e telle quelle (avec ses formules), on met 1 dans la 2e de façon à ne pas afficher absent en l'absence d'indication à cet endroit.


With ThisWorkbook.Worksheets("Feuil1")
For n = 1 To 11 Step 5
Range(.Cells(2, n), .Cells(42, n)).ClearContents
Range(.Cells(2, n + 1), .Cells(42, n + 1)) = 1
Range(.Cells(2, n + 3), .Cells(42, n + 3)).ClearContents
Next n
End With

Deuxième phase de la préparation : dimensionner les tableaux destinés à accueillir les informations : imaginer un tableau en 2 colonnes (col. 0 pour le nom et col. 1 pour la position) et autant de lignes (1 à x) que de noms à accueillir mais qu'on ajoutera au fur et à mesure, la ligne 0 étant réservée pour le nombre de noms qui seront insérés (élément 0,0) et l'indication de l'unité commune pour tous les noms du tableau (élément 1,0).


Redim lisBVD(0 To 1, 0 To 0)
lisBVD(1, 0) = "BVD"
Redim lisDIR(0 To 1, 0 To 0)
lisDIR(1, 0) = "DIR"
Redim lisGAT(0 To 1, 0 To 0)
lisGAT(1, 0) = "GAT"
Redim lisGEMA(0 To 1, 0 To 0)
lisGEMA(1, 0) = "GEMA"
' Recueil des informations

Les informations utiles sont recueillies au moyen de 2 boucles imbriquées : une boucle for...next pour balayer chacune des feuilles concernées (utilisation de la variable n pour chaque feuille PERSn), puis une boucle Do...Loop pour balayer la zone utile dans chaque feuille (de la ligne 9 jusqu'à la ligne précédant l'indication TOTAL). Avant de lancer la boucle pour chaque feuille, on initialise une variable identifiant la ligne à la valeur 9 (première ligne utile), i sera incrémenté de 1 à la fin de chaque tour de boucle (pour passer à la ligne suivante) ; au début de chaque tour on vérifie d'abord que la ligne ne contient pas TOTAL en col. 2 (si c'est le cas, on interrompt la boucle (pour passer à la feuille suivante ou poursuivre si dernière feuille), on identifie ensuite l'unité (col. 12, variable liste pour recueillir cette indication) pour utiliser le tableau correspondant, dans le tableau on récupère l'indication du rang de l'élément à ajouter (variable m) et on le Redimensionne et préservant son contenu, on affecte aux nouveaux éléments (0,m et 1,m) les informations recueillies (nom en col.2 et position en col.10), et ainsi de suite jusqu'à la fin.


For n = 1 To 4
With ThisWorkbook.Worksheets("PERS" & n)
i = 9
Do
If .Cells(i, 2).Value = "TOTAL" Then Exit Do
If .Cells(i, 12).Value <> 0 Then liste = .Cells(i, 12).Value
Select Case liste
Case "BVD"
m = lisBVD(0, 0) + 1
Redim Preserve lisBVD(0 To 1, 0 To m)
lisBVD(0, m) = .Cells(i, 2).Value
lisBVD(1, m) = .Cells(i, 10).Value
lisBVD(0, 0) = m
Case "DIR"
m = lisDIR(0, 0) + 1
Redim Preserve lisDIR(0 To 1, 0 To m)
lisDIR(0, m) = .Cells(i, 2).Value
lisDIR(1, m) = .Cells(i, 10).Value
lisDIR(0, 0) = m
Case "GAT"
m = lisGAT(0, 0) + 1
Redim Preserve lisGAT(0 To 1, 0 To m)
lisGAT(0, m) = .Cells(i, 2).Value
lisGAT(1, m) = .Cells(i, 10).Value
lisGAT(0, 0) = m
Case "GEMA"
m = lisGEMA(0, 0) + 1
Redim Preserve lisGEMA(0 To 1, 0 To m)
lisGEMA(0, m) = .Cells(i, 2).Value
lisGEMA(1, m) = .Cells(i, 10).Value
lisGEMA(0, 0) = m
End Select
i = i + 1
Loop
End With
Next n
' Tri des données de chaque liste

Il s'agit maintenant de trier chaque tableau. Par commodité on regroupe les 4 tableaux dans la variable liste qui contiendra ainsi un tableau de tableaux), ce qui permet d'utiliser une boucle For..Next avec la variable n pour trier successivement chacun. Pour chaque tableau on recueille (variable m) le nombre d'éléments (nom-position) à reclasser par ordre alphabétique du nom), on procède ensuite au tri (sachant que les éléments sont prétriés par séquence correspondant à une feuillle source) au moyen de 2 boucles For...Next imbriquées. On prend chaque nom du 2e au dernier (boucle utilisant variable h, on affecte les informations nom et position à la variable nom pour comparaison et reclassement) pour le reclasser dans la partie de liste qui le précède si nécessaire (boucle utilisant variable i pour comparer chaque nom précédent avec le nom à reclasser : si le nom précédent doit passer après, on le décale, sinon on repositionne le nom traité et on passe au suivant).


liste = Array(lisBVD, lisDIR, lisGAT, lisGEMA)
For n = 0 To 3
m = liste(n)(0, 0)
For h = 2 To m
nom = Array(liste(n)(0, h), liste(n)(1, h))
For i = h - 1 To 1 Step -1
If liste(n)(0, i) > nom(0) Then
liste(n)(0, i + 1) = liste(n)(0, i)
liste(n)(1, i + 1) = liste(n)(1, i)
If i = 1 Then
liste(n)(0, i) = nom(0)
liste(n)(1, i) = nom(1)
End If
Else
liste(n)(0, i + 1) = nom(0)
liste(n)(1, i + 1) = nom(1)
Exit For
End If
Next i
Next h
Next n
' Transfert informations pointage sur Feuil1

Il ne reste plus qu'à reporter les informations reclassées sur la feuille Pointage (Feuil1). On va là encore utiliser 2 boucles imbriquées pour passer d'un tableau d'unité à l'autre (variable n) et balayer chacun des tableaux (au moyen de la variable j, la variable m identifiant le nombre d'éléments à reporter de chaque tableau). Pour positionner chaque élément sur la feuille cible on utilise variable h pour la première colonne de chacun des 3 blocs (initialisée à 1) et i pour la ligne (initialisée à 2) ; lorsque i a atteint 42, on change de bloc, soit on réinitialise i à 2 et on incrémente h de 5).

h = 1
i = 2
For n = 0 To 3
m = liste(n)(0, 0)
With ThisWorkbook.Worksheets("Feuil1")
For j = 1 To m
.Cells(i, h).Value = liste(n)(0, j)
.Cells(i, h + 1).Value = liste(n)(1, j)
.Cells(i, h + 3).Value = liste(n)(1, 0)
i = i + 1
If i > 42 Then
i = 2
h = h + 5
End If
Next j
End With
Next n
End Sub

Voilà. Après test sommaire, ça a l'air de fonctionner. Je m'accorde une vérification avant de te repasser le classeur (j'ai fait un punch en même temps... il vaut mieux vérifier). J'aurais préféré une solution plus modulaire (mais il m'aurait fallu réfléchir plus longtemps... difficile avec du monde chez moi et une sortie en préparation pour demain). Reste le problème de l'utilisation ultérieure de la feuille, si tu veux automatiser son expédition par mail je pense que d'autres astuciens pourront t'aider. Je ne suis pas familier de ce type de procédure et n'aurait pas le temps de m'y consacrer dans la période (la première partie m'a intéressé comme exercice utile pour me dérouiller car au bout d'un temps assez long sans en faire on perd certains réflexes). N'hésite pas à te lancer dans la fabrication de macro en commençant par modifier, adapter, enrichir celles que tu utilises, le plus gros obstacle à surmonter est de s'y mettre la première fois, ensuite en avançant pas à pas on accumule vite assez de connaissances pour être incité à poursuivre...

Bon week-end.

Afficher le profil de ferrandEnvoyer un message privé à ferrand
 Revenir en haut de la page
 ferrand  Posté le 14/10/2007 à 00:37  
Astucien

1600 Messages

RE,

http://cjoint.com/?koaEQ8szUH

Je te renvoie tout de suite le fichier avec la macro décrite (Feuil1 virginisée pour que tu puisses tester tout de suite). Je crains de ne pouvoir être disponible avant mardi ou mercredi pour m'y repencher... Fait sur Excel 2000. Vu ton dernier post : ton dernier fichier m'a paru identique au premier mais j'ai peut-être mal regardé (?)

Sur ce, bonne nuit, il est 2 h 30 passée chez moi et demain je suis censé décoller avant 8 h.

Afficher le profil de ferrandEnvoyer un message privé à ferrand
 Revenir en haut de la page
 ferrand  Posté le 14/10/2007 à 01:04  
Astucien

1600 Messages
ça y est, j'ai vu la différence. Pas de difficultés pour adapter la macro : il suffit de remplacer 2 et 42 par 4 et 44 dans la préparation de la feuille (au début) et dans le report (à la fin). Quand je disais que j'aurais préféré une organisation plus modulaire, c'est justement parce que ça facilite ce genre de modification sans avoir à chercher. Une autre solution consiste à créer des constantes en début de module pour les données de ce type susceptibles d'étre modifiées, en cas de modif. on modifie la valeur de la constante sans avoir à toucher à la macro.
Afficher le profil de ferrandEnvoyer un message privé à ferrand
 Revenir en haut de la page
 pierrotd  Posté le 14/10/2007 à 10:17  
Petit astucien

335 Messages

Bonjour à tous!

Bonjour Ferrand! Vraiment merci beaucoup pour tout ce boulot à une heure plutôt matinale; je crois que j'ai gagné le jackpot: c'est exactement que je souhaite!!!!

je viens de charger l'exemple et je crois que tout fonctionne à priori, je pousserai les tests en soirée. Maintenant et comme tu le dis si bien, il faut que je comprenne et dissèque les mécanismes de cette macro. J'ai fais un copié-collé de ton explication détaillée et j'essaie de piger en soirée. Effectivement, la pratique des macros est une "affaire" à temps plein et il faut maintenir les acquis. Galopin m'avais tenu le même discours il y a deux ans avec 'pinpon'.

Il ne reste plus, si tout fonctionne, qu'à voir l'envoi au(x) destinataire(s) par messagerie de cette feuille.

Encore un grand merci pour tout ce travail! c'est génial!

merci à tous de votre aide et de votre intérêt.

à+

Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 Revenir en haut de la page
 ferrand  Posté le 15/10/2007 à 09:03  
Astucien

1600 Messages

Bonjour,

Parfait si tu t'y retrouves. N'hésite pas à poser des questions en cas de besoin. Je reste en observation : si quelqu'un vient t'aider à automatiser l'expédition, je suis intéressé, n'ai pas encore eu à m'en servir mais ça pourrait venir, cela me ferait donc gagner du temps sur mon apprentissage...

Quand je parlais des habitudes de chacun dans l'écriture de macro VBA, si tu compares avec des macros écrites par Galopin (ou d'autres que j'ai pu observer au fil des posts) tu pourras noter des petits détails : exemple pour ta compréhension ".value" à la suite d'une expression renvoyant une cellule (ou une plage de cellule), si tu l'enlèves cela ne change rien car il s'agit de la propriété par défaut de l'objet range (=plage), mais j'ai pris l'habitude de le mentionner dans presque tous les cas car à la lecture je mets plus de temps à interpréter la commande s'il ne figure pas ; de même "thisworkbook" (qui renvoie le classeur contenant la macro), inutile dans ce cas, mais j'ai pris l'habitude de l'utiliser à peu près systématiquement après avoir eu quelques surprises d'exécution avec plusieurs classeurs ouverts (et j'ai aussi quelques applications utilisant simultanément plusieurs classeurs, dans ce cas c'est plus sûr). Tout ça pour te dire, en m'excusant d'avoir été long, qu'il est important pour accrocher de comprendre comment ça fonctionne, et dans les cas où ça devrait mais ça ne fonctionne pas retrouver pourquoi et comment (ce qui relève parfois de l'enquête policière...) t'apprend une foule de choses (bien plus que tu n'en recherchais).

Bonne continuation.

Afficher le profil de ferrandEnvoyer un message privé à ferrand
 Revenir en haut de la page
 gilbert_rgi  Posté le 15/10/2007 à 10:45  
Petit astucien


842 Messages

Bonjour

Enregistrez le fichier sur votre disque dur

Dans le code et dans le module RGI modifier le chemin d'accés à outlookexpress

il y a en racine "I"normalement chez vous c'est "C"

fichier ici

pour l'envoi le fichier est renommé "résultat" les 3 premières feuilles sont supprimées le fichier est envoyé à l'adresse se trouvant sur la feuille email



Modifié par gilbert_rgi le 15/10/2007 10:50
Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 pierrotd  Posté le 15/10/2007 à 15:05  
Petit astucien

335 Messages

Bonjour à tous, bonjour gilbert_rgi,

Merci beaucoup de votre aide. Ferrand me propose une solution interessante et qui fonctionne sauf, que pour le forum, j'avais changé les noms des onglets et que maintenant, en adaptant sa macro au vrai fichier à mon travail, ça plante .

Je vais donc vous proposer le fichier réel (il faut que je "recolle" les morceaux et j'ai 4 mains gauches).

Quant à l'envoi par outlook, j'ai appliquer vos conseils. Cela semble également bien fonctionner. Seulement, je souhaiterais que ce soit seulement la 'feuil' qui soit envoyée (fichier-> envoyer vers-> destinataire-> envoyer la feuille active en tant que corps de message ) et non un nouveau classeur 'résultat' en pièce jointe. Mais votre solution fait grandement avancer mon problème.

Merci beaucoup de votre aide.

à +



Modifié par pierrotd le 15/10/2007 15:06
Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 Revenir en haut de la page
 gilbert_rgi  Posté le 15/10/2007 à 15:30  
Petit astucien


842 Messages

Slt

pierrotd
  1. Quant à l'envoi par outlook, j'ai appliquer vos conseils. Cela semble également bien fonctionner. Seulement, je souhaiterais que ce soit seulement la 'feuil' qui soit envoyée (fichier-> envoyer vers-> destinataire-> envoyer la feuille active en tant que corps de message ) et non un nouveau classeur 'résultat' en pièce jointe. Mais votre solution fait grandement avancer mon problème.

Dans le fichier que j'ai envoyé j'ai repris le travail de Ferrand (voir le nom des modules dans le VBE) et j'ai seulement ajouté ce que j' ai marqué CaD :

le fichier est renommé "résultat" les 3 premières feuilles sont supprimées le fichier est envoyé à l'adresse se trouvant sur la feuille email

On ne peut pas envoyer uniquement la feuille (je ne sais pas serait mieux) il serait peut_être possible soit de faire une image soit de faire un .pdf mais ensuite il faut l'envoyer ;-((((( ?????

donc pour régler (solutionner) le problème je créé à partir de la feuil1 et feuille Email un nouveau fichier "résultat" que j'envoie .

je pourrais aussi supprimer la feuille email qui ne sert que pour avoir l'adresse du destinataire !!!!

si déjà le fichier ainsi fait s'envoie avec votre matériel c'est déjà un grand pas de fait

Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 gilbert_rgi  Posté le 15/10/2007 à 15:37  
Petit astucien


842 Messages

Slt

si vous avez renommer les feuilles il faut trouver une solution pour ça

With ThisWorkbook.Worksheets("PERS" & n)

et là sans info c'est pas facile

Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 pierrotd  Posté le 15/10/2007 à 15:40  
Petit astucien

335 Messages

re Bonjour à tous, Bonjour Ferrand,

Après lecture de vos explications, j'avoue être vraiment nul en VBA et ne pas comprendre comment faire des modifs. En effet, pour les besoins de l'exercice, j'avais modifié les noms des onglets et les libellés dans les 4 premières feuilles. Quand j'ai voulu adapter votre macro au fichier original, évidemment, ça plante.

Sinon, je confirme que votre fichier exemple fonctionne bien. Juste un point: après le lancement de la macro 'pointage', si on revient sur les onglets 'pers1', on ne peut plus annuler une opération (flèche arrière)

Je vous joins donc le fichier original (onglets: OFF, SOFF, MDRE, CIVIL ) auquel donc, je suis autorisé à seulement rajouter mes feuilles supplémentaires et un bouton de macro sur la feuille 'OFF'.

http://cjoint.com/?kppC3stpIR

Je pense que vous aviez compris que c'était pour mon travail ou je suis (entre autre) responsable de l'évacuation des personnels en cas de sinistre.

J'ai essayer d'enregistrer une macro pour envoyer par outlook express 6 la feuil1, mais sans succès mais , après essai, Gilbert_RGI aurait trouvé la solution auquelle je propose quelques aménagements.

Comme expliqué en fin de mon post original, et si cela est possible sans trop compliquer la chose, je souhaiterais que, dans la 'feuil1' (renommée pointage évacuation EAA609), le nom de l'unité soit remplacé par le service réel ou la personne est affectée ( onglet 'services noms' que je mets à jour et que je renvoie au bureau du personnel) Si le personnel n'est pas trouvé dans la feuille 'services noms', laisser l'unité.

C n'est jamais facile d'exprimer les manips que l'on a en tête

Merci sincèrement de votre aide en espérant ne pas être trop exigeant.

à +

Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 Revenir en haut de la page
 gilbert_rgi  Posté le 15/10/2007 à 15:51  
Petit astucien


842 Messages

Slt

ça peut s'arranger comme ceci

For n = 0 To 3
nfeuil = Array("PERS1", "PERS2", "PERS3", "PERS4")
With ThisWorkbook.Worksheets(nfeuil(n))

et dans array vous placez le nom de vos feuilles et voilà

attention au "FOR" il a changé aussi

Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 gilbert_rgi  Posté le 15/10/2007 à 16:08  
Petit astucien


842 Messages

Slt

Voilà pour les noms de feuilles

ici

Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 gilbert_rgi  Posté le 15/10/2007 à 16:13  
Petit astucien


842 Messages
Pierrotd dit :
  1. Sinon, je confirme que votre fichier exemple fonctionne bien. Juste un point: après le lancement de la macro 'pointage', si on revient sur les onglets 'pers1', on ne peut plus annuler une opération (flèche arrière)

normal c'est fait par une macro !!!!
Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 gilbert_rgi  Posté le 15/10/2007 à 16:35  
Petit astucien


842 Messages

Voilà pour le reste

ICI

Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 pierrotd  Posté le 15/10/2007 à 16:39  
Petit astucien

335 Messages
gilbert_rgi a écrit :

Slt

Voilà pour les noms de feuilles

ici

re,

Merci beaucoup. J'ai un peu de mal à suivre le fil. Il faut que je décortique tout ça. Chez moi, j'arrive à envoyer une feuille seule. J'active l'enregistreur de macro, mais il n'y a rien dedans. Comment fait-on pour insérer morceau de macro dans une macro existante?

merci de votre aide.

à +

Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 Revenir en haut de la page
 gilbert_rgi  Posté le 15/10/2007 à 16:42  
Petit astucien


842 Messages

oui chez vous il n'y avait qu'une seule adresse

dans le nouveau fichier toutes les adresses présentes et futures dans la colonne A seront prises en compte

Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 gilbert_rgi  Posté le 15/10/2007 à 16:46  
Petit astucien


842 Messages
Pierrotd
  1. J'active l'enregistreur de macro, mais il n'y a rien dedans. Comment fait-on pour insérer morceau de macro dans une macro existante?

il faut soit frapper du code

soit faire du copier / coller (oups)



Modifié par gilbert_rgi le 15/10/2007 16:49
Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 pierrotd  Posté le 15/10/2007 à 16:48  
Petit astucien

335 Messages

Re,

j'arrive à m' envoyer la feuille seule 'pointage évacuation EAA609' en tant que corps de message.

à +

Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 Revenir en haut de la page
 gilbert_rgi  Posté le 15/10/2007 à 16:51  
Petit astucien


842 Messages

oui c'est que je fais faire au code

Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 ferrand  Posté le 15/10/2007 à 18:15  
Astucien

1600 Messages

Re, j'ai pas lu encore tout ce qui a été écrit depuis mon dernier passage. Récupéré ton dernier fichier : vu sommairement, il y a déjà une zone sans nom d'unité sur feuille SOFF (lignes 27 à 49) qui entrainera des erreurs (pas dans la macro, il seront assimilés à GAT). Evidemment, si tes noms de feuilles ne sont plus de la forme PERSn, il faut introduire un tableau de noms comme j'ai aperçu que le suggérai Gilbert_rgi ensuite.

Mais je m'apprête à préparer repas, pour moi (pas grave) et ma fille (délai plus contraignant), donc je lirais la suite après. A plus tard.

Afficher le profil de ferrandEnvoyer un message privé à ferrand
 Revenir en haut de la page
 pierrotd  Posté le 15/10/2007 à 19:06  
Petit astucien

335 Messages

Bonsoir Ferrand,

oups! j'avais pas vu, cette zone est GEMA

à +

Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 Revenir en haut de la page
 ferrand  Posté le 15/10/2007 à 20:45  
Astucien

1600 Messages

Re,

Je reviens entre la fin du repas et le café. Pour le pb des noms de feuilles, voilà ce que j'avais rectifié sur le fichier que j'avais regardé avant le repas :

(...)

' Recueil des informations
nom = Array("OFF", "SOFF", "MDRE", "CIVIL")
For n = 0 To 3
With ThisWorkbook.Worksheets(nom(n))

(...)

' Transfert informations pointage sur Feuil1
h = 1
i = 2
For n = 0 To 3
m = liste(n)(0, 0)
With ThisWorkbook.Worksheets("pointage évacuation EAA609")

(...)

Lignes en rouge modifiées, ligne en bleu ajoutée. Tout à fait identique à la correction effectuée par gilbert_rgi.

Une remarque cependant, en utilisant la variable nom j'utilise une variable déjà déclarée. Je répugne toujours à utiliser une variable non déclarée car cela risque de réserver des surprises si le même est utilisé ailleurs et quand une appli a plusieurs intervenants, évolue, on ne peut jamais tout maîtriser... Je suggérerai donc si tu conserves la variable nfeuil de l'inclure dans la déclaration de variables au début de la macro : tu peux l'ajouter après
Dim liste, nom, nfeuil
[NB: tu peux aussi basculer la ligne concernée avant le début de la boucle (For...), le résultat serait le même mais c'est plus logique d'affecter le tableau de noms à la variable une seule fois avant plutôt que de le répéter à chaque tour]

Pour ton information, une variable non déclarée est toujours de type Variant, une variable déclarée dont le type n'est pas précisé est aussi de type Variant, la fonction Array renvoie un tableau d'éléments (éléments qui figurent dans la parenthèse comme arguments de la fonction), on peut affecter un tableau à une variable de type Variant [nomvariable=Array(........)] ce qui est pratique pour appeler chaque élément succesivement avec une boucle dont le compteur s'incrémente de 1 à chaque tour (lorsque tu écris: For x=1 to 6 par ex., x est appelée variable compteur qui va prendre successivement les valeurs de 1 à 6 à chaque exécution de la boucle), la numérotation des éléments dans un tableau démarre à 0 par défaut (hors déclaration d'une numérotation différente, ce qui est le cas lorsqu'on insère un tableau dans une variable, ce qui t'explique qu'on doive paramétrer le compteur de boucle de 0 à 3 au lieu de 1 à 4 dans notre cas).

Pour écrire ou modifier une macro, tu vas dans l'éditeur VBA : soit par la commande Outils >> Macro >> Visual Basic Editor, soit en faisant Alt+F11, soit en intégrant l'icône Visual Basic dans ta barre d'outils (en personnalisant une barre d'outils affichée habituellement) ce qui te permet d'y accéder simplement en cliquant dessus. Dans l'éditeur, tu recherches le module contenant la macro que tu veux modifier et tu l'ouvres.

J'ai l'impression de peut-être ânonner, je m'en excuse mais j'ai eu l'impression que ce qui paraissait évident à gilbert_rgi t'était peut-être tout à fait étranger. Et puis je me souviens qu'au tout début en ce qui me concerne il m'est arrivé de galérer pour "découvrir" des manipulations tellement évidentes qu'on ne les trouvait même pas dans les livres ou revues fournissant des explications...

Pour revenir à ton fichier, la petite anomalie que j'ai soulevé tout à l'heure me paraît en fait la plus préoccupante pour une stabilité dans le temps de la procédure. En effet, l'unité (je suppose qu'il s'agit bien de DIR, BVD, GAT, GEMA) se trouve en colonne L dans des cellules fusionnées, je ne l'ai pas trouvée ailleurs. Si c'est fait manuellement, il convient d'être sûr que cela peut l'être sans erreur (sinon, erreurs dans ta feuille de pointage dans l'affectation de l'unité, et même si cela se produit sur le premier nom de la première feuille les noms avant qu'apparaisse une unité valide disparaîtront de ta feuille de pointage, avec la macro telle qu'elle est, sans déclencher d'erreur d'exécution). Si c'est fait automatiquement (je n'ai pas analysé le reste de ton appli), je ne m'explique pas pourquoi il y aurait un loupé dans le dernier fichier que tu as transmis. La question que je pose est donc de savoir si elle ne figure qu'en colonne L, comment elle est insérée, s'il y a une autre méthode (plus fiable) pour la déterminer.

Pour le reste, j'espère que la procédure de gilbert_rgi répondra à ton attente, j'enregistre pour étudier à tête reposée (pour mon propre apprentissage).

Afficher le profil de ferrandEnvoyer un message privé à ferrand
 Revenir en haut de la page
 gilbert_rgi  Posté le 15/10/2007 à 21:04  
Petit astucien


842 Messages

Bonjour Ferrand

Ferrand dit :
  1. j'ai eu l'impression que ce qui paraissait évident à gilbert_rgi t'était peut-être tout à fait étranger

Tout à fait exacte je pensais que Pierrotd connaissait déjà un peu les macros ayant cité les travaux déjà entrepris par Galopin sur ce fichier

j'en suis désolé. j'essayerai de mieux expliquer la prochaine fois

Salutations

RGI

Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 pierrotd  Posté le 15/10/2007 à 22:27  
Petit astucien

335 Messages

bonsoir à tous!

C'est vrai que j'aurais dû appronfondir et persévérer après toute l'aide et les explications fournies par Galopin. J'espère au moins que toutes vos explications, vous les connaisseurs, servent au plus grand nombre des gens comme moi qui ont bien des idées mais qui ne savent pas faire.

Bon ceci dit, j'ai corriger les erreurs de données de ma part dans la dernière mouture de Gilbert_rgi : http://cjoint.com/?kpwyPi5DXX . Promis, demain je reprends le fil, mais c'est pas gagné

Merci encore beaucoup de votre aide et de votre patience.

à +

Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 Revenir en haut de la page
 gilbert_rgi  Posté le 16/10/2007 à 08:41  
Petit astucien


842 Messages

Bonjour

Pourquoi dans le VBE le module RGI est-il scratché à chaque fois ?

Cdlt

RGI

Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 pierrotd  Posté le 16/10/2007 à 09:46  
Petit astucien

335 Messages

Bonjour à tous, bonjour Gilbert_rgi,

Effectivement, le module RGI n'est plus dans la dernière mouture et il y a le module Ferrand

Désolé, mais je comprends pas tout ! Je dois m'absenter et je reprends le fil en soirée.

merci et à +

Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 Revenir en haut de la page
 gilbert_rgi  Posté le 16/10/2007 à 10:14  
Petit astucien


842 Messages

En plus l'appel de ma macro à partir de celle de Ferrand a été supprimé ????

c'est zarbi cette histoire

Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgiEnvoyer un message privé à gilbert_rgi
 Revenir en haut de la page
 pierrotd  Posté le 16/10/2007 à 11:44  
Petit astucien

335 Messages

Re,

Effectivement, au fil des différentes moutures de vous et de Ferrand, je ne comprends pas non plus; j'avais zippé au fur et à mesure, je recherche donc cet aprèm.

voilà j'ai retrouvé, je crois, la chronologie des fichiers modifiés par vos soins : http://cjoint.com/?kqozQSrysB et je reprends les codes.

Cordialement,

à +



Modifié par pierrotd le 16/10/2007 14:28
Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 Revenir en haut de la page
 pierrotd  Posté le 17/10/2007 à 09:08  
Petit astucien

335 Messages

Bonjour à tous

J'ai donc repris les versions successives ( voir c-joint ci-dessus) de mon fichier et recopié les macros, mais ça ne fonctionne pas .

je persévère quand même§

merci de votre aide.

à +

Afficher le profil de pierrotdEnvoyer un message privé à pierrotd
 Revenir en haut de la page
 gilbert_rgi  Posté le 17/10/2007 à 09:29  
Petit astucien


842 Messages

Bonjour

Voilà la dernière mouture qui fonctionne chez moi

les modules sont renommés

les variables déclarées

la déclaration de tableau remise au dessus du For

j'ai egalement changé la racine pour avoir outlook express

Cliquez ICI

et ne plus utiliser les autres versions ou même les supprimer

Afficher le profil de gilbert_rgi Voir la configuration de gilbert_rgi