IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

Remplissage conditionnel et autres [XL-2010]


Sujet :

Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 4
    Points
    4
    Par défaut 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

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    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 x310 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 X310 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éricForumScriptFait.xlsmForumScriptPasFait.xlsm

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 665
    Points : 5 803
    Points
    5 803
    Par défaut
    •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
    C'est ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FirstCol =2
    ColCnt  =7
    •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).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    derniere_colonne = Sheets("Ordonne ").Range("B2").End(xlToRight).Column
    Une simple recherche t'aurais donné la réponse ...

    •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
    Pas bien sur d'avoir compris ce que tu cherches ici, peut être avec la fonction find

    Pour le reste je n'ai pas trop le temps d'y regarder tout de suite mais:
    Peu de gens ouvrent les pièces jointes en premier post, surtout en xlsm http://www.developpez.net/forums/d84...s-discussions/

    Quelques imprim écran avant/après quand tu décris tes étapes pourrait aidé a mieux visualiser ce que tu demande, et donc aidé a trouvé une solution.

  3. #3
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Tout d'abord, merci de ta réponse si rapide!

    Désolé pour les fichiers xlsm... je comprends le coté sécurité des macros...

    Voici donc les captures d'écrans


    La matrice Horaire (Onglet Form)
    Nom : Matrice Horaire.jpg
Affichages : 510
Taille : 201,6 Ko


    Le Calendrier brut de départ (Onglet Calendrier)
    Nom : Matrice Calendrier JC.jpg
Affichages : 409
Taille : 105,2 Ko


    Script tourne: Onglet Calendrier: Concat des dates
    Nom : Script Run01 Concat.jpg
Affichages : 415
Taille : 76,1 Ko


    Puis remplit onglet Raw en associant Date et Jour cycle
    Nom : Script Run02 Raw.jpg
Affichages : 429
Taille : 50,8 Ko


    Remplit Onglet Ordonne et transpose
    Nom : Script Run03 Ordon.jpg
Affichages : 354
Taille : 32,8 Ko


    Génère Onglets avec 7 jours
    Nom : Script Run04 Feuilx7j.jpg
Affichages : 412
Taille : 38,5 Ko


    À la fin, une flopée d'onglets Feuilxxx. Ces onglets sont exportés dans un nouveau classeur qui est sauvegardé
    Nom : Script Run Tabs.jpg
