VBA : Saisir formules renvoyant vers d'autres feuilles

Fermé
xuorel Messages postés 254 Date d'inscription samedi 24 novembre 2012 Statut Membre Dernière intervention 11 mai 2023 - 25 juil. 2014 à 14:25
xuorel Messages postés 254 Date d'inscription samedi 24 novembre 2012 Statut Membre Dernière intervention 11 mai 2023 - 28 juil. 2014 à 23:10
Bonjour,

voici ma problématiques

je dispose d'un fichier excel représentant le suivi des heures des salariés sur chantier sur plusieurs mois.

Le suivi se fait sur un tableau mensuel :
- en colonne A le nom des slariés
- en colonne B le totale des heures du mois pour chaque salarié (somme de la ligne)
- ensuite chaque colonne est une journée.

Chaque moi est stocké dans une feuille différente.

J'ai stocké chaque feuille de mon fichier dans un tableau en VBA

tWs () as worksheet

J'ai une première feuille qui s'appelle "Synthèse". Son but est de reprendre pour chaque salarié, le total des heures du chantier. Donc le total pour chaque salarié, de la case lui correspondant dans la deuxième colonne de chaque élement du tableau tWs.

Je pas que la valeur arrive dans la case, mais que la formule soit visible.

Pourriez-vous m'aider sur le codage de la création de cette formule. Je suppose qu'il faut utiliser la Range("Synthèse").formula ou quelque chose de similaire. Mais comme jeux veux que ce soit les formules qui attérissent dans les cases je ne sais pas trop comment m'en sortir.

Merci

14 réponses

Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 1 426
25 juil. 2014 à 23:21
Bonjour,
J'ai stocké chaque feuille de mon fichier dans un tableau en VBA....
Que doit-on comprendre... ?
Pas simple de déchiffrer... le mélange entre VBA et des formules ...!
Pouvez-vous reformuler la question.... ?

0
xuorel Messages postés 254 Date d'inscription samedi 24 novembre 2012 Statut Membre Dernière intervention 11 mai 2023
25 juil. 2014 à 23:36
mon fichier sert à suivre les heures des ouvriers d'une société qu'ils effectuent sur un chantier donné.

Pour cela je créer une feuille par mois, contenant une grille ou je note les heures. La colonne B fait la somme dans chaque feuille des heures du mois de chaque salarié.

Comme le nombre de mois d'un chantier est variable, pour créer et gérer mes mois je passe par un tableau
dim Tmois () as worksheet

Par ailleurs, j'ai une feuille "synthèse qui reprend la liste des ouvrier et fait la somme de leurs heures pour chaque mois.

j'aimerais automatiser ce calcul.

Ma contrainte, je ne veux pas que ce soit la valeur de la somme qui arrive dans chaque case (par exemple 143h pour Monsieur X).
je veux que la formule apparaissent, comme si j'avais fait à la main dans la base B3 de la feuille Synthèse, la somme de la case B3 des autres feuilles.
(quelque chose du style B3 = 'mois1'!B3+'mois2'!B3 etc

j'espère que j'ai été plus clair
0
Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 1 426
25 juil. 2014 à 23:53
Bonjour,
Merci pour les informations.
Pour aider à la compréhension, ne serait-il pas plus simple d'avoir un extrait de votre fichier avec les notes directement sur la feuille... ? Le mettre sur https://www.cjoint.com/ et poster le lien dans cette discussion !

0
xuorel Messages postés 254 Date d'inscription samedi 24 novembre 2012 Statut Membre Dernière intervention 11 mai 2023
Modifié par xuorel le 26/07/2014 à 11:06
voici : https://www.cjoint.com/?DGAlfgkeZQ8

ce fichier est le que mon client m'a soumis. Il à lui même créé chaque mois un par un. Et dans la feuille SYNTHESE, dans la colonne B il à lui même fait toutes les sommes à la main.

Pour lui éviter ce travail lourd dans le temps (quand il faudra ajouter les mois nouveaux au fur et a mesure), j'ai déjà automatisé la création de tous les mois (avec du code plus ou moins optimal, mais ca marche bien). Je me suis basé sur la création de 12 mois pour un chantier (mon client m'a dit que ça n'allait jamais au dela).

L'objet de notre échange concerne donc la manière de compléter les cases B7:B23 de la feuille Synthèse (qui est pour chaque case la somme de cette même case sur les autres feuilles)

Comme je le disais précédemment, je ne veux pas que les calcul se fassent de manière invisible au travers du code et que les cases ne récupère que le montant d'heures totales. Je veux qu'il final, les cases de la colonne B fassent apparaître les formules comme c'est le cas pour l'instant.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Iama Messages postés 319 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 27 mars 2020 14
26 juil. 2014 à 13:03
bonjour xuorel

As-tu pensé à l'enregistreur de macro qui dans ce cas devrait de donner des idées pour compléter ta macro?

Cordialement
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
26 juil. 2014 à 13:51
Bonjour,

Et si tu donnais suite à tes autres questions ?
Comme ici : https://forums.commentcamarche.net/forum/affich-30555713-vba-probleme-avec-la-methode-range-find

eric
0
Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 1 426
26 juil. 2014 à 22:56
Bonjour xuorel,
J'ai regardé le fichier, concernant : manière de compléter les cases B7:B23 de la feuille Synthèse
Vous le faite une fois et c'est tout. De cette manière :
Pour chaque feuille mensuelle vous nommez la plage [B9 :B26] par exemple pour janvier 2014 : [cumul_janvier] pour février [cumul_fevrier] etc. jusqu'à, décembre.
Dans la feuille synthèse sélectionnez la plage [B9 :B26] et entrer la formule :
=cumul_janvier+cumul_fevrier+.......+cumul_decembre 
et vous valider comme formule matricielle : par Ctrl+Shift+Enter
Pour l'année suivante vous copier le classeur et vous changer uniquement l'année des noms des feuilles et c'est tout.
Pas besoin de procédure VBA.
Note : la remarque d'eriiic est très pertinente .... (amicales salutations à toi eriiic)

0
xuorel Messages postés 254 Date d'inscription samedi 24 novembre 2012 Statut Membre Dernière intervention 11 mai 2023
27 juil. 2014 à 00:40
Merci pingouin pour votre piste.
Cependant certaines contraintes me poussent à prendre du recul sur votre proposition :

- le fait que les feuilles correspondent au 12 mois de 2014 est un hasard pour l'exemple. Dans les faites les chantiers ont une durée variable, et le temps passant, ils vont progressivement avancer sur 201. Mon idée est donc de demander à l'utilisateur le mosi de début du chantier, et de créer de manière automatique 12 mois à partir de la.

- De même le nombre d'ouvriers sur un chantier est variable. Au moment de la création du chantier, je compte donc demander à l'utilisateur de valider une liste sur une feuille ad'hoc. Les mois se completeront alors automatiquement avec cette liste d'ouvrier.

Dans l'idée de tout automatiser, je pense ne pas avoir d'autre choix que de recourir au VBA.

Dans cette optique, pourriez-vous me dire comment utiliser en VBA les formules matricielles ?

merci
0
Iama Messages postés 319 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 27 mars 2020 14
27 juil. 2014 à 12:45
Rebonjour xuorel

Bien que apparemment, tu as négliger la piste que je te conseillai,
je te propose de tester ceci:

Private Sub Charger_Formule()
'Réalisation de la formule de cumul

Dim caL As String
Dim f As Worksheet
Dim nB As Single 'nombre de noms

Sheets("SYNTHESE").Select
nB = Cells(9, 1).End(xlDown).Row

Cells(9, 2).Select ' Première cellule des cumuls
caL = "="
For Each f In ActiveWorkbook.Sheets
If f.Name <> "SYNTHESE" Then
caL = caL & "+'" & f.Name & "'!RC"
End If
Next f

ActiveCell.FormulaR1C1 = caL
Selection.AutoFill Destination:=Range(Cells(9, 2), Cells(nB, 2)), Type:=xlFillDefault
End Sub
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
27 juil. 2014 à 13:52
Bonjour à tous

Excusez l'incrust,

Je voulais simplement rappeler d'Excel met à disposition une commande parfaitement adaptée à ce problème et relativement simple à mettre en oeuvre (et sans VBA) : La Consolidation des données.
0
Iama Messages postés 319 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 27 mars 2020 14
28 juil. 2014 à 08:53
Bonjours Patrice
Je n'ai pour m'a part jamais utilisé cette commande.
As-tu des précisions que je potasse?
Cordialement
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
Modifié par Patrice33740 le 28/07/2014 à 19:27
0
Iama Messages postés 319 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 27 mars 2020 14
28 juil. 2014 à 19:39
Re,
Merci c'est simple et clair
0
Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 1 426
27 juil. 2014 à 14:38
Bonjour xuorel,
Ma proposition est indépendante des mois effectifs mentionnés dans l'onglet des feuilles ce qui veut dire que vous commencez au mois que vous voulez. Concernant le nombre de personnes par projet, elle est valable de 1 à 17 personnes sans modification si que 4 personnes vous aurez les totaux et les autres seront [0].pour ces)
Avez-vous simplement essayé la proposition ..... ?

0
xuorel Messages postés 254 Date d'inscription samedi 24 novembre 2012 Statut Membre Dernière intervention 11 mai 2023
27 juil. 2014 à 17:39
Pingou,

peux tu préciser ton propos lorsque tu dis "Ma proposition est indépendante des mois effectifs mentionnés dans l'onglet des feuilles ce qui veut dire que vous commencez au mois que vous voulez. " ?

merci
0
Le Pingou Messages postés 12045 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 25 avril 2024 1 426
27 juil. 2014 à 22:16
Bonjour,
Eh bien je ne vais pas imposer une solution qui visiblement, selon vos réponses, vous n'avez pas essayé.
Désolé, je quitte le poste.
Salutations.
Le Pingou
0
xuorel Messages postés 254 Date d'inscription samedi 24 novembre 2012 Statut Membre Dernière intervention 11 mai 2023
28 juil. 2014 à 23:10
je pense qu'il y a eu un quiproquo sur mes propos. Je te remercie tout de même pour tes conseils qui ont été constructifs pour moi quoi tu tu en penses
0
xuorel Messages postés 254 Date d'inscription samedi 24 novembre 2012 Statut Membre Dernière intervention 11 mai 2023
Modifié par xuorel le 27/07/2014 à 17:44
Iama, deux remarques :

- dans la ligne suivante
caL = caL & "+'" & f.Name & "'!RC"
à quoi sert le "RC" en fin de ligne ?

- dans ton autofill
Selection.AutoFill Destination:=Range(Cells(9, 2), Cells(nB, 2)), Type:=xlFillDefault

n'est-ce pas plutôt ceci qu'il faudrait mettre
Selection.AutoFill Destination:=Range(Cells(9, 2), Cells(nB+9, 2)), Type:=xlFillDefault
0
Iama Messages postés 319 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 27 mars 2020 14
27 juil. 2014 à 20:15
Bonjour xurer

La première ligne RC représente "Row-Column".
Dans ce cas Excel utilise la référence relative de la cellule par rapport à la cellule d'origine
(cellule A9 dans notre cas).

Il faut comprendre R[0]C[0]. =>zéro déplacement en ligne et en colonne.
Je fait donc réfernec de la cellule A9 d'une autre feuille (f.Name).

Dans l'autofill
la valeur de nB utilisé est obtenu avec le fonction :Cells(9, 1).End(xlDown).Row.

Je part toujours de ma cellule de référence A9 et je vais chercher la dernière ligne de la liste des noms. (ici 25 puisque la 26éme est vide).

Est-ce assez clair?
Si tu as d'autre question, n'hésite pas

cordialement
0
Iama Messages postés 319 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 27 mars 2020 14
27 juil. 2014 à 20:17
erratum
(cellule B9 dans notre cas).
0
Iama Messages postés 319 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 27 mars 2020 14
27 juil. 2014 à 20:19
Je fait donc référence à la cellule B9 d'une autre feuille (f.Name).
0
xuorel Messages postés 254 Date d'inscription samedi 24 novembre 2012 Statut Membre Dernière intervention 11 mai 2023
28 juil. 2014 à 00:15
Donc si tu mets RC sans nombre avec, ca sous entent R[0]C[0] ? Un truc que j'apprends merci.
0
Iama Messages postés 319 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 27 mars 2020 14
28 juil. 2014 à 08:49
En fait ce n'est pas moi, c'est l'enregistreur de macro.
Je n'ai fais que modifier le code qu'il à enregistrés, personnellement je l'ai aurai mis si j'avais.
0
xuorel Messages postés 254 Date d'inscription samedi 24 novembre 2012 Statut Membre Dernière intervention 11 mai 2023
Modifié par xuorel le 28/07/2014 à 00:19
Comment on déclare des formules matricielles en VBA (faire l'équivalent de ctrl+maj+entrer) ? Est-ce bien en utilisant formulaarray ?
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
28 juil. 2014 à 14:06
Bonjour

Il faut utiliser la fonction Evaluate

Mais comme tu ne sais pas dire " merci pour le temps passé" quelque soit la pertinence d'une proposition de solution voir par exemple
https://forums.commentcamarche.net/forum/affich-30555713-vba-probleme-avec-la-methode-range-find#p30565329

Cherche par toi-m^me dans la documentation
0