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

Macros et VBA Excel Discussion :

[XL 2015] Macro boucles imbriquées, déplacement cellules


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Points : 1
    Points
    1
    Par défaut [XL 2015] Macro boucles imbriquées, déplacement cellules
    Bonjour,

    J'ai un projet à réaliser pour mes études, dans lequel j'ai besoin de réaliser une macro qui permet de déplacer des valeurs d'une cellule à une autre, le tout en fonction de la valeur contenue dans la cellule.

    Je m'explique :

    Dans la colonne G, il est possible de rentrer des chiffres allant de 1 à 12, l'objectif étant de faire déplacer les valeurs contenues dans la ligne correspondante (Id, durée prev, et degré d'urgence) dans un second tableau. En fonction de la valeur contenue dans la colonne G, les valeurs Id, durée prev et degré d'urgences se situent dans des tableaux différents (donc 12 au total).

    La macro que j'ai essayé de réaliser est la suivante :

    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
    Sub Deplacement()
     
    Dim wsSource As Worksheet
    Dim wsCible As Worksheet
    Dim derniereLigne As Integer
    Dim tmpLigne As Integer
    Dim i As Integer
    Dim b As Integer
    Dim derniereboucle As Integer
    Dim x As Integer
    Dim y As Integer
    Dim z As Integer
     
     
    Set wsSource = Worksheets("Planning")
    Set wsCible = Worksheets("Planning")
     
    tmpLigne = 2
    derniereLigne = 101
    derniereboucle = 12
     
     
    For b = 1 To derniereboucle
     
    For i = 2 To derniereLigne
     
    'Si la colonne G contient 1
    If wsSource.Cells(i, "G").Value = "b" Then
     
    x = 15 + (b - 1) * 3
    y = 14 + (b - 1) * 3
    z = 16 + (b - 1) * 3
     
    'On copie les Lignes qui nous interessent
    wsCible.Cells(wsSource.Cells(i, 8), x).Value = wsSource.Cells(i, 5).Value
    wsCible.Cells(wsSource.Cells(i, 8), y).Value = wsSource.Cells(i, 3).Value
    wsCible.Cells(wsSource.Cells(i, 8), z).Value = wsSource.Cells(i, 6).Value
     
    tmpLigne = tmpLigne + 1
     
    End If
     
    Next i
     
    Next b
     
    End Sub
    Lorsque je clique sur le bouton déplacement, elle ne fonctionne pas et ne me renvoie aucun erreur.

    Pouvez vous m'aider ?

    PS : Le fichier se trouve en pièce jointe.

    Merci par avance !
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    bien que je n'ai absolument rien compris à ce que tu souhaites faire, puisque la colonne G contient des chiffres de 1 à 12, forcément il ne peut pas contenir la lettre b

    donc cette ligne ne se vérifie jamais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If wsSource.Cells(i, "G").Value = "b" Then
    si tu fait référence à la variable b, il faut enlever le guillemets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If wsSource.Cells(i, "G").Value = b Then
    De plus :

    - il est préférable d'indenter son code pour mieux s'y retrouver
    - tes deux variables Worksheet font référence à la même feuille "Planning"
    - ta variable tmpLigne ne sert à rien dans ce code
    - n'hésite pas à utiliser les bloc With/End With pour ne pas avoir à toujours recopier les mêmes choses, exemple

    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
            With wsSource
               'Si la colonne G contient 1
               If .Cells(i, "G").Value = "b" Then
     
                   x = 15 + (b - 1) * 3
                   y = 14 + (b - 1) * 3
                   z = 16 + (b - 1) * 3
     
                   'On copie les Lignes qui nous interessent
                   wsCible.Cells(.Cells(i, 8), x).Value = .Cells(i, 5).Value
                   wsCible.Cells(.Cells(i, 8), y).Value = .Cells(i, 3).Value
                   wsCible.Cells(.Cells(i, 8), z).Value = .Cells(i, 6).Value
     
               End If
            End With
    à vue d'oeil, même sans savoir ce que tu souhaites faire, y'a visiblement beaucoup plus simple pour écrire cette procédure et boucler sur les trois écritures en même temps.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse, j'ai corrigé le code et tout fonctionne correctement.

    J'ai un autre problème sur une autre macro qui est la suivante :

    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
    Sub Urgence3()
     
    Dim u As Integer 'ligne pour le degrŽ d'urgence
    Dim j As Integer 'jour du planning
    Dim c As Integer 'permet de donner la colonne de dŽplacement
    Dim l As Integer 'donne la ligne o dŽplacer
    Dim p As Integer
     
     
    For p = 0 To 1 Step 0.1
     
        For j = 1 To 12
           l = 7
     
            For u = 2 To 101
            c = 3 * j + 11
     
     
                    If Worksheets("Planning").Cells(u, 6).Value = 3 And Worksheets("Planning").Cells(u, 5).Value < Worksheets("hid_pla").Cells(4, c + 1).Value And Worksheets("Planning").Cells(u, 5).Value > Worksheets("hid_pla").Cells(4, c + 1).Value * (1-p)  And Worksheets("Planning").Cells(u, 7).Value = "" Then
                    'si l'urgence est a 3 et que la valeur de sa charge est infŽrieur ˆ la charge disponible du jour j et supŽrieur ˆ 0,9 et que absence de plannification
     
                    Worksheets("Planning").Cells(u, 7).Value = j
     
                    'dŽplacement des valeurs id, charge et degrŽ urgence
                    Worksheets("Planning").Cells(l, c).Value = Worksheets("Planning").Cells(u, 3).Value
                    Worksheets("Planning").Cells(l, c + 1).Value = Worksheets("Planning").Cells(u, 5).Value
                    Worksheets("Planning").Cells(l, c + 2).Value = Worksheets("Planning").Cells(u, 6).Value
     
                    l = l + 1
     
                    End If
     
                Next 'u
            Next 'j
        Next 'p
     
     
     
     
    End Sub
    Le fait d'ajouter un pas de 0.1 fait buguer Excel et il plante, est-ce que quelqu'un a une idée ?

    Merci d'avance

  4. #4
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    ta variable p est déclarée comme Integer, qui est un nombre entier compris en -32 768 à 32 767

    donc ta boucle For p = 0 To 1 Step 0.1 est une boucle infinie, à chaque tour de boucle la valeur de p est arrondie donc p vaut 0

    utilise plutôt un Type Single

    Dim p as Single (ligne 7 de ton code)

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup, ça fonctionne mieux maintenant

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Je travail avec Ojyns sur ce projet et un nouveau problème c'est présenté à nous

    En simplifiant légèrement, le but de notre macro est le suivant:

    On a une liste de tache caractérisée chacune par une charge (temps) différente. On dispose aussi d'un planning de 12 jours avec pour chaque jour une charge disponible. Notre but est de répartir l'ensemble de ses charges dans le planning à l'aide d'une macro.

    Pour cela, nous avons écrit la macro précédente qui compare l'ensemble des taches au 1er jours et y affecte les taches comblant 100% de la charge disponible restante, puis passe aux deuxièmes jours avec les taches restantes jusqu'au 12ème jour. Elle recommence ensuite cette boucle en diminuant le pourcentage à 90% de "comblement" sur toute la semaine, puis passe à 80%, 70% etc ...

    Une fois qu'une tache est identifiée comme correspondante à nos critères (pourcentage de comblement), elle est copiée dans le planning à l'aide de la variable "l" définissant la ligne où coller les valeurs. Notre problème se situe dans le fait que cette variable "l" doit être remis à zéro lors de chaque changement de jour mais doit reprendre sa valeur lors du changement de pourcentage (boucle la plus externe), afin de ne pas reprendre des numéros de ligne déjà comblés précédemment lors d'une boucle avec un pourcentage plus élevé.

    Je ne sais pas si j'ai été très clair, du moins je l'espère

    Je remet le code de la macro

    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
    Sub Urgence3()
     
    Dim u As Integer 'ligne pour le degré d'urgence
    Dim j As Integer 'jour du planning
    Dim c As Integer 'permet de donner la colonne de déplacement
    Dim l As Integer 'donne la ligne où déplacer
    Dim p As Single 'coef de correspondance
     
     
     
     
    For p = 1 To 0 Step -0.1 'boucle proba
     
     
        For j = 1 To 12 'boucle jours
           l = 7
     
            For u = 2 To 101 'boucle tâches
            c = 3 * j + 11
     
     
                    If Worksheets("Planning").Cells(u, 6).Value = 3 And Worksheets("Planning").Cells(u, 5).Value <= Worksheets("hid_pla").Cells(4, c + 1).Value And Worksheets("Planning").Cells(u, 5).Value >= Worksheets("hid_pla").Cells(4, c + 1).Value * p And Worksheets("Planning").Cells(u, 7).Value = "" Then
                    'si l'urgence est à 3 et que la valeur de sa charge est inférieur à la charge disponible du jour j et supérieur à 0,9 et que absence de plannification
     
                    If Worksheets("Planning").Cells("", 6).Value = 3 And Worksheets("Planning").Cells("", 7).Value <> "" Then
     
                    Worksheets("Planning").Cells(u, 7).Value = j
                    Worksheets("Planning").Cells(u, 8).Value = l
     
                    'déplacement des valeurs id, charge et degré urgence
                    Worksheets("Planning").Cells(l, c).Value = Worksheets("Planning").Cells(u, 3).Value
                    Worksheets("Planning").Cells(l, c + 1).Value = Worksheets("Planning").Cells(u, 5).Value
                    Worksheets("Planning").Cells(l, c + 2).Value = Worksheets("Planning").Cells(u, 6).Value
     
                    l = l + 1
     
                    End If
     
                Next 'u
     
            Next 'j
     
        Next 'p
     
     
     
    End Sub
    Donc si l'un d'entre vous à une idée pour résoudre notre problème

    Merci d'avance

  7. #7
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je vois grosso modo ce que tu veux dire, mais en l'état ta procédure est trop abstraite pour la traiter en aveugle

    sans une description exacte de la configuration (voir un classeur exemple), je peux juste te proposer d'utiliser une variable supplémentaire (appelons la k) qui prendra :

    - la valeur de l juste avant le changement du premier jour : k = l
    - pour les changements de jours suivants : k = k + l

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    La création du nouvelle variable "k" qui s'incrémenterai de 1 à chaque tour ne ferait que déplacer mon problème.

    Je pense avoir trouver la solution mais je n'arrive pas à la mettre en place
    Je veut créer une variable "derniereligne" qui me donne donc la dernière ligne pleine de mon tableau pour chaque jour. Mais je n'arrive pas à transcrire ca en code VBA ... Etant débutant dans le domaine, j'ai du mal entre Range et Cell.

    J'ai essayé les deux codes suivants

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    j = 3 'jours du planning'
     
    c = 3 * j + 11 'colonne correspondante où il faut chercher la dernière ligne
     
    DerniereLigne = Range(c & Rows.Count).End(xlUp).Row + 1
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    j = 3 'jours du planning'
     
    c = 3 * j + 11 'colonne correspondante où il faut chercher la dernière ligne
     
    DerniereLigne = Cells(1,c).End(xlDown).Row
    Si vous avez une idée

  9. #9
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    derniereligne = Cells(Rows.Count, c).End(xlUp).Row
    sans oublier d'indiquer la feuille où est situé la cellule

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci pour la réponse rapide

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

Discussions similaires

  1. problème de macros et format d'excel 2007 à 2010
    Par eleanor62200 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/06/2011, 16h31
  2. [XL-2003] Problème sauvegarde macro version excel
    Par cyberboy00 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/04/2011, 11h33
  3. [Toutes versions] Problème avec macro Excel pour ouvrir Word
    Par lenul78570 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/03/2010, 16h25
  4. [EXCEL - VBA] Problème ouverture fichier suite Macro Userform
    Par Guidhy dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/04/2007, 09h18

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