Rentrer formule selon lignes variables

Bonjour à toutes et tous !

Je viens demander de l'aide ici car notre prof explique comme une merde...

Dans notre exo, on doit insérer la formule sous.total, pour une plage de donnée qui va se déplacer en fonction d'une autre.

Explication :

La formule "=sous.total(9;... " ou "=SUBTOTAL(9,..." doit s'adapter en fonction de deux critères :

- Le premier : la somme doit être calculé à partir d'un tableau. L'emplacement de ce tableau va varier en fonction d'une autre macro qui va remplir le tableau (Libellé7 et Libellé8) dont les lignes peuvent varier. Une autre macro va s'exécuter, pour transférer un tableau d'une autre page excel, 2 lignes en dessous du tableau (Libellé 7 et Libellé 8).

- Deuxième critère : Une fois le tableau transféré sous le tableau (libellé 7 et Libellé 8) dont les lignes peuvent varier, je dois exécuter par une macro, la formule sous.total(9, pour faire la somme de la colonne G, jusqu'à la dernière ligne du tableau que l'on vient de transférer. Le nombre de lignes de ce nouveau tableau peut également varier.

Je vous transmet mon fichier excel, avec ébauche de code VBA... Je galère un peu.

A bientôt,

Bigboo

Salut Bigboo,

Je pense que de manquer de respect à ton prof ne va pas faire avancer le schmilblick, ceci d’autant plus que tu as autant – si ce n’est plus – de peine que lui à expliquer ton problème.

Tu ne fais pas référence aux objets Excel, il est donc extrêmement compliqué de te comprendre. Par exemple, ne dis pas :

« L'emplacement de ce tableau va varier en fonction d'une autre macro qui va remplir le tableau (Libellé7 et Libellé8) », mais dit : « le tableau se trouve dans la plage XX333:YY444 ».

Surtout que tu as déjà deux tableaux sur ta feuille et que tu as un tableau qui s’ajoute par macro (la macro que je t’ai fournie sur un précédent fil) ; on ne sait donc plus très bien où l’on nage.

Ensuite, si tu donnes un exemple du résultat désiré, ce serait également plus facile. Si tu dis par exemple : « Selon l’exemple ci-joint – qui montre mon fichier après le déroulement de la macro ZZZZ – je voudrais avoir le sous-total de la plage UU1:VV2 dans la cellule I5».

A te relire.

Très bien, je vais expliquer les choses autrement. Un instant. Si je n'ai pas joint le fichier que tu m'as envoyé, c'est parce que j'y ai apporté des modifications, et que j'ai déjà une dizaine d'autres macros d'enregistré. C'est plus par soucis de simplicité si je fais ça.

S’il te plait, n’écris un message que lorsqu’il est complet, nous sommes sur un Forum, non pas sur un IPhone.

Si tu écris des petits bouts de messages par-ci, par-là, je risque de ne pas être informé correctement que tu as placé une réponse.

Je reçois effectivement une info par courriel que tu as placé un message qu’une fois par fois que je me connecte. Si tu écris 2, 3 ou plus de messages alors que je suis déjà connecté ou déjà déconnecté, je ne sais pas exactement comment j’en suis informé.

Là je vais partir au lit. Si tu m’envoies de nouvelles réponses, je ne les verrai que demain.

Bonne nuit.

Me revoilà..

J'ai modifié mon fichier pour être beaucoup plus explicite.

Dans mon fichier, les cellules que je dois adapter ont un fond bleu ou jaune. Ce sont ces différentes formules que je dois rendre plus flexibles.

Les contraintes de mon exercice d'entraînement :

  • Mon tableau rouge est un tableau dont les lignes peuvent varier.
  • Grâce à Yvouille, j'arrive maintenant à insérer le tableau vert sous le tableau encadré de rouge, avec 2 lignes vides d'écart entre les deux tableaux.
  • Une fois cette insertion du tableau vert sous le tableau encadré de rouge effectuée, mes formules sur fond bleu, orange ou jaune doivent adapter leur plage de calcul.

- Pour les formules sur fond jaune, je ne dois prendre en compte que le tableau vert, sous contrainte que la ligne de départ de ce tableau vert (ligne 12 ici) peut parfois changer en fonction du nombre de lignes du tableau encadré de rouge.

Exemple formule en B2 :

=SOMME.SI(A13:A30000;"Commandes prévues";G13:G30000)

J'ai demandé à cette formule de commencer sa somme à partir de la ligne 13, jusqu'à la fin du tableau (ici ligne 30000...), en colonne G, pour toutes les "Commandes prévues".

Je cherche à rendre cette formule plus flexible : je ne dois prendre en compte que les données du tableau vert, ou dit autrement, exclure toutes les valeurs au dessus du tableau vert, avec toujours la même contrainte : les lignes du tableau encadré en rouge sont variables.

- Pour les formules sur fond bleu : En colonne B, j'ai mes formules. En A, les types d'objets. Si la cellule en colonne A n'est pas vide (ici, de A5 à A9), j'exécute ma formule. Si la cellule en colonne A (ici, de A5 à A9) est vide, je n'exécute pas de formule.

Pour le cas où la cellule n'est pas vide, j'exécute la formule suivante (exemple pour formule B5) : =SOMME.SI.ENS(G13:G3000;A13:A3000;"Commandes prévues";E13:E3000;"chaussures").

==> La plage de recherche G13:G3000 a pour contrainte de ne prendre que les données du tableau vert, sachant que le nombre de lignes du tableau encadré en rouge peut varier. La plage doit aller du début à la fin du tableau vert.

=> La plage de recherche A13:A3000 a pour contrainte de ne prendre que les données du tableau vert, sachant que le nombre de lignes du tableau encadré en rouge peut varier. La plage doit aller du début à la fin du tableau vert.

==> La plage de recherche E13:E3000 a pour contrainte de ne prendre que les données du tableau vert, sachant que le nombre de lignes du tableau encadré en rouge peut varier. La plage doit aller du début à la fin du tableau vert.

==> Le critère de recherche "Commandes prévues" n'est autre que ce qui est inscrit en cellule B4.

==> Le critère de recherche "chaussures" correspond à ce qui est inscrit dans la cellule A5.

- Pour la formule sur fond orange, la plage de recherche a pour contrainte de ne prendre que les données du tableau vert, colonne G, sachant que le nombre de lignes du tableau encadré en rouge peut varier. La plage doit aller du début à la fin du tableau vert.

Cette formule =SOUS.TOTAL(9;G:G) permet de faire un sous total, en fonction du filtre que je vais appliquer à mon tableau vert.

Cette formule peut s'inscrire en G11 comme en I5.

Voici mon code qui fonctionne, mais avec une plage grossière :

Sub Macro_soustotal9()
'
' Macro_soustotal9 Macro
'

    Application.ScreenUpdating = False

    Range("I5").Select
    Range("I5").Formula = "=SUBTOTAL(9,C[-2])"

End Sub

Comme on peut le voir dans ce code, je prends en compte TOUTE la colonne G (C[- 2] à partir de la cellule "I5"). L'idéal serait de ne prendre que la plage du tableau vert, sachant que les lignes du tableau encadré en rouge peut varier.

Optionnel : macro pour appliquer la démarche "Données", "Filtrer" uniquement à mon tableau VERT. Sinon, j'ai une solution alternative.

J'espère avoir été le plus clair possible. Je ne sais pas si ce que je souhaite faire est possible. Mes connaissances en VBA sont pour l'instant limitées (3h de cours), donc veuillez excuser mon manque de précision dans mes explications... J'ai utilisé des plages de couleur pour être plus explicite (cf. Yvouille). Je vous remercie par avance pour votre aide.

Il aurait mieux valu que tu donnes l'énoncé original plutôt que traduit par toi !

Ton histoire de déplacement de tableau et des traitements ultérieurs me paraît enrobée d'un flou (pas très d'ailleurs !) artistique. Il me semble d'ailleurs que pour cette affaire tu aies fait travailler deux personnes séparément... si c'est bien le cas, je n'apprécie pas (du tout même !)

Ta macro pour poser une formule me paraît une absurdité, mais tes explications n'étant pas claires, il faut voir.

A propos de macro, puisque tu es en apprentissage, il serait bon de prendre des habitudes dès le départ : une macro, ça s'écrit ! Il est acceptable de faire des enregistrements pour s'assurer de la syntaxe, mais dans ce cas, ça se réécrit et le résultat final doit être assez éloigné de l'enregistrement une fois que l'on a ôté ce qui ne sert pas ou est parasite. Et le code écrit ça s'indente si tu veux pouvoir le lire ensuite sans erreur (grossière).

Pour les formules, je suppose que c'est toi qui a formulé celles qui se trouve dans le tableau rouge, autrement dit tu as écris 10 formules différentes là où une seule recopiable dans toutes les cellules concernées aurait dû suffire.

Pas de commentaire sur SOUS.TOTAL tant que l'objectif n'est pas clairement établi. Il est certain toutefois que si l'utilisations de cette fonction t'est demandée c'est en raison de ses particularités : non prise en compte lorsqu'elle est dans le champ d'un calcul opéré avec cette même fonction, pouvant varier selon filtrage en prenant ne prenant pas en compte les valeurs masquées en changeant le numéro de fonctions.

Cordialement.

Premièrement, j'apprends en ce moment à utiliser les différentes fonctions d'excel (si, est.vide, somme.si, etc...). On a un dossier à rendre avec un copain. Le projet se construit pas à pas. Lorsqu'on demande de l'aide à notre prof pour expliquer les fondamentaux du VBA, il ne nous l'explique pas, car ce n'est pas au programme. Je viens donc demander de l'aide sur ce forum. Si c'est pour se faire incendier à chacune de mes interventions, c'est pas la peine de créer ce forum.

Notre projet avance progressivement, et on essaye d'isoler nos différentes macros pour être le plus clair possible, le plus simple possible, et que vous ne fassiez pas tout le travail. J'ai en effet fait travailler deux personnes, à deux moments différents, et pour deux macros différentes. Tu pourras regarder les dates qui sont séparées d'environ 5 jours. Si j'ai heurté ta sensibilité, j'en suis désolé, mais c'était pas le but. Je demande de l'aide pour deux macro différentes, je ne vois franchement pas où est le problème !

Je suis en Licence de sc économies et Gestion, pas en école d'informatique, donc un minimum d'indulgence serait la bienvenue. je n'ai donc pas les capacités de modifier aussi facilement que vous mes macros. J'enregistre des macros, j'essaye des trucs, et je vois ce qui se passe.

L'objectif de la formule sous.total est de faire une somme sous.total, en fonction des filtres que j'applique à mon tableau.

Après, si ça te fait plaisir de défoncer toutes les personnes qui sont en difficultés et demandent de l'aide sur ce forum, je connais des ring de boxe pour se défouler qui pourrait te faire du bien.

J'ajoute que ce forum met l'accent sur la politesse des membres pour que les échanges soient plus agréables. J'aimerai savoir à quel titre tu te permets de qualifier ma formule "d'absurdité" ! Une phrase comme "je pense que pour ta formule, il serait préférable de faire.. " est plus recevable. Quand je vois les interventions que tu fais sur les autres discussions, je te trouve bien rigide pour des personnes qui demandent de l'aide.

EDIT pour répondre à ton dernier Post MFerrand du 29/02/16 à 5h31 :

Je fais un Edit pour éviter que Yvouille ne reçoive trop de mails, comme il me l'a fait remarquer plus haut.

L'aide que tu m'as fourni n'était pas vaine, puisque j'ai demandé de l'aide pour une opération précise, et tu m'as donné une solution pour un problème précis, solution qui fonctionne parfaitement. Ce n'est pas parce que ta macro n'apparaît pas dans mon fichier Excel, que je ne vais pas m'en servir pour autant. J'ai 13 autres macro qui fonctionnent sur mon fichier. Je dois toutes vous les faire parvenir pour éviter les sensibilités de chacun ?

Vous avez qualifié mes explication d'un "flou pas très artistique". Fallait-il que je vous explique que c'est dans le cadre d'un dossier à rendre, avec des points en plus sur les utilisations de macro VBA, pour 7 rayons différents dans le cadre du cas d'un super-marché ? Ou était-il préférable de dire que c'est pour un exercice donné en cours, pour se mettre au travail plus simplement ?

Aussi, si je fais des demandes de manière décousues, c'est là aussi pour respecter les règles du forum, puisque notre fichier fait plus de 8Mo avec les boutons ActiveX. Le forum n'autorise pas les fichiers de plus de 300ko.

Si je veux que ma formule soit flexible en fonction du nombre de lignes de mon tableau encadré en rouge, c'est parce que je dois réaliser cette opération pour 7 autres analyses du même type, avec des produits différents (Notre dossier d'info se met dans la peau d'une gestion de super marché, donc pour 7 autres rayons). D'où ce besoin, pour être plus crédible lors de notre présentation orale, d'avoir des formules adaptables.

Encore une fois, il n'y a pas d'énoncée type. Le dossier que je construis avec mon camarade se construit progressivement, et c'est à nous de formuler nos contraintes. C'est donc un exercice difficile pour moi que celui d'exprimer clairement mon besoin, n'ayant moi-même que des bases rudimentaires en VBA, pour un projet qui se construit de nos mains.

Je me suis mal exprimé la première fois, et Yvouille me l'a fait remarqué. J'ai donc entendu ses remarques et agit en conséquence. Ton intervention sur la manière de m'exprimer, après m'être efforcé de rectifier mon premier post, je m'en serais bien passé.

J'ai pour souhait d'apprendre le VBA, car ce langage permet de faire énormément de choses. Vous ne me découragerez pas en m'expliquant que les programmes sont bien pensés et adaptés à ma formation. Je me cantonnerais pas à des limites fictives et posées pour des gens qui ne veulent pas se tourner vers l'informatique de gestion, comme c'est le cas dans ma formation, où les étudiants se tournent vers l'expertise comptable.

Yvouille m'a fait remarquer une première fois que mon post n'était pas assez explicite et que je devais revoir ma copie. C'est ce que j'ai fait. Vous avez par la suite surenchéri... dans quel but... je l'ignore... la pédagogie ? Je ne pense pas.

Ici aussi, je ne vous ai pas demandé de juger pourquoi je voulais faire cette macro, qui sera amenée à revenir plusieurs fois lors de notre dossier final. Par soucis de gain de temps et de clarté, je n'avais pas besoin de le préciser !

Enfin, si vous souhaitez aider les personnes qui viennent sur ce forum, essaye de le faire avec un minimum de tact, pour éviter de les faire fuir. J'ai critiqué notre professeur qui ne nous explique pas le fonctionnement du VBA. Il tape du VBA à toute vitesse, puis nous dit que c'est facile, et termine en nous disant de venir sur votre site, ou sur le site du zero. Mais là aussi, Yvouille m'a fait remarqué que ce n'était pas nécessaire de critiquer cette personne, et j'en prends note. Méprenez vous : j'ai des professeurs que je respecte du plus haut point, car m'ont apporté beaucoup. Je ne suis pas en guerre contre tous les professeurs du monde entier (mon petit doigt me dit que vous en faites parti). Le respect est quelque chose qui se gagne, et non qui s'impose.

Plus on me dira de ne pas faire de macro et de laisser le VBA, et plus j'aurai envie d'apprendre ce langage et de faire des macros dans tous les sens.

Le sujet principal de ce post est maintenant très lointain de notre échange...

Après avoir pris le temps de vous répondre, je vais maintenant aller dormir, car il ne me reste plus qu'une heure de sommeil. Bonne journée.

Je n'ai nul besoin de me défouler.

Je déteste seulement avoir l'impression d'avoir perdu mon temps en faisant quelque chose.

Et tes propos ne me rassérènent pas.

Enfin, même si le système éducatif ne se porte pas au mieux, les exercices demandés aux élèves font partie du programme, en toute logique.

Que ces derniers veuillent en faire plus et se mettent à l'apprentissage d'éléments hors programme, c'est fort louable, mais il convient de distinguer les deux aspects, et dans la plupart des cas, lorsqu'on utilise VBA, on doit être capable de faire la même opération manuellement. Car VBA se justifie pour des opérations répétitives et des opérations ponctuelles pouvant s'avérer fort longues à réaliser à la main. Je ne vais pas perdre mon temps à écrire une macro chaque fois que j'ai quelque chose à faire une fois.

Au demeurant, si l'énoncé avait été fourni tel que tu l'as certainement reçu, l'exercice serait apparu comme une réalisation assez courante sans complexité particulière. Essayer de te faire mettre le doigt sur des éléments dont la qualité de réalisation n'est pas vraiment au top, n'est pas ce que j'appellerais "défoncer" quelqu'un. C'est simplement lui montrer que des améliorations ne seraient pas un luxe et, son but principal étant d'apprendre, que les progrès en la matière seront plus rapide en s'y prenant avec méthode.

Quoi qu'il en soit je vous adresse mes voeux de réussite, en espérant que vous ne soyez pas imperméables aux conseils et que vous ne vous fourvoyiez que modérément dans l'accumulation de macros qui ne sont pas le coeur de l'exercice en cours.

Bonne continuation.

Salut Bigboo,

J’ai lu ton message de 0 heure 52 et je dois t’avouer que ça fout un peu le tournis. Il me semble que tu expliques trop de chose, on ne sait rapidement plus où on en est. De plus – comme tu dis toi-même que tu ne sais pas trop où tu veux en arriver avec ton fichier – ça ne rend pas les choses simples.

D’une manière générale, si tu prends un problème après l’autre, c’est plus simple de s’y retrouver et finalement on avance plus vite.

Comme j’ai compris que tu voulais pouvoir placer en premier lieu des formules PAR MACRO dans une cellule quelconque, mais en fonction d’un tableau dont le début et la fin ne sont pas toujours aux mêmes endroits, je vais tenter pour commencer de t’aider pour cette partie de tes problèmes.

Mais je n’ai pas compris non plus lors de quel évènement, au cours du déroulement de quelle macro tu voulais cela. J’ai donc décidé de te faire une démonstration séparée.

Dans le fichier ci-joint, j’ai créé la macro ‘’Actualisation_B2_B3’’. Afin de chercher le début du tableau concerné, j’ai choisi la colonne M car il n’y a rien au-dessus de la première ligne du tableau concerné. Il y aurait bien entendu 36 autres manières d’arriver au même résultat, il faut juste trouver l’une des manières les plus simples en fonction de ton fichier. J’avais par exemple hésité à rechercher la deuxième occurrence du mot ‘’Type’’ dans ta colonne A, mais c’est un peu plus compliqué. Par contre si tu avais un mot sans ambiguïté au commencement de ce tableau (comme le mot ‘’Type Xxx’’), ce serait facile de trouver sa position. Mais bon, ma macro trouve le début de ce tableau par la variable i.

Ta deuxième exigence est de trouver la fin de ce tableau. Là également, 36 manières possibles. J’ai simplement choisi de partir du début du tableau maintenant connu et d’effectuer une boucle Do/Loop jusqu’à la première ligne vide ; la variable j est dans la poche. Il aurait été plus logique de partir depuis le fond de la feuille et trouver la dernière ligne utilisée à l’aide de l’instruction End(xlup), mais comme je sais que tu vas avoir un deuxième tableau en dessous de celui traité ici, il a fallu trouver autre chose.

Tu peux maintenant placer une formule dans ta cellule B2 qui tiendra compte de ces deux variables i et j par l’instruction ‘’FormulaR1C1’’.

Il est bien évident que ce n’est pas toujours bien de placer une formule dans une cellule, surtout si tu dois par exemple le faire en grand nombre (une formule par ligne sur 1000 lignes par exemple). Dans certaines conditions, il vaut mieux placer directement le résultat d’un calcul effectué par la macro. Je t’en fais la démonstration dans la cellule B3 par l’instruction ‘’WorksheetFunction’’.

Voilà, il ne te reste plus qu’à t’amuser à modifier le nombre des lignes de ton tableau placé à la base en A4:C9 et/ou le nombre de ligne de ton premier tableau marqué en vert et tu constateras en cliquant sur mon bouton en H1 que les résultats sont adaptés.

Bon, après il te faudra encore adapter la solution qui te convient le mieux à ton besoin personnel et le tour sera joué.

Si ce problème n’est pas résolu, reviens à la charge qu’à son propos, autrement passons au problème suivant pour lequel j’attends tes informations.

Amicalement.

Bonjour Yvouille !!

J'essaye de comprendre comment fonctionner ta macro, car je n'arrive pas à la faire fonctionner pour l'instant : les cellules sur fond bleu ne se remplissent pas, quelque chose doit m'échapper, je cherche encore.

Je te fais également parvenir en PJ mes essais d'aujourd'hui. Mes cellules sur fond bleu se remplissent bien. Si il n'y a pas de produits dans l'une des cellules A5:A9, la formule n'est pas inscrite. Ma formule va chercher les données jusqu'à la fin du tableau vert.

Jusque là, c'est good. Mais ma formule triche, car je la fais commencer manuellement à la ligne 13. Or, comme tu l'as bien compris, les lignes du tableau encadré en rouge peuvent varier. Alors, la ligne de départ du tableau vert ne sera pas toujours la ligne 13.

j'ai également ajouté des commentaires dans ma macro qui s'intitule "Macro_cellules_fond_bleu". Je suis parti d'une macro d'enregistrement, puis j'ai modifié la plage de sélection pour aller jusqu'en bas du tableau. Pas terrible en somme.

Une fois que je saurais comment faire démarrer ma plage de sélection au tableau vert, je serais également en mesure de remplir mes cellules fond jaunes de manière auto.

Par contre si tu avais un mot sans ambiguïté au commencement de ce tableau (comme le mot ‘’Type Xxx’’), ce serait facile de trouver sa position. Mais bon, ma macro trouve le début de ce tableau par la variable i.

Oui : en A12, je peux mettre "Nature", ou "Objet".

Je reste co'

Merci de m'aider, c'est super gentil !!

EDIT : Truc qui peut aider : Le début du tableau encadré en rouge est fixe, et commencera toujours en ligne 4.

EDIT 2 :

Il aurait été plus logique de partir depuis le fond de la feuille et trouver la dernière ligne utilisée à l’aide de l’instruction End(xlup), mais comme je sais que tu vas avoir un deuxième tableau en dessous de celui traité ici, il a fallu trouver autre chose.

Une fois que je copie colle le tableau vert par ta macro, je ne fais pas apparaître d'autres tableaux. Pas sur cette page en tout cas.

Salut Bigboo,

Je veux bien t’aider, mais tu dois aussi faire l’effort de lire mes textes. Je t’ai dit que je ne traitais que la partie qui te permet de rechercher le début et la fin d’un tableau et d’en utiliser les valeurs trouvées pour deux sortes de calculs. J’avais ensuite rajouté que c’était à toi de voir comment tu pouvais intégrer ces passages dans tes macros.

bigboo a écrit :

J'essaye de comprendre comment fonctionner ta macro, car je n'arrive pas à la faire fonctionner pour l'instant : les cellules sur fond bleu ne se remplissent pas, quelque chose doit m'échapper

J’ai bien précisé quelles cellules je traitais, sous-entendu lesquelles non !! Je n'ai jamais prétendu que ma macro traitait les cellules bleue.
bigboo a écrit :

Je te fais également parvenir en PJ mes essais d'aujourd'hui.

Je t’ai dit que je n’avais aucune envie de prendre le prochain problème en main tant que le premier n’était pas résolu. J’ai arrêté à cet endroit la lecture de ton texte, si ce n’est en survol et j’ai alors vu que tu avais placé deux EDIT alors que je t’avais demandé de bien penser ta réponse avant de la placer sur le Forum.

Ma manière de travailler t’intéresse ou on laisse tomber ?

Amicalement.

Bonjour Yvouille,

J'ai effectivement lu trop vite ta réponse du 29/02 à 23h30.

Oui ta manière de travailler m'intéresse car elle me force à comprendre tes codes. Je n'ai pas le niveau pour tout comprendre, donc c'est laborieux, mais je peux comprendre les grandes lignes et chercher des éléments pour comprendre l'essentiel.

A partir du moment où l'on m'explique, et où je comprends ce que je fais, je suis prêt à me plier à n'importe quelle méthode de travail .

On va au rythme que tu veux, je m'adapte en fonction. Le tout est de comprendre ce que je fais pour pouvoir utiliser les outils que tu me mets en main, sans toujours te solliciter.

Si j'ai bien compris, ta macro permet de trouver le début du tableau vert, en regardant la colonne M qui est sans interférences, et d'aller jusqu'à la fin de ce tableau vert. Lorsque j'exécute ta macro "actualisation_B2_B3", une cellule est sélectionnée à la fin du tableau vert, dernière colonne, donc colonne verte, soit cellule M41.

De plus, avec ta macro, la formule =SOMME.SI($A$15:$A$40;"Commandes prévues";$G$15:$G$40) apparait donc bien B2, et comme tu l'as suggéré, en B3, le résultat est directement affiché sans rentrer la formule dans la cellule. Je vais réfléchir à ce qui est le mieux en fonction de mes besoins.

Si je comprends bien la logique de ta macro, elle permet d'apprécier les dimensions du tableau vert avec les variables i et j. Une fois les dimensions du tableau vert considérées, les formules rentrées par la suite vont donc faire leur analyse par rapport à ces dimensions du tableau vert que l'on vient d'apprécier. Est-ce que j'ai juste ?

Commentaires de la macro :

[list=]' Nom de la macro
Sub Actualisation_B2_B3()

' Pause le cadre d'analyse, pour définir comment la macro doit apprécier les dimensions du tableau, donc par les dimensions i et j. Right ? 
Dim i As Integer, j As Integer

' Cette ligne permet de partir de la cellule M1, et d'aller chercher la dernière ligne du tableau vert. Le "+1" permet de descendre à la cellule du dessous, donc cellule vide M41. La macro connait maintenant le nombre de lignes du tableau.
i = Range("M1").End(xlDown).Row + 1

' Cette ligne permet d'activer le nombre de lignes du tableau vert, avec exclusion de la ligne des intitulés, grâce au "+1" de la ligne précédente. Les lignes M15 à M41 sont donc activées.
Range("M" & i).Activate

' La boucle do/loop until commence ici.
Do

' "ActiveCell" permet d'activer une cellule ou plage de sélection. La fonction ActiveCell.Offset(1, 0) permet d'activer la sélection précédente, donc "Range("M" & i).Activate, et de décaler cette sélection de 1 vers le bas. La fonction de boucle permet alors de répéter ces actions plusieurs fois, jusqu'à arriver au bas du tableau. La boucle avec la mention "Loop Until" va exécuter cette boucle, jusqu'à ce que ça ne soit plus possible. Right ?
    ActiveCell.Offset(1, 0).Activate

