Remplissage conditionnel et autres

30forumscriptfait.xlsm (112.39 Ko)

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 Sub

Ce 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.

Rechercher des sujets similaires à "remplissage conditionnel"