Remplissage conditionnel et autres
Salut à tous,
Voila, je suis entrain d'essayer péniblement de faire un script vba mais je possède peu de connaissances sur la syntaxe de ce dernier
J'ai avancé un peu en prenant des bouts de codes par ci par là et en les adaptant mais là j'arrive à plus que je ne peux
Désolé par avance de la longueur du message mais je veux donner toutes les indications pour être précis!
Donc, voici la situation.
Objectif général:
À partir d'un calendrier associant jours civiques à des jours cycle (onglet Calendrier), je veux générer un nouveau classeur qui aura intégré mon horaire en conservant la mise en forme des cellules (onglet Form) et découpé le calendrier en un onglet par semaine, les onglets étant renommés avec date debut/fin de semaine.
Étapes du script déjà faite
- Mettre en forme les dates (concaténer la date)
- Transposer les colonnes en lignes pour adapter la mise en forme
- Découper les semaines en onglets (7 jours par onglet)
- Exporter vers un nouveau fichier excel
Code pour tout ça
Sub Etape1()
' Concatenation des Dates et des Jours Cycle
Sheets("Calendrier").Select 'selectionne la feuille
FinLigne = ActiveSheet.UsedRange.Rows.Count + 1 'Variable nombre de lignes
Numeroligne = 2 'Variable ligne en cours
While Numeroligne < FinLigne
Sheets("Calendrier").Range("H" & Numeroligne).Value = Range("C" & Numeroligne).Value & " " & Range("B" & Numeroligne).Value & " " & Range("A" & Numeroligne).Value
Numeroligne = Numeroligne + 1
Wend
'Remplit l'onglet Raw qui servira de matrice pour le calendrier final
Worksheets("Calendrier").Range("H2:H312").Copy Worksheets("Raw").Range("A1")
Worksheets("Calendrier").Range("D2:D312").Copy Worksheets("Raw").Range("B1")
'Change la casse pour 1ere lettre en majuscule
Sheets("Raw").Select
For Each x In Range("A1", "B311")
x.Value = Application.Proper(x.Value)
Next
'Transposer les cellules et colonnes
Sheets("Raw").Activate
Range("A1:B311").Select
Selection.Copy
Sheets("Ordonne").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Range("A1").Select
'Creer un onglet avec 7 jours + colonne 1 avec intitulé
Dim wsData As Worksheet 'Sheet with data to parse
Dim FirstCol As Long 'This is the first column to transfer
Dim ColCnt As Long 'This is how many columns in a group to transfer
Dim LastCol As Long 'check row1 to see how many columns of data there are
Dim NewSht As Long 'how many new sheets will be created
FirstCol = Application.InputBox("Which column is the first 'data column' to transfer?" _
& vbLf & "(A=1, B=2, C=3, etc...)" _
& vbLf & "(All columns to the left will appear on every sheet)", _
"First Data Column", 2, Type:=1)
If FirstCol = 0 Then Exit Sub
ColCnt = Application.InputBox("How many data columns are in each group?", _
"Groups of Columns", 7, Type:=1)
If ColCnt = 0 Then Exit Sub
Set wsData = ActiveWorkbook.Sheets("Ordonne")
Application.ScreenUpdating = False
With wsData
LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
For NewSht = FirstCol To LastCol Step ColCnt
Sheets.Add , After:=Sheets(Sheets.Count)
.Columns(1).Resize(, FirstCol - 1).Copy Range("A1")
.Columns(NewSht).Resize(, ColCnt).Copy Cells(1, FirstCol)
Next NewSht
End With
Application.ScreenUpdating = True
'Exporter
ActiveWorkbook.SaveAs Filename:="I:\Planif\OUT\2015.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
Dim ws As Worksheet
With Application
.DisplayAlerts = False
.ScreenUpdating = False
For Each ws In Worksheets
If InStr(1, ws.Name, "Feuil", vbTextCompare) = 0 Then ws.Delete
Next ws
.DisplayAlerts = True
.ScreenUpdating = True
End With
ActiveWorkbook.Save
End SubCe que je ne sais pas faire dans mon script existant
- Dans mon script existant, le script me demande à partir de quelle colonne commencer et combien de jours par onglet. C'est un popup (message box). C'est inutile: il faut qu'il commence à la colonne 2 (B) et prenne 7 jours par onglet. Pas besoin de le demander mais je ne sais pas comment lui dire
Bon, c'est clair à ce stade qu'il y a d'autres étapes à insérer avant l'exportation et c'est là que je bloque! Voici le détail de ce que le script devrait faire en plus.
- Se placer dans la case B2 de l'onglet Ordonne et déterminer combien de cellules sont à traiter sur la ligne pour après utiliser cette données et faire une boucle (ça me permettra par la suite d'adapter le script pour ne faire que la première étape par exemple).
- Pour la plage de données déterminée ci dessus (de colonnes en fait), analyser le contenu de chaque cellule (B2, C2, D2, etc... et le comparer à la plage B2:S2 de l'onglet Form (ma matrice horaire).
Cette action a pour but de déterminer les cours à copier de Form vers Ordonne pour chaque jour de la semaine
Exemple:
Le script analyse la case "L2" de Ordonne. Le contenu est "5" ce qui signifie que le Jeudi 5 septembre est un jour 5. Il va voir quels cours il y a dans les jours cycle disponible de Form. Il balaye les cases B2 à S2 et détermine que le jour 5 correspond à la colonne "F" - Lorsque le script a déterminé le jour cycle correspondant, copier coller les cellules i4:i11 de Form dans x3:x10 de Ordonne (i représentant la lettre de la colonne de Form qui correspond au jour cycle indiqué dans la colonne x analysée de Ordonne)
Exemple suite: le script copie les cases F4:F11 de Form dans les cases L3:L10 de Ordonne en gardant la mise en forme des cellules (aligné en haut à gauche + caractère gras et couleur associée) - Le script réalise les 2 opérations précédentes jusqu’à ce que tout le tableau ordonne soit complété.
- Il me faut ajouter un remplissage conditionnel pour des jours cycle particulier.
Si le contenu de la cellule analysée est une valeur alphanumérique (1 à 18), il fait ce que je viens de dire.
Si le contenu de la case de Form est "*" (oui je sais, je vais changer ça par WE ou autre car le wildcard sème le trouble!) ou "congé", alors il ne remplit rien et passe à la cellule suivante à analyser.
Si le contenu de la case est "Pédago" ou "Reprise" (les termes ne sont pas dans la matrice mais je vais les mettre), alors il met le fond des cellules X3:x10 de Form en gris clair.
Si c'est autre chose, alors il met un messagebox pour me dire "le contenu de la case est xxx. impossible" et il arrete le script: Ca me dira que ma matrice a un problème et donc que je dois modifier - Quand tout ça est fait, le script me génère de nouveaux onglets à partir de Ordonne en mettant 7 jours par onglet (comme mon script), renomme les onglets (voir après) et envoie les onglets renommés dans un nouveau classeur qu'il enregistre et ferme.
Pour le format de renommage des onglet Feuilxx, je voudrais que ça donne E1-15janv à 22janv
E1 pour les colonnes B à BZ de Ordonne
E2 pour les colonnes CA à FT
E3 pour la fin
Pour les dates, le jour et le mois tronqué aux 4 premiers caractères. Là encore, ça peut poser problème car le jour séparé du mois en termes de données se trouvent dans l'onglet Calendrier... Je ne peux pas reprendre le contenu des cellules de la ligne 1 de Ordonne car je dépasse les 31 caractères!
Là je ne sais pas pour la chronologie de la séquence du script car à moins qu'on puisse dire au script d'exporter à partir du 5ème onglet, ça sera peut être plus facile d'exporter les onglets qui contiennent dans leur nom le terme Feuil et une fois dans le fichier exporté, de renommer selon. Sauf qu'à ce moment là, on n'a plus la référence des cellules de Ordonne...
Voila, c'est un peu (beaucoup) long mais je pense que c'est précis
Je pense que c'est pas bien compliqué à faire mais j'avoue que la syntaxe me perds
Je joins le fichier excel brut et celui une fois que j'ai lancé mon script
Merci d'avance à ceux qui auront pris le temps de lire
Frédéric
Bonjour,
Pour obtenir un planning hebdomadaire à partir des éléments bruts et des règles de constitution, je me contenterais pour ma part de 3 feuilles :
- une feuille planning, affichant le planning, munie d'un sélecteur permettant de définir la semaine qu'on veut afficher et qui affichera le planning de la semaine sélectionnée ! (avec sélection automatique de la semaine en cours à l'ouverture...)
- une feuille pour ta base d'éléments affichables (peut-être ta feuille Form ?)...
- une feuille pour les tables nécessaires à l'utilisation de la feuille précédente (définition des cycles, jours de repos, etc.)
Cordialement.