' Pourquoi ne rien mettre dans "ActiveCell = "" " ?
Loop Until ActiveCell = ""

' Cette ligne permet d'activer toutes les lignes du tableau vert. "j" correspondant bien à la référence "ligne"? Le "-1" fait remonter l'activation des cellules du tableau, en prenant en compte les libellés du tableau. Right ? 
j = ActiveCell.Row - 1

' Une fois que toutes les lignes du tableau vert sont sélectionnées, on va maintenant pouvoir associer une formule, par exemple en B2, par rapport à la sélection préalable. J'ai bon ?
' Le morceau de ligne "Range("B2").FormulaR1C1 = "=SUMIF" permet d'entrer en B2 la formule somme si. Jusque là OK. 
' Pour l'autre partie de la formule "(R" & i & "C1:R" & j & "C1,""Commandes prévues"",R" & i & "C7:R" & j & "C7)", je suis perdu. 
' Si je me réfère à ma macro que j'ai enregistré, je comprends que R correspond aux lignes (pour Range), et C pour les columns.
' Les éléments dans la parenthèse sont-ils calculés par rapport à l'endroit où se place ma formule ? Je luis dans la parenthèse "C1R". J'en conclue qu'on demande d'écrire quelque chose 1 colonne de + à droite, et sur la même ligne. J'en conclue donc qu'au début de la formule, on se place en A2. Vrai ? 
' Serait-il trop laborieux pour toi Yvouille de m'expliquer la syntaxe des parenthèses ? 

' Si jusque là j'ai bon dans l'analyse du raisonnement de la macro, je devrais pouvoir adapter le code, pour par la suite inscrire une formule en C2 et B2. je pourrais d'ailleurs le faire dans d'autres cellules.

Range("B2").FormulaR1C1 = "=SUMIF(R" & i & "C1:R" & j & "C1,""Commandes prévues"",R" & i & "C7:R" & j & "C7)"

Range("B3") = WorksheetFunction.SumIf(Range("A" & i & ":B" & j), "Commandes prévues", Range("G" & i & ":G" & j))

End Sub[/list]

J'ai essayé de faire la réponse la plus complète possible. J'espère que m'expliquer le code que tu utilises ne te dérange pas trop. Le but étant que je puisse être de plus en plus autonome.

Concernant la forme de ma réponse, je suis ouvert à toute suggestion pour te simplifier la lecture. Si besoin, je peux par exemple mettre une * en début de phrase, pour mettre en avant les endroits où j'ai un doute, et où j'ai besoin de ton amont pour savoir si j'ai bien compris ou pas.

Résumé :

La macro que tu m'as envoyé hier permet dans un premier temps d'apprécier la dimension du tableau en vert, en partant de la colonne M. Ensuite, on utilise la boucle pour balayer la totalité du tableau vert et d'activer ensuite cette zone. Puis, on inscrit dans la cellule désirée la formule, en fonction de la dimension que l'on a défini en début de macro. Est-ce que j'ai compris la logique de la macro ?

A bientôt cher ami !

Salut,

Une chose que tu dois faire si tu veux comprendre les macros est d’utiliser le point d’arrêt et le pas à pas. Va donc voir le lien ci-après qui te sera d’une très grande utilité.

https://forum.excel-pratique.com/cours-astuces/methodes-point-d-arret-et-pas-a-pas-t59460.html#p333120

Ensuite je ne veux et ne peux pas te faire un cours complet de macro sur ton fil, alors qu’il y a déjà tellement de cours et de tutoriels à disposition sur la toile. Il suffit souvent de chercher un peu. Mais va déjà voir le très bon cours VBA proposé par sur notre site (voir le ruban au sommet de la présente page). Si tu suis ce cours, tu seras déjà très avancé.

Je réponds quand même à tes questions de la manière demandée – par des commentaires directement dans la macro - mais je ne vais pas le faire à l’avenir d’une manière autant complète. Avec les moyens que je t’ai indiqués ci-dessus, tu devrais t’en sortir en grande partie tout seul. De plus tes questions sont semble-t-il à double entre le fil et les commentaires dans la macro, je ne réponds donc pas aux questions de ton fil pour cette fois.

' Nom de la macro
Sub Actualisation_B2_B3()

' Pause le cadre d'analyse, pour définir comment la macro doit apprécier les dimensions du tableau, donc par les dimensions i et j. Right ? 

' YVOUILLE : Voir un cours VBA 
Dim i As Integer, j As Integer

' Cette ligne permet de partir de la cellule M1, et d'aller chercher la dernière ligne du tableau vert. Le "+1" permet de descendre à la cellule du dessous, donc cellule vide M41. La macro connait maintenant le nombre de lignes du tableau.
' YVOUILLE : Cette instruction permet de chercher LA PREMIERE ligne du tableau vert à partir de la cellule M1
i = Range("M1").End(xlDown).Row + 1

' Cette ligne permet d'activer le nombre de lignes du tableau vert, avec exclusion de la ligne des intitulés, grâce au "+1" de la ligne précédente. Les lignes M15 à M41 sont donc activées.
' YVOUILLE : Cette instruction permet d’activer la cellule M de la deuxième ligne du tableau vert, puisque la première ligne a été trouvée grâce à l’instruction Range("M1").End(xlDown).Row et qu’on y a ajouté 1. La méthode pas-à-pas permettrait de voir que cette instruction active une cellule, rien de plus.
Range("M" & i).Activate

' La boucle do/loop until commence ici.
' YVOUILLE :Non, la boucle Do/Loop commence 5 lignes plus bas. Mais non, je te plaisante, elle commence vraiment ici :-)
Do

' "ActiveCell" permet d'activer une cellule ou plage de sélection. La fonction ActiveCell.Offset(1, 0) permet d'activer la sélection précédente, donc "Range("M" & i).Activate, et de décaler cette sélection de 1 vers le bas. La fonction de boucle permet alors de répéter ces actions plusieurs fois, jusqu'à arriver au bas du tableau. La boucle avec la mention "Loop Until" va exécuter cette boucle, jusqu'à ce que ça ne soit plus possible. Right ?
' YVOUILLE :ActiveCell représente la cellule active, rien d’autre. Ainsi l’instruction ActiveCell = 33 inscrit 33 dans la cellule active. Offset permet de préciser un déplacement par rapport à un objet. Ainsi Range("A2").Offset(1 , 1) représente la cellule B3. L’instruction ci-dessous active donc la cellule 1 ligne et 0 colonne en dessous de la cellule active.
   ActiveCell.Offset(1, 0).Activate

' Pourquoi ne rien mettre dans "ActiveCell = "" " ?
' YVOUILLE  Tant que la cellule active est vide ("") on retourne à DO et on active la cellule en dessous.
Loop Until ActiveCell = ""

' YVOUILLE : Une fois la première cellule vide (ActiveCell = "") trouvée, on passe plus loin.

' Cette ligne permet d'activer toutes les lignes du tableau vert. "j" correspondant bien à la référence "ligne"? Le "-1" fait remonter l'activation des cellules du tableau, en prenant en compte les libellés du tableau. Right ? 
' YVOUILLE : Au mode pas à pas, tu verrais que la première cellule vide en dessous du tableau vert est maintenant activée. Il suffit de donner à j la valeur de la ligne (ROW) de la cellule active MOINS 1 et j prend la valeur de la dernière ligne du tableau. 
j = ActiveCell.Row - 1
' YVOUILLE : Bien entendu que tu pourrais construire ta boucle Do/Loop d’une autre manière de manière à ce que ça s’arrête sur la dernière ligne et que tu n’aies pas besoin de retrancher 1 ci-dessus.

' Une fois que toutes les lignes du tableau vert sont sélectionnées, ---------------(YVOUILLE : PAS DU TOUT, ON A JUSTE TROUVE LA PREMIERE ET LA DERNIERE LIGNE DU TABLEAU ET ON EN A AFFECTE LES VALEURS AUX VARIABLES I ET J POUR UNE UTILISATION PROCHAINE) -------------- on va maintenant pouvoir associer une formule, par exemple en B2, par rapport à la sélection préalable. J'ai bon ?
' Le morceau de ligne "Range("B2").FormulaR1C1 = "=SUMIF" permet d'entrer en B2 la formule somme si. Jusque là OK. 
' Pour l'autre partie de la formule "(R" & i & "C1:R" & j & "C1,""Commandes prévues"",R" & i & "C7:R" & j & "C7)", je suis perdu. 
' Si je me réfère à ma macro que j'ai enregistré, je comprends que R correspond aux lignes (pour Range), et C pour les columns.
' Les éléments dans la parenthèse sont-ils calculés par rapport à l'endroit où se place ma formule ? Je luis dans la parenthèse "C1R". J'en conclue qu'on demande d'écrire quelque chose 1 colonne de + à droite, et sur la même ligne. J'en conclue donc qu'au début de la formule, on se place en A2. Vrai ? 
' Serait-il trop laborieux pour toi YVOUILLE de m'expliquer la syntaxe des parenthèses ? 

' Si jusque là j'ai bon dans l'analyse du raisonnement de la macro, je devrais pouvoir adapter le code, pour par la suite inscrire une formule en C2 et B2. je pourrais d'ailleurs le faire dans d'autres cellules.

Range("B2").FormulaR1C1 = "=SUMIF(R" & i & "C1:R" & j & "C1,""Commandes prévues"",R" & i & "C7:R" & j & "C7)"

Range("B3") = WorksheetFunction.SumIf(Range("A" & i & ":B" & j), "Commandes prévues", Range("G" & i & ":G" & j))

End Sub

A propos de l’instruction FormulaR1C1, je n’ai rien indiqué dans la macro, mais va déjà voir mon message du 24 juin 2015 à 22 :24 sur le fil ci-après, tu y trouveras pleins de bonnes choses et un fichier démo.

https://forum.excel-pratique.com/excel/procedure-vba-a-partir-d-un-enregistrement-de-macro-t65662.html#p373745

A te relire.

Bonsoir !

J'ai relu chacune de tes réponses, et je vois... que je n'ai absolument rien compris.... Sauf quand la boucle commençait ahahaha !!

J'ai regardé tes liens : j'ai du boulot pour tout assimiler sur le long terme... Mais il y a un début à tout !

En tout cas, notre dossier d'info commencer à avoir de la gueule !

Juste avant que tu ne répondes, j'ai essayé d'insérer des formules pour les cellules sur fond bleu, sur la base de ta précédente macro. Cela fonctionne bien, puisque ma formule s'insère correctement dans la cellule B5.

Toujours en ayant modifié ta macro (très légèrement), j'arrive maintenant à rentrer des formules en C5.

Les résultats recherchés sont là. Le seul truc dommage est que mes formules ne vont pas jusqu'à la fin du tableau encadré en rouge.

Je te soumets mon fichier avec les modifications ? Ou préfères-tu faire autre chose ?

Merci beaucoup pour tes explications, car j'avais vraiment rien compris au film...

Je réponds à des questions sur le Forum sans suite précise. Donc si tu veux abandonner un problème pour en commencer un autre, pourquoi pas. Je ne veux juste pas traiter plus d’un problème à la fois.

bigboo a écrit :

…Le seul truc dommage est que mes formules ne vont pas jusqu'à la fin du tableau encadré en rouge.

Je te soumets mon fichier avec les modifications ?

Ok, soumets-moi ton fichier sans indiquer aucune information ni sur les feuilles Excel, ni dans la macro, mais uniquement sur ton fil, en faisant référence aux objets Excel telle que la plage A111:B222 plutôt que de faire référence à des trucs fantaisistes tels que le ‘’Tableau rouge’’.

Si on dit que la connaissance des codes VBA va de 0 à 100 %, je pense maitriser personnellement 50 % de ce total. Si tu t’intéresses aux méthodes ‘’Point d’arrêt’’ et/ou ‘’Pas-à-pas’’, je pense que tu approcheras rapidement les 35-40 %. Ca vaut vraiment la peine que tu t’y penches.

A te relire.

Bonsoir Yvouille !

Je te soumets mon fichier, avec les formules que j'utilise. Mais ce n'est pas pour le problème abordé plus haut (c-a-d. formules qui ne se "tirent" pas jusqu'en bas de ma plage "A5:A9".).

Si je post un message ce soir, c'est parce que je me suis rendu compte qu'après avoir fait des calculs sur mes prix, j'ai parfois énormément de chiffres après la virgule.

J'ai mis des exemples de prix en G13:G26 Feuil1.

Même lorsque j'arrondi, les chiffres après la virgule restent... Et si je veux tronquer mes chiffres, je dois les faire 1 par 1...

Connais-tu une macro VBA pour tronquer tout une colonne d'un coup,, en ne laissant que 2 chiffres après la virgule ?

Si c'est plus simple, la macro pourra s'exécuter en Feuil2, sur toute une colonne, avant de transférer le tableau A1:M27 (Feuil2) vers Feuil1.

Une fois que ce problème sera résolu, je pourrais revenir te voir pour tirer automatiquement les formules rentrées en B5 jusqu'à B9 et C5 jusqu'à C9. Cette histoire de pleins de chiffres fait complètement buguer mes macros et mes formules deviennent fausses.

A bientôt,

Bigboo !

Salut Bigboo,

Je ne sais pas si pour toi tronqué et arrondi sont synonyme ou non. Si non, peux-tu me dires par une exemple simple comment tu tronques un nombre ?

bigboo a écrit :

Si je post un message ce soir, c'est parce que je me suis rendu compte qu'après avoir fait des calculs sur mes prix, j'ai parfois énormément de chiffres après la virgule.

Comment effectues-tu ces calculs ? Par macro ? Alors fournis-moi un exemple de ton fichier avant le lancement de la macro, indique-moi comment tu lances la macro et quels sont les résultats que tu voudrais voir tronqués. Ou effectues-tu ces calculs par formules ? Alors montre-moi tes formules.
bigboo a écrit :

Même lorsque j'arrondi, les chiffres après la virgule restent...

Peux-tu me montrer dans un fichier ta manière d’arrondir les chiffres ?

Amicalement.

Bonsoir,

Effectivement, tronquer un nombre et l'arrondir sont deux choses différentes.

Tronquer ==> 5,5569 à 2 décimales

Résultat : 5.55

Arrondir ==> 5.5569 à 2 décimales

Résultat : 5.56

Pour ce qui est de nos chiffres, les calculs ont été faits par mon camarade de classe, puis rentrés à la main dans un tableau. On a gardé tous les chiffres après la virgule pour être précis, sauf que ça nous ennuis plutôt qu'autre chose.

Un exemple de calcul : On a en stock 83€ de goblets, et il en reste 120 dans le rayon du magasin. On divise donc 83€ par le nombre de goblet pour avoir le coût unitaire : soit 0,6916666666666666667. On obtient des chiffres tous pourris qu'on s'est ennuyé de rentrer sur plusieurs lignes... Plus tôt que de tout changer, on cherche à tronquer nos chiffres à 2 après la virgule, pour une colonne entière.

C'est pas possible avec du VBA ? :s Sinon bah on recommence la saisie pas grave...

Merci du coup de main en tout cas

Re,

Dans le fichier ci-joint, tu vois que tu peux effectuer un arrondi inférieur (ou troncature ?) grâce à une formule (en C3, lors de la modification de A1 ou B1) ou grâce à un calcul ‘’en direct’’ dans une macro (en D3, également lors de la modification en A1 ou B1).

Mais tu peux aussi arrondir à l’inférieur une colonne entière comme ma démo grâce au bouton en place.

Amicalement.

27demo.xlsm (18.99 Ko)

C'est exactement ce qu'on cherche à faire !!! ça fait gagner un temps fou !!

La macro que tu as envoyé bug cependant à cause du titre "prix" inscrit en G1.

Ya pas moyen d'exclure la cellule en G1? sinon on suppr le titre puis on le remet après, c'est pas une grande perte ^^

Rechercher des sujets similaires à "rentrer formule lignes variables"