[VBA] selectionner et remplir des cases
guiom
-
guiom -
guiom -
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!
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!
A voir également:
- [VBA] selectionner et remplir des cases
- Organigramme a remplir word - Guide
- Selectionner texte sur pdf - Guide
- Comment sélectionner un message sur whatsapp pour y répondre - Guide
- Selectionner toutes les photos google photo - Guide
- Remplir et signer pdf - Guide
9 réponses
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
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
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!!
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!!
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
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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...
C'est quand même plus complexe qu'une seule plage qu'il faut étendre...
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 :
http://www.cijoint.fr/cjlink.php?file=cj200807/cijhNDgyJB.xls
Si tu as besoin d"explication demande...
eric
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
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
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
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....' :
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
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