Affichages : 352
Taille : 16,8 Ko


    Pour ce qui est de mes recherches, j'ai commencé mais je ne suis pas sur que ma logique procédurale soit la bonne donc je n'avais rien posté...

    Voici ce que j'ai trouvé jusqu'à présent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    Sub Horaire()
     
      ' Selectionne la première cellule à analyser
    	Range("B2").Select
     
    ' Boucle tant que tombe pas sur une cellule vide => normalement, pas de cellule vide dans le range!
    	Do While Not (IsEmpty(ActiveCell))
     
    'recupère la valeur de la cellule active
       	Dim Nature = activecell.value
     
    	   	'action.... detecte si numerique
    	   	If IsNumeric(Nature) = True Then
    	   		'copie coller.....
    	   	Selection.Offset(1, 0).Select 'avance à la colonne suivante
     
     
    	   	'action... detecte si congé ou Off
    	   	ElseIf Nature.value = "Congé" OR "Off" Then
    	   		'à voir
    	   	Selection.Offset(1, 0).Select 'avance à la colonne suivante
     
     
    	   	'action... detecte si pédago
    	   	ElseIf Nature.value = "pédago" Then
    	   	Selection.Offset(1, 0).Select 'avance à la colonne suivante
     
    	   	'action... erreur si aucun des 3 precedents  
          	        Else
        		'afficher le contenu de la cellule ds messagebox
     
     
          	End if
     
    	Loop
     
    End Sub

    De ce que je comprends, oui, find est probablement la fonction à utiliser dans la boucle sauf que je ne sais pas si en fait c'Est la bonne logique... je m'explique:

    Je ne cherche pas une valeur dans le tableau, je veux que pour chaque case du range (de B2 jusqu'à la dernière case - que je peux renseigner directement au pire plutôt que de trouver la dernière case de la ligne qui est remplie...), la fonction (find?) étudie le contenu de la case selectionnée.
    Si le contenu est un numero => action 1
    Si le contenu est "Congé" ou "Off" => action 2
    Si le contenu est "Pédago" => action 3
    Si le contenu est autre chose que les 3 précédents choix => message box: = la case selectionnée F3 contient le texte "ddd" =

    Action 1: trouve la valeur numérique correspondante dans l'onglet Form dans le Range B2:S2 puis fait un copier coller en conservant la mise en forme de Form
    Action 2: fait rien, passe au suivant
    Action 3: Change le fond des cases de la colonne pour les lignes C à F en gris clair
    Action 4: popup et arrête le script


    Je cherche en parallèle, j'attends pas de réponses toutes cuites dans le bec mais il semble y avoir tellement de façon différentes de faire la même chose que je m'y perds!

    Merci encore!

    Fred

  4. #4
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Voila où j'en suis...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    ' Selectionne la première cellule à analyser
        Sheets("Ordonne").Range("B2").Select
     
    ' Boucle tant que tombe pas sur une cellule vide => normalement, pas de cellule vide dans le range!
        Do While Not (IsEmpty(ActiveCell))
     
        'recupère la valeur de la cellule active
        Dim Nature As String
        Nature = ActiveCell.Value
        x = ActiveCell.Row
        y = ActiveCell.Column
     
            'action.... detecte si numerique
            If IsNumeric(Nature) = True Then
                'copie coller.....
     
                'se positionne sur Form à B2 et cherche la valeur Nature
                Sheets("Form").Range("B2:S2").Find(What:=Nature, After:=ActiveCell, LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
                C = ActiveCell.Column
                Set MaPlage = Columns(C).Rows("4:11")
                MaPlage.Select
     
                Selection.Copy
                Sheets("Ordonne").Range(x, y).Activate
                'il faut recuperer les coordonnées de la colonne originale de Ordonne. Genre variable D!!!
                Selection.PasteSpecial Paste:=xlPasteValues
                Selection.PasteSpecial Paste:=xlPasteFormats
                Selection.PasteSpecial.Application.CutCopyMode = False
                'il faut lui indiquer de coller dans cette colonne des lignes 3 à 10 ou est-ce que le code suivant suffit?
                    Selection.Offset(0, 1).Select
                'Passe à la colonne suivante
                Sheets("Ordonne").Range(x, y).Activate
                    Selection.Offset(1, 0).Select 'avance à la colonne suivante

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 665
    Points : 5 803
    Points
    5 803
    Par défaut
    Citation Envoyé par fredetchic Voir le message
    Je ne cherche pas une valeur dans le tableau, je veux que pour chaque case du range (de B2 jusqu'à la dernière case - que je peux renseigner directement au pire plutôt que de trouver la dernière case de la ligne qui est remplie...), la fonction (find?) étudie le contenu de la case selectionnée.
    Si le contenu est un numero => action 1
    Si le contenu est "Congé" ou "Off" => action 2
    Si le contenu est "Pédago" => action 3
    Si le contenu est autre chose que les 3 précédents choix => message box: = la case selectionnée F3 contient le texte "ddd" =
    Dans ce cas une suite de if else est plus indiquée, voire un select case mais je ne suis pas sur qu'on sur qu'on puisse dire case numeric a vérifier

    Action 1: trouve la valeur numérique correspondante dans l'onglet Form dans le Range B2:S2 puis fait un copier coller en conservant la mise en forme de Form
    Là tu fais un find ou une rechercheV

    Action 2: fait rien, passe au suivant
    Ca c'est facile a programmer

    Action 3: Change le fond des cases de la colonne pour les lignes C à F en gris clair
    lignes C a F ? c'est les colonnes qui ont des lettres non?
    Dans tout les cas tu peux avoir la syntaxe grace a l'enregistreur de macro (si besoin il y a un excellent tuto là dessus dans le section tuto)

    Action 4: popup et arrête le script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    msgbox "blabla"
    exit sub
    Conernant ton code, la plupart des select sont inutiles et sont une perte de temps en vba
    Voici comment je modifirais le code que tu as posté: (attention code non testé peut être des petites coquilles)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
    dl = sheets("ordonnée").range("B" & rows.count).end(xlup).row
    for each cell in sheets("ordonnée").range("B2:B" & dl)
     
    Dim Nature As variant 'pourquoi string sachant qu'il peut être numeric?
        Nature = cell.Value
        x = cell.Row
        y = cell.Column
     'action.... detecte si numerique
            If IsNumeric(Nature) = True Then
                'copie coller.....
     
                'se positionne sur Form à B2 et cherche la valeur Nature
                C = Sheets("Form").Range("B2:S2").Find(What:=Nature, After:=ActiveCell, LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Column
                Set MaPlage = Columns(C).Rows("4:11")
                MaPlage.Copy
                'il faut recuperer les coordonnées de la colonne originale de Ordonne. Genre variable D!!!
                 Sheets("Ordonne").cells(x, y).PasteSpecial Paste:=xlPasteValues
                 Sheets("Ordonne").cells(x, y).PasteSpecial Paste:=xlPasteFormats
                Application.CutCopyMode = False
                'là j'ai pas bien compris ce que tu faisait avec tes selection et offset
    next cell

  6. #6
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Bon, ca avance

    Il y a avait une petit coquille dans le nom de la feuille Ordonne et il manquait un End if avant le Next cell

    Par contre, j'ai une erreur 13 incompatibilité de type sur le find. J'ai viré la déclaration de la variable Nature et je me demande si c'est pas la source du problème (Nature, pas la déclaration). Si on déclare pas une variable, elle peut prendre n'importe quel type? Genre numérique, string, etc.. ?

    Pourtant il me semblait qu'avec le if, la première chose que fait le script est de tester si la variable est numérique: si c'est pas le cas, alors elle rentre pas dans le if.

    Je continue à chercher...

    Action 1: rechercheV : je vais regarder la différence avec Find...

    Action 3: Oui, mon erreur! Ce sont les lignes sur la colonne sélectionnée dans Ordonne

    Action 4: tout con


    Pour ce qui est du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Nature As variant 'pourquoi string sachant qu'il peut être numeric?
    Si je te disais que c'est du code copié/collé directement... genre du essai erreur! J'ai supprimé la ligne car en effet, elle est tantôt numeric (1 à 18), tantôt string (Congé, Pédago, etc..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'là j'ai pas bien compris ce que tu faisait avec tes selection et offset
    Oh, tout simplement ce que tu as remplacé par Next ^
    Le but du offset était de passer à la cellule suivante sur la droite.

  7. #7
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    On se rapproche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    dl = Sheets("Ordonne").Range("B" & Rows.Count).End(xlUp).Row
    For Each cell In Sheets("Ordonne").Range("B2:B" & dl)
        Nature = cell.Value
        x = cell.Row
        y = cell.Column
        'action.... detecte si numerique
            If IsNumeric(Nature) = True Then
                'copie coller.....
     
                'se positionne sur Form à B2 et cherche la valeur Nature
                C = Sheets("Form").Range("B2:S2").Find(What:=Nature, LookAt:=xlWhole).Column
                Sheets("Form").Select
                Set MaPlage = Columns(C).Rows("4:11")
                MaPlage.Copy
                 x = x + 1
                 Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteValues
                 Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteFormats
                Application.CutCopyMode = False
            End If
     
    Next cell
    Ca marche pour la 1ère colonne mais on aurait dit que dès qu'il a remplit la condition, il sort de la boucle (genre ne passe pas à la case suivante).
    J'ai rajouté le x+1 car sinon il y avait un décalage
    J'ai activé la feuille Form avant MaPlage car j'ai l'impression que c'est pour ca que ca n'allait pas et que vba comparait les mauvaises cellules (en fait de la mauvaise feuille)

  8. #8
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Ayez à 99% Merci beaucoup de ton aide!

    Il me reste juste une petite erreur à traiter.

    Voici le code actuel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    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:H307").Copy Worksheets("Raw").Range("A1")
     
        Worksheets("Calendrier").Range("D2:D307").Copy Worksheets("Raw").Range("B1")
     
    'Change la casse pour 1ere lettre en majuscule
     
        Sheets("Raw").Select
        For Each x In Range("A1", "B306")
        x.Value = Application.Proper(x.Value)
        Next
        
     
    'Transposer les cellules et colonnes
     
        Sheets("Raw").Activate
        Range("A1:B306").Select
        Selection.Copy
        Sheets("Ordonne").Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=True
        Range("A1").Select
     
    'J'ai du lui declarer physiquement la dernière cellule car c'est ce qui causait l'erreur.. pas grave, ça fonctionne et c'est pas non plus le gros ajustement!  
    For Each cell In Sheets("Ordonne").Range("B2:KU2")
        Nature = cell.Value
        x = cell.Row
        y = cell.Column
        'action.... detecte si numerique
            If IsNumeric(Nature) = True Then
                'copie coller.....
                'se positionne sur Form à B2 et cherche la valeur Nature
                C = Sheets("Form").Range("B2:S2").Find(What:=Nature, LookAt:=xlWhole).Column
                Sheets("Form").Select
                Set MaPlage = Columns(C).Rows("4:11")
                MaPlage.Copy
                x = x + 1
                Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteValues
                Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteFormats
                Application.CutCopyMode = False
       
            End If
    
            If Nature = "Pédago" Then
                C = Sheets("Form").Range("W2").Find(What:=Nature, LookAt:=xlWhole).Column
                Sheets("Form").Select
                Set MaPlage = Columns(C).Rows("4:11")
                MaPlage.Copy
                'il faut recuperer les coordonnées de la colonne originale de Ordonne. Genre variable D!!!
                x = x + 1
                Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteValues
                Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteFormats
                Application.CutCopyMode = False
            End If
            
            If Nature = "Reprise" Then
                C = Sheets("Form").Range("X2").Find(What:=Nature, LookAt:=xlWhole).Column
                Sheets("Form").Select
                Set MaPlage = Columns(C).Rows("4:11")
                MaPlage.Copy
                'il faut recuperer les coordonnées de la colonne originale de Ordonne. Genre variable D!!!
                x = x + 1
                Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteValues
                Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteFormats
                Application.CutCopyMode = False
            End If
    
            
            If Nature = "E" Then
                C = Sheets("Form").Range("T2").Find(What:=Nature, LookAt:=xlWhole).Column
                Sheets("Form").Select
                Set MaPlage = Columns(C).Rows("4:11")
                MaPlage.Copy
                'il faut recuperer les coordonnées de la colonne originale de Ordonne. Genre variable D!!!
                x = x + 1
                Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteValues
                Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteFormats
                Application.CutCopyMode = False
            End If
            
            If Nature = "Ligne" Then
                C = Sheets("Form").Range("U2").Find(What:=Nature, LookAt:=xlWhole).Column
                Sheets("Form").Select
                Set MaPlage = Columns(C).Rows("4:11")
                MaPlage.Copy
                'il faut recuperer les coordonnées de la colonne originale de Ordonne. Genre variable D!!!
                x = x + 1
                Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteValues
                Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteFormats
                Application.CutCopyMode = False
            End If
    
            If Nature = "Congé" Then
                C = Sheets("Form").Range("V2").Find(What:=Nature, LookAt:=xlWhole).Column
                Sheets("Form").Select
                Set MaPlage = Columns(C).Rows("4:11")
                MaPlage.Copy
                'il faut recuperer les coordonnées de la colonne originale de Ordonne. Genre variable D!!!
                x = x + 1
                Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteValues
                Sheets("Ordonne").Cells(x, y).PasteSpecial Paste:=xlPasteFormats
                Application.CutCopyMode = False
            End If
    
    Next cell
     
      
    '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 = 2
        ColCnt = 7
     
        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
     
    End Sub
    La j'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C = Sheets("Form").Range("X2").Find(What:=Nature, LookAt:=xlWhole).Column
    erreur 91 variable objet ou variable de bloc With non definie

    Tout le tableau est remplis, tout est ok, mise en forme et tout le kit, mais le script s’arrête juste avant de découper mes onglets de 7 jours!

    J'ai aussi épuré les options de find qui causait un pb... est-ce que c'est ca? Aucune idée...

    Mon gros problème c'est que je ne vois aucun WITH!!!!

  9. #9
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Août 2016
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    My God!! Jesus is Alive

    Tout est dans l'ordre et tout fonctionne 100%!

    L'erreur venait du fait que dans mon onglet Calendrier, il y avait 2 cases vides et vu que j'avais pas déclaré ce cas...

    Tout le reste marche!

    Ouf....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplissage conditionnel de champs
    Par Nerva dans le forum Débuter
    Réponses: 7
    Dernier message: 27/07/2010, 16h58
  2. [XL-2007] Remplissage conditionnel d'une combobox sur une partie seulement de la base
    Par csempere dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/06/2010, 14h52
  3. [AC-2007] Remplissage d'un contrôle en fonction du remplissage d'un autre
    Par Razorback dans le forum IHM
    Réponses: 7
    Dernier message: 19/05/2009, 09h29
  4. un remplissage conditionnel
    Par k_boy dans le forum Langage SQL
    Réponses: 7
    Dernier message: 08/01/2009, 11h47
  5. [Domi2] Liste conditionnelle à une autre
    Par matrims dans le forum IHM
    Réponses: 1
    Dernier message: 22/09/2006, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo