Aller au contenu

[RESOLU] calculer une somme en fonction de date


nightswan

Messages recommandés

Bonjour,

Je suis sous Excel 2007, et j'aimerai créer des boutons simples, qui permettraient de remplir de texte

des cellules sélectionnées.

C'est pour faire un planning hebdo d'une équipe, et il y aurait un bouton par activité.

Voici ce que je voudrais faire en image :

C6 et D6 sont sélectionnées et un clic sur le bouton "activité 1" remplirait ces 2 cellules par le texte affecté à ce bouton.

J'ai cherché sur pas mal de sites où il y a des tutos VBA, Office, Excel... mais je tombe sur des trucs vachement calés.

Je ne pense pas que ce que je veuille faire soit compliqué, mais je n'ai aucune connaissance sur l'aspect macro/VBA d'Excel.

Merci d'avance.

2011-12-03152835.png

Lien vers le commentaire
Partager sur d’autres sites

salut !

si tu ne connais rien en VBA/Macro ca va pas être évident... m'enfin comme ça n'a rien de compliqué on va essayer en mode pas à pas ^^

1) Au préalable il te faudra activer l'onglet "développeur" dans le menu-ruban. Pour ca tu vas dans les options Excel (clic sur le logo en haut à gauche, puis en bas à droite de la fenètre tu verras "Options Excel"). Dans le 1er onglet "Standard" tu devrais trouver une case à cocher "Activer l'onglet Développeur dans le ruban" et tu coches

2) Ensuite je commencerai par te proposer une alternative au "un bouton par activité", si c'est possible ca sera plus simple, via une liste déroulante "activités":

- Sélectionne la cellule C1 par exemple, puis ruban "Données" tu cliques sur "Validation des données". Dans la petite fenêtre tu choisis "Autoriser: Liste", puis tu listes tes activités dans la case "Source" en dessous, séparées par un point-virgule (ex: "Activité1; Activité2; Activité3" sans les guillemets)

3) On créé maintenant le bouton, pour celà tu vas dans le ruban "Développeur", "Insérer" et tu choisis le tout premier symbole, le "bouton". Tu dessines ton bouton, par exemple en E1 (pas juste à droite de ta liste sinon il va te gêner pour faire apparaître le bouton pour dérouler la liste). Un pop-up s'ouvre, tu cliques sur "Nouvelle..."

4) Dans la nouvelle fenêtre on écrit le code qui s’exécutera lorsqu'on cliquera sur le bouton. Voici ce que tu dois avoir:

Sub Bouton1_Clic()Selection = Range("C1")End Sub

Où "Range("C1")" fait référence à ta liste déroulante d'activités, à modifier selon là où tu souhaites la placer

5) Ferme la fenêtre de code, renomme ton bouton "Mise à jour" par exemple, et c'est bon !

Ensuite tu n'auras qu'à choisir l'activité dans la liste déroulante, sélectionner les cellules à mettre à jour et cliquer sur le bouton

Si je n'ai pas été clair qq part n'hésites pas, et dis moi si ca te convient :)

Bonne journée

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

C'est bon, j'ai suivi ton tuto, et ça marche.

Finalement, le principe de la liste déroulante avec le bouton à cliquer, ça va.

J'ai d'autres questions du coup, pour améliorer un peu ce planning :

- j'aimerai avoir un bouton " à blanc " pour effacer tout le contenu des cellules sélectionnées. C'est encore sous forme de code je suppose.

Il y a bien l'option de mettre une cellule vide de plus en fin de liste des activités, de la sélectionner dans la déroulante puis de cliquer... mais le bouton " à blanc " ou " effacer ", ce serait mieux.

- comment affecter un code couleur (ex : activité 1 = cellule rouge, activité 2 = cellule verte) à une activité ? Si je définis ces couleurs dans la déroulante activités, lorsque je sélectionne l'activité 1 et que je clique sur le bouton "màj", la couleur ne se met pas.

- enfin, comment éviter que tout ce qui n'a pas à figurer au planning (ex : déroulante de sélection C1) ne soit présent à l'impression ? On n'est plus dans le VBA là, c'est peut-être une histoire d'attribut ?

Merci pour tes conseils et ta patience. :yes:

Lien vers le commentaire
Partager sur d’autres sites

Pour faire un bouton "reset" tu suis la même manip pour faire un autre bouton et dans le code tu remplaces

Selection = Range("C1")

par

Selection = ""

pour la couleur ton code devient (par exemple)

nomAct = range("C1")Selection = nomAct select case nomActcase "Activité1": Selection.Interior.Color = RGB(rouge1, vert1, bleu1)case "Activité2": Selection.Interior.Color = RGB(rouge2, vert2, bleu2)case "Activité3": Selection.Interior.Color = RGB(rouge3, vert3, bleu3)end select

avec "rouge", "vert" et "bleu" le code couleur entre 0 et 255 (voir paint ou autre pour la palette de couleur)

enfin pour l'impression, tu selectionnes la plage à imprimer (genre B2:F10) puis rdv ruban "mise en page" bouton "zone d'impression" et "definir"

normalement seule la plage B2:F10 devrait s'afficher

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta réponse.

Ok pour le bouton " à blanc " et l'impression.

Par contre, le code que tu m'as décrit pour affecter des couleurs aux activités, je ne sais pas où le mettre (création d'une nouvelle macro ? mais sans créer un bouton, je ne vois pas comment.

ou complète celle du bouton màj situé en F1 ? mais je dois mal la placer, ça ne fonctionne pas).

J'ai fait des google avec "selection.interior.color", mais je tombe sur des trucs très compliqués pour des situations différentes de ce que je veux.

là, je suis largué :keskidit:

2011-12-07143148.png

Par contre (j'ai fait la capture avant la modif), il faut bien que Case "Activité1": soit remplacé par Case "A1": (là où est saisie l'activité 1)

Sinon, pour une vue d'ensemble et te repérer, voilà l'ossature du planning :

2011-12-07143646.png

Lien vers le commentaire
Partager sur d’autres sites

il faut remplacer le code:

Sub Bouton2_Clic()Selection = Range("C1")End Sub

qui devient

Sub Bouton2_clic()nomAct = Range("C1")Selection = nomAct Select Case nomAct Case "Activité1": Selection.Interior.Color = RGB(rouge1, vert1, bleu1) Case "Activité2": Selection.Interior.Color = RGB(rouge2, vert2, bleu2) Case "Activité3": Selection.Interior.Color = RGB(rouge3, vert3, bleu3)End SelectEnd Sub

EDIT le

Case "Activité1"

veut dire

si il est écrit "activité1" alors ...

donc tu mets ici exactement ce qui est écrit dans tes cases A1, A2, A3 etc.

Tu peux remplacer par Case range("A1") ce qui t'évitera de modifier le code si tu nomme ton activité...

exemple: au lieu de activité1, activité2 etc. tu as "Sport", "Cinéma", "Lecture" etc. ton code devient:

soit:

Sub Bouton2_clic()nomAct = Range("C1")Selection = nomAct Select Case nomAct Case "Sport": Selection.Interior.Color = RGB(rouge1, vert1, bleu1) Case "Cinéma": Selection.Interior.Color = RGB(rouge2, vert2, bleu2) Case "Lecture": Selection.Interior.Color = RGB(rouge3, vert3, bleu3)End SelectEnd Sub

ou bien:

Sub Bouton2_clic()nomAct = Range("C1")Selection = nomAct Select Case nomAct Case Range("A1"): Selection.Interior.Color = RGB(rouge1, vert1, bleu1) Case Range("A2"): Selection.Interior.Color = RGB(rouge2, vert2, bleu2) Case Range("A3"): Selection.Interior.Color = RGB(rouge3, vert3, bleu3)End SelectEnd Sub

L'avantage avec la seconde solution c'est que si au lieu de "Cinéma" tu veux finalement "Ciné" tu n'aura pas besoin de modifier le code!

avec la 1ère solution il faudra remplacer la ligne

Case "Cinéma": Selection.Interior.Color = RGB(rouge2, vert2, bleu2)

par la ligne

Case "Ciné": Selection.Interior.Color = RGB(rouge2, vert2, bleu2)
Lien vers le commentaire
Partager sur d’autres sites

C'est bon pour moi.

Par contre (c'est là que tu vas commencer à me détester :mdr: ), j'ai une autre question :

quel code faut-il ajouter à la macro du bouton "à blanc" pour que les couleurs virent également ? (avec l'actuelle, seul le texte s'en va).

Après, je pense que je vais te laisser tranquille. :yes:

Lien vers le commentaire
Partager sur d’autres sites

c'est parceque dans ton code il est écrit

Activité1

alors que dans tes cellules il est écrit

activité 1

l'espace supplémentaire fait que le programme ne reconnait pas le même texte

Comme j'ai écrit dans mon EDIT (que tu n'as peut être pas eu le temps de lire) il vaut mieux en fait remplacer "activitéX" par "range("AX")" avec X entre 1 et 15.

une solution alternative plus compacte maintenant que j'ai vu la gueule de ton fichier:

d'abord tu appliques un fond dans chacune de tes cases "A1","A2" etc. là où tu listes tes activités, ensuite tu remplaces tout le code du bouton2:

Sub Bouton2_clic()nomAct = Range("C1")Selection = nomActFor i = 1 To 15 '15 = nombre d'activités    If Range("A" & i) = nomAct Then        Selection.Interior.Color = Range("A" & i).Interior.Color        Exit For    End IfNext iEnd Sub

pour virer les couleurs tu ajoutes la ligne

Selection.Interior.Pattern = xlNone

AVANT la ligne

End sub
Lien vers le commentaire
Partager sur d’autres sites

Allez, une dernière pour la route :eeek2:

C'est au niveau de l'impression, pour n'avoir que le planning et pas d'autre élément (comme la déroulante).

En cherchant un peu, j'ai trouvé cette macro, qui permet de définir une zone d'impression :

ActiveSheet.PageSetup.PrintArea = "$A$1:$J{:content:}quot; & ActiveSheet.UsedRange.Rows.Count

Par contre, comment insérer ça dans mon classeur (où surtout) et comment saisir ma zone d'impression (en fait, je ne comprends pas le $A$1:$J$)

qui est comprise entre "B3-L3" (largeur du planning) et "B29-L29" pour la hauteur.

J'ai trouvé ça aussi (avec ici un bouton "imprimer"), mais même problème pour ma part, comment l'adapter à ma situation :

Sub bouton.click()

Selection.PrintOut Copies:=Range("A1").Value, Collate:=True

End sub

:chinois:

Lien vers le commentaire
Partager sur d’autres sites

as-tu besoin d'une macro pour définir ta zone d'impression? la méthode que je t'ai proposé ne te convient pas?

le code que tu as trouvé selectionnes les colonnes entre A et J comprises, et les lignes entre 1 et le nombre de lignes "utilisées" dans ta feuille de calcul. les symboles "$" ne sont pas à prendre en compte, et le morceau "{:content:}quot; & ActiveSheet.UsedRange.Rows.Count" compte le nombre de lignes "utilisées"

donc en gros ce code définit comme zone d'impression toutes les cellules que tu utilises (sauf si tu en utilise après la colonne J)

(une cellule est "utilisée" si tu as, à un moment quelconque, écrit quelquechose dedans)

Pour ton cas en particulier le code doit être:

sub Bouton3_clic()ActiveSheet.PageSetup.PrintArea = "B3:L29"end sub

en suivant la manip de création d'un bouton

Ensuite pour le bouton "imprimer" je vais pas pouvoir t'aider, mais je pense qu'il n'est pas utile (voir risqué) de ne pas passer par la méthode classique d'impression.

D'autant que sur excel 2007 tu as une zone de bouton rapide (barre d'outils Accès rapide) où tu peux ajouter le bouton d'impression !

Lien vers le commentaire
Partager sur d’autres sites

Merci encore.

Pour ta méthode sur la zone d'impression, ça me convenait, mais je pense à une collègue qui pourra être amenée à imprimer ce planning, pour qui l'informatique en général est un univers très très complexe.

Donc un bouton IMPRIMER bien visible me semblait une solution intuitive.

Je pense avoir fait le tour ce coup-ci.

@+ :byebye:

Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

Salut,

Finalement, j'aimerai revenir à ma solution de départ, à savoir un bouton cliquable par activité (vu qu'il y en a 29, la déroulante n'est pas pratique).

La liste des activités serait donc visible (va de A5 à A33) et le planning s'étend de D5 à M47.

Il y aura donc un bouton cliquable en A5 pour l'activité "adhésion/affiliation", puis un autre "bon à payer" en A6... pour remplir le planning.

Peux-tu m'indiquer la macro de base pour une activité (puis la seconde histoire que je comprenne comment la reproduire pour les 27 autres). :chinois:

146058271.png

Lien vers le commentaire
Partager sur d’autres sites

salut,

donc tu ouvres un nouveau module VBA et colle la fonction suivante :

Sub auto_fill(nom_act, plage As Range)For Each cell In plage   cell.Value = nom_actNext cellEnd Sub

ensuite tu associes à chaque bouton que tu souhaite créer le code suivant :

Sub Bouton1_Clic()nom_act = "Activité 1"Call auto_fill(nom_act, Selection)End Sub

le "bouton1" (dans le nom de la fonction) correspond au nom de ton bouton

le "Activité 1" correspond au nom de l'activité associée à ce bouton

ai-je bien compris ce dont tu avais besoin ?

Lien vers le commentaire
Partager sur d’autres sites

Salut et merci pour ton aide (rapide !)

Ca fonctionne, par contre, je perds la possibilité de remplir les cases par des couleurs prédéfinies (pour la lisibilité du planning).

Avant, ça se passait par la déroulante (l'activité définie était tout le temps en B1) et la macro associée était :

Sub Bouton2_clic()

nomAct = Range("B1")

Selection = nomAct

For i = 5 To 35 '35= nombre d'activité

If Range("A" & i) = nomAct Then

Selection.Interior.Color = Range("A" & i).Interior.Color

Exit For

End If

Next i

End Sub

Sachant que je conserve ma liste d'activité et les couleurs associées (de A5 à A33), vu que je m'en sers dans une seconde feuille pour calculer les équivalents temps plein affectés à chaque activité, le nombre approximatif de dossiers faits... (ex formule : =NB.SI(planning!$D$5:$M$45;planning!A5)/10),

ne peut-on pas associer un bouton avec une case dédiée, pour le remplissage du planning (ex : le bouton 1 pour l'activité 1 remplira le planning avec le texte et la couleur de la case A3, le bouton 2 / activité 2 remplira avec le texte et couleur de la case A4...) ???

Lien vers le commentaire
Partager sur d’autres sites

alors ca devient délicat si tu as absolument besoin des boutons...

en fait je ne sais pas si on peut (en tout cas je ne sais pas comment) récupérer l'info d'un bouton à savoir son nom, sa couleur ou même la cellule sur laquelle il est positionné

ce qui rend ce que tu veux faire pas très évident, ou en tout cas un peu chiant puisque la seule solution que je verrai serait de paramétrer pour chaque bouton une couleur et un nom d'activité propre (x30 donc)

par contre je peux te proposer de simuler un bouton avec un simple cellule, en collant simplement ce code dans la page VBA de la feuille que tu utilises (et non dans un module ni dans le code du workbook)

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)If Not Intersect(Target, Range("A5:A35")) Is Nothing Then   Cancel = True   nom_act = Target.Value   col_act = Target.Interior.Color   Application.InputBox(Prompt:="Selectionnez la plage à remplir", Type:=.Select   Selection.Interior.Color = col_act   For Each cell In Selection       cell.Value = nom_act   Next cellEnd IfEnd Sub

pour que ca marche tu dois écrire dans les cellules "A5:A35" le nom de tes activités en attribuant la couleur que tu veux à la cellule (donc pas de bouton !) et ensuite double-clic sur une de ces celulles, et ca te demandera de sélectionner une plage pour y écrire le nom de l'activité avec la couleur correspondante

ca marche ?

Lien vers le commentaire
Partager sur d’autres sites

Ca fonctionne aussi et c'est pas plus mal comme ça finalement (vraiment moins lourd que de paramétrer un bouton par activité).

Par contre, est-ce qu'il est possible d'inverser la méthode de mise à jour du planning, je veux dire faire la sélection des plages à remplir avant de faire le double clic sur la cellule de l'activité souhaitée et peut-être comme ça éviter la boîte de dialogue "sélectionnez la plage à remplir".

Mais si c'est trop compliqué, laisse tomber, c'est déjà vraiment bien comme ça et moins long à remplir qu'avec la déroulante.

Lien vers le commentaire
Partager sur d’autres sites

ben justement ca me semble pas possible puisque cliquer sur une cellule la sélectionne, donc ta sélection change à ce moment...

"a la limite" ce qui pourrait être possible c'est de faire l'inverse, mais on garde la boite de dialogue

ca reviendrait à faire ta sélection, puis appuyer sur un bouton qui demanderait "sélectionnez l'activité"

Lien vers le commentaire
Partager sur d’autres sites

de rien !

et juste un detail: on peux se passer du "for each cell in sletecion" etc.

le code devient:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)If Not Intersect(Target, Range("A5:A35")) Is Nothing Then   Cancel = True   nom_act = Target.Value   col_act = Target.Interior.Color   Application.InputBox(Prompt:="Selectionnez la plage à remplir", Type:=.Select   Selection.Interior.Color = col_act   Selection.Value = nom_actEnd IfEnd Sub
Lien vers le commentaire
Partager sur d’autres sites

Salut,

J'ai essayé d'enlever "Application.InputBox(Prompt:="Selectionnez la plage à remplir", Type:=8).Select" pour éviter d'avoir la boîte de dialogue, mais ça ne fonctionne plus (ça aurait été trop simple :transpi: ).

J'ai donc 1 autre requête (selon que l'une ou l'autre soit réalisable) :

1) est-il possible d'éviter cette boîte de dialogue pour raccourcir le remplissage du planning ? En gros, double clic sur l'une des activités en A5 - A33 et je sélectionne directement les cases en remplir (D5:M47) sans passer par cette boîte ?

2) si pas possible, y'a moyen de positionner cette boîte de dialogue hors du planning à un endroit fixe (genre coin supérieur gauche de la boîte en O5) ?

Merci. :ouioui:

Lien vers le commentaire
Partager sur d’autres sites

la seule solution que je verrai serait de paramétrer pour chaque bouton une couleur et un nom d'activité propre (x30 donc)

Dans un module

Sub auto_fill(nom_act, col_act)selection.Value = nom_actselection.interior.color = col_actEnd Sub

ensuite tu associes à chaque bouton que tu souhaite créer le code suivant :

Sub Bouton1_Clic()nom_act = "Activité 1"col_act = RGB(12,95,216)Call auto_fill(nom_act, col_act)End Sub
Sub Bouton2_Clic()nom_act = "Activité 2"col_act = RGB(54, 203, 165)Call auto_fill(nom_act, col_act)End Sub

etc.

EDIT: je précise un peu ma réponse, qui je l'avoue était plus que concise par manque de temps...

Donc déjà c'est normal que plus rien ne marche si tu enlève la boite de dialogue, c'est elle qui permet de sélectionner la plage de cellule à remplir. Sans ça, le programme ne sait pas où écrire le nom de l'activité !

Pour éviter cette boite, il faut trouver un autre moyen de sélectionner la plage de cellules, or une sélection manuelle est annulée dès que tu sélectionne une autre cellule ! il faut donc soit choisir d'abord l'activité puis sélectionner la plage, ce qui n'est possible que via cette boite de dialogue; soit sélectionner la plage d'abord puis choisir l'activité mais du coup sans passer par une sélection de cellule (typiquement un vrai bouton)

La solution que je te propose ci-dessus me semble la plus efficace, l'inconvénient est que tu devras te faire chier à coder chaque bouton, et que toute modif doit intervenir dans le code directement

une autre solution consisterait à ajouter une colonne a coté de ta liste d'activité, qui servirait à "cocher" l'activité correspondante, puis sélectionner la plage de cellule dans un second temps, et enfin à activer activer un programme unique à l'aide d'un bouton tout aussi unique (le programme regarderait quelle activité est cochée, puis remplirait la plage de cellule indiquée avec les infos de l'activité choisie)

Cela me parait moins pratique à l'usage (il faudrait à tout prix éviter que deux activités soient cochées en même temps, donc implémenter une vérification etc)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...