[VBA] selectionner et remplir des cases

Fermé
guiom - 24 juil. 2008 à 16:36
 guiom - 30 juil. 2008 à 15:09
Bonjour,

J'utilise une petite macro qui me permet de colorer des cases dans un tableau:
(Ces plages colorées représente les durées de certaines étapes d'un procédé et elles s'enchainent - chaque ligne représente une étape du procédé - chaque case représente 5 minutes)

Sub Remplir_une_cellule_et_bordures()
Dim Arr()
Arr = Array("A1:C1", "D2:G2", "H3:I3", "J4:L4")'plages de temps colorés à ajuster
For Each elt In Arr
With Worksheets("TEST") 'nom feuille à adapter
With .Range(elt)
With .Borders
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 15
End With
With .Interior
.ColorIndex = 8
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
End With
End With
Next
End Sub

Maintenant, je voudrais pouvoir ajuster la taille et la position des plages colorées en fonction de la durée de chacune des étapes (calculées dans un tableau sur une autre feuille).
Je voudrais donc agir sur:

Arr = Array("A1:C1", "D2:G2", "H3:I3", "J4:L4")'plages de temps colorés à ajuster

pour changer le début et la fin de chaque plage.

Pour cela, il serait pratique de passer en coordonnées ‘’RC ‘’(où A1= R1C1) et de modifier les coordonnées RiCj d'une case en jouant sur i et j.
Enfin je pense!! parce que à partir de là, je suis perdu!!

Je suis complètement novice...Toute aide ou commentair sont les bienvenues
Merci.

Guiom

PS : étant nouveau sur le forum, je vous prie d'excuser mes éventuelles erreurs de débutant!

9 réponses

eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
24 juil. 2008 à 17:12
Bonjour,

tu peux définir une plage avec range(cells(i1,j1),cells(i2,j2)) avec :
i1 et i2 : n° de lignes
j1 et j2 : n° de colonnes

Tu as également .offset() et .resize() qui pourraient te servir :
[A1].offset(1,2).resize(2,8)

.offset te décale ta référence A1 de 1 ligne et 2 colonnes => C2
.resize(2,8) te redimensionne la plage à 2 lignes sur 8 colonnes. => C2:J3

eric
0
Bonjour eriic et merci pour ta réponse.
Pourrais tu me montrer plus précisément comment intégrer ces fonctions??
Je n'ai vraiment aucune notions en code!! pardonne mon ignorance!
merci!!
0
Je pense que les fonctions que tu me présente sont exactement celles qui pourront résoudre mon problème.
Mais j'ai beau essayer, je n'arrive pas à les insérer dans le code précédent! un exemple serait le bien venu!
Merci pour ton aide!
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
24 juil. 2008 à 23:51
ma réponse de tout à l'heure a disparue...
Un exemple tu en as au post 1.
Si tu veux qcq chose de plus précis pose une question plus précise que changer le début et la fin de chaque plage.
Je t'ai donné 2 façon de faire, maintenant moi je ne sais pas de combien tu veux décaler l'origine ni de combien tu veux changer la taille. Ca c'est toi qui le sais
eric
0
Merci de m'accorder de ton temps eric!

J'ai bien compris le principe sur lequel reposent les deux solutions que tu me proposes. Néanmoins, je n'arrive pas à écrire le code de la macro. Comme je l'ai dit, je suis complètement débutant! Je n'ai jamais eu à écrire du code jusqu'à aujourd'hui! Si c'est possible, je voudrais que tu reprenne ma macro et que tu y insères une de tes fonctions. Ca me permettrai de voir la logique d'écriture. (je ne sais pas comment déclarer une variable, faut il déclarer une fonction pour utiliser Range...j'y connais vraiment rien!!!)

D'un autre coté, pourrais tu m'expliquer comment peut-on écrire une macro en coordonnées RiCj.
Par exemple, je voudrais transformer la plages ''A1:C1'' en ''R1C1:R1C3" dans la macro précédente. Que faut-il rajouter au code pour changer le système de coordonnées??
En passant en coordonnées RiCj, je pourrais faire varier la longueur (durée) et la position des plages colorés (début et fin) en jouant sur i et j.
i et j seront calculé dans un tableau à part...en passant par ce sénario là, j'arrive à voir une fin logique et rapide à mon problème (à peu près!)

Je me permet de te joindre mon fichier (tableau + macro) en éspérant que tu puisses mieux voir quel résultat je voudrais obtenir.
http://www.cijoint.fr/cjlink.php?file=cj200807/cijLv9jWVv.xls

Seul face à mon ordi, je me sens un peu au dépourvu...J'apprécie ton aide! Encore merci
Guiom
0

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

Posez votre question
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
25 juil. 2008 à 17:28
Même si ça correspond à ta description, ton besoin final n'a plus grand chose à voir.
C'est quand même plus complexe qu'une seule plage qu'il faut étendre...
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
25 juil. 2008 à 17:51
Voici une solution, je n'ai pas réutilisé ta macro

Je suis parti du principe que tous les procédés avaient 5 étapes...
Il faut que les noms indiqués soient définis, et que les durées soient saisies, c'est suffisant.
Ca donne ça :
Sub colorer()
    Dim c As Range
    Dim colDeb As Integer, ligDeb As Long
    Dim col As Integer, lig As Long, l As Integer
    Const nbprocédures = 5
    Const nbPeriodes = 8 * 12 ' 8h * 12 périodes de 5 min par heure
    ligDeb = Range("Début").Row
    colDeb = Range("Début").Column
    For Each c In Range("Durée")
        l = c.Value / 5 ' nombre de cellules à colorer
        Cells(ligDeb, colDeb).Offset(lig, col).Resize(1, l).Interior.ColorIndex = 3
        lig = (lig + 1) Mod nbprocédures    ' ligne procédure suivante
        col = (col + l) Mod nbPeriodes      ' colonne suivante à remplir
    Next c
End Sub

http://www.cijoint.fr/cjlink.php?file=cj200807/cijhNDgyJB.xls

Si tu as besoin d"explication demande...

eric
0
Mille mercis Eric!

Non seulement ta macro est très efficace mais en plus tu y as inséré des boutons et une boucle RAZ.
Ce ajouts permettent de simplifier l'interface et renderont cet outil encore plus performant!

Malheuresement, le remplissage du suivi du procédé ne commence pas forcément à l'étape 1
(le procédé tourne 24h sur 24, en arrivant à 5h, le procédé peut être en milieu d'étape 3 par exemple)
Est il possible de faire varier la position de "Début"?

Le cahier des charges de l'application Excel à développer (et qui avance principalement grâce à ton aide) impose un sénario assez figé.
En résumé: l'opérateur doit
1. sélectionner les "ingrédients" dans des listes déroulantes.
En fonction de ces choix, la durée de chacune des étapes est calculée (tableau des durée). (ça marche)
2. sélectionner l'étape en cours et l'heure de fin de cette étape.
En fonction ce ces choix, le cheminement théorique est calé. On sait à quelle étape on commence le remplissage du tableau et on peut calculer la durée qu'il reste pour finir cette première étape. Le reste s'enchaine simplement dans l'ordre et en fonction des durées calculés dans le tableau précédent.
3. imprimer le cheminement théorique des étapes du procédé pour les trois postes de la journée.
3 macros identiques vont donc tourner sur 3 tableaux où le début du tableau n+1 correspond à le fin du tableau n.
(un tableau par poste (matin , après-midi et nuit) est nécessaire car Excel n'a pas assez de colonnes pour faire les trois postes sur une journée! puis un tableau par poste est plus lisible pour les opérateurs)

En éspérant que ce complément d'informations te permettera de m'aider encore un peu pour finir cette macro!
J'apprends beaucoup en décortiquant tes fonctions, même si je ne comprend pas encore toute la logique d'écriture!
Merci pour ton aide
Cordialement
Guiom
0
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 7 243
28 juil. 2008 à 14:50
Je n'ai pas tout lu dans le détail mais pour avancer un peu et rester simple, teste en ajoutant ça devant 'for each....' :
    lig = CLng(InputBox("Démarrer à l'étape (1 à 5) :", "Paramètres de début", 1)) - 1
    col = CLng(InputBox("Décalage (nombre de tranches de 5 minutes) :", "Paramètres de début", 0))

Pas sûr que ce soit vraiment que tu veuilles.
Bien sûr si tu demandes un démarrage à l'étape 3 avec un décalage de 10, l'étape 2 semble démarrer avant...mais c'est sur une heure postérieure en fait.
Si besoin je te laisse modifier et faire le calcul pour une saisie de l'heure de début à la place d'un décalage

eric
0
Merci pour ton aide eric.
Les différentes idées que tu m'as proposé m'ont permis de beaucoup avancé.
A bientôt pour d'autres questions!!
Guiom

(PS je n'ai pas réussi à passer la discussion en résolu)
0