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 :

Problème Target Débogage | SelectionChange() trop lourd


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Apprenti
    Inscrit en
    Février 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2012
    Messages : 49
    Par défaut Problème Target Débogage | SelectionChange() trop lourd
    Bonjour,

    Je ne comprends pas une chose, avec target :

    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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
        For Each Target In Range("M2:M200")
     
            For i = 5 To 260
     
                If Target.Value = i - 5 Then
     
                    Target.Offset(0, 2).Interior.Color = RGB(Sheets("ConvertIndRGB").Cells(i, 2).Value, Sheets("ConvertIndRGB").Cells(i, 3).Value, Sheets("ConvertIndRGB").Cells(i, 4).Value)
                End If
            Next i
     
            Target.Offset(0, 1) = ConvCo(Target.Value)
        Next
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        For Each Target In Range("Q2:Q200")
     
            If Target.Value = "" Then
     
                Target.Value = " "
            End If
        Next
    End Sub
    Si je sélectionne une "S2" par exemple, je ne devrai pas rentrai dans le for each, si ? car c'est le cas au débogage.

    Autre question, Pour le Target dans selection_change, les cellule prise en comptent sont les cellules sélectionnées juste avant le changement, j'imagine ? mais en débogage, pour arrêter le code il faut changer de cellule et du coup Target change, et pour le Pas à Pas, ça fausse tout. car mon code marche normalement mais pas en débogage.

    Autre chose,
    Ce code et lourd du fait de la fonction ConvCo()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function ConvCo(ByRef aci As Integer)
     
        For i = 5 To 260
            If aci = Sheets("ConvertIndRGB").Cells(i, 1).Value Then
                ConvCo = Sheets("ConvertIndRGB").Cells(i, 2).Value & "," & Sheets("ConvertIndRGB").Cells(i, 3).Value & "," & Sheets("ConvertIndRGB").Cells(i, 4).Value
            End If
        Next i
    End Function
    et il prend 1 à 2 sec à chaque SelectionChange, donc je sais pas comment amélioré ça. j'ai mis la procédure principale dans Worksheet_Change(ByVal Target As Range) mais la procédure mais un temps infinie.

    Voila je suis un peu dans le flou, je pense que mon code est mal construit mais je c'est pas quoi y faire.

    Une derniere,

    j'ai une cellule variable de type "255,0,255" sans guillemet
    et dans mon 1er code j'ai la fonction RGB( ) comment les mettre en relation car RGB prend 3 variable et mon pas une.

    Cette dernier question pourrai tout simplifier il me semble .
    -----------------------------------------------------------

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonsoir,

    Si je sélectionne une "S2" par exemple, je ne devrais pas rentrer dans le for each, si ?
    Si. Le for each va parcourir toutes les cellules range de "M2:M200".
    voir cours VBA pour Excel page 50.

    Ce qu'il te faut, si tu souhaites mettre une condition lorsqu'il y a recouvrement entre un range et un autre range c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    '...
       If Not(Intersect(Range("M2:M200"),Target) Is Nothing) then
             'si Target est dans la plage "M2:M200"
       End If
    '...
    Sub End
    voir cours VBA pour Excel page 127.

    Pour le Target dans selection_change, les cellules prisent en compte sont les cellules sélectionnées juste avant le changement
    Oui, et effectivement il faut faire attention en debugage au sélection en cours de pas à pas.
    Mais dans ton cas, je crois que tu souhaites réagir au changement de valeur,
    (plutôt qu'à un changement de zone sélectionnée).
    Dans ce cas utilise plutôt Private Sub Worksheet_Change(ByVal Target As Range)
    j'ai une cellule variable de type "255,0,255" sans guillemet
    et dans mon 1er code j'ai la fonction RGB( ) comment les mettre en relation car RGB prend 3 variable
    La fonction Split(<chaine de caractère>;<séparateur>) devrait résoudre ce problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim cols() as String
    cols = Split("255,0,255",",")  ' cols(0) = 255 , cols(1) = 0, cols(2) = 255
    La fonction ConvCo ne semble rien retourner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Function ConvCo(ByRef aci As Integer) as String ???

  3. #3
    Membre averti
    Homme Profil pro
    Apprenti
    Inscrit en
    Février 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2012
    Messages : 49
    Par défaut
    Wa merci pour tout ces éclaircissements. j'ai essai tout ça lundi merci beaucoup.

    mais pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    Function ConvCo(ByRef aci As Integer)
     
        For i = 5 To 260
            If aci = Sheets("ConvertIndRGB").Cells(i, 1).Value Then
                ConvCo = Sheets("ConvertIndRGB").Cells(i, 2).Value & "," & Sheets("ConvertIndRGB").Cells(i, 3).Value & "," & Sheets("ConvertIndRGB").Cells(i, 4).Value
            End If
        Next i
    End Function
    effectivement depuis le message j'ai ajouté un as string, mais je pensé que si on ne mettait rien ça renvoyé en integer, non ?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonsoir,

    mais je pensé que si on ne mettait rien ça renvoyé en integer, non ?
    Je n'ai vu aucune doc qui indiquait le format retourné par défaut si on ne précisait pas
    le type retourné.
    Mais ce qui est sûr, c'est que ce n'est pas un integer, sinon la ligne suivante
    de ton code remonterait une exception.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ConvCo = Sheets("ConvertIndRGB").Cells(i, 2).Value & "," & Sheets("ConvertIndRGB").Cells(i, 3).Value & "," & Sheets("ConvertIndRGB").Cells(i, 4).Value
    Personnellement je pencherais plutôt pour le type Variant pour le retour par défaut des fonctions ,
    un peu comme les variables non déclarée.

  5. #5
    Membre averti
    Homme Profil pro
    Apprenti
    Inscrit en
    Février 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2012
    Messages : 49
    Par défaut
    Merci, j'ai tout modifié ça fonctionne très bien

    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim couleur() As String
        If Not (Intersect(Range("M2:M200"), Target) Is Nothing) Then
            For Each Target In Range("M2:M200")
                Target.Offset(0, 1).Value = ConvCo(Target.Value)
                couleur() = Split(Target.Offset(0, 1).Value, ",")
                Target.Offset(0, 2).Interior.Color = RGB(couleur(0), couleur(1), couleur(2))
            Next
        End If
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        For Each Target In Range("Q2:Q200")
            If Target.Value = "" Then
                Target.Value = " "
            End If
        Next
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function ConvCo(ByRef aci As Integer) As String
        For i = 5 To 260
            If aci = Sheets("ConvertIndRGB").Cells(i, 1).Value Then
                ConvCo = Sheets("ConvertIndRGB").Cells(i, 2).Value & "," & Sheets("ConvertIndRGB").Cells(i, 3).Value & "," & Sheets("ConvertIndRGB").Cells(i, 4).Value
            End If
        Next i
    End Function
    Le déroulement du programme est encore un peu long (1 sec) mais le pc que j'ai au travail n'est pas exceptionnel, XP, 2GHz, 3 Go RAM.

    Merci pour tout.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonjour,

    S'il n'y a pas de dépendance entre lignes via des formules :
    - la boucle ligne 4 For Each Target In Range("M2:M200") est inutile.
    - la boucle ligne 11 For Each Target In Range("Q2:Q200") est inutile également.

    Plutôt que de faire le traitement sur toute la colonne à chaque changement de valeur, le plus simple est d'initialiser le classeur à l'ouverture :

    En plaçant ce code dans "ThisWorkbook" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_Open()
        Call Worksheets("Feuil1").Init  '"Feuil1" étant la feuille contenant les plages M2:200 et Q2:Q200
    End Sub

    Dans le code de la feuille concernée (exemple : "Feuil1"):

    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
    Public Sub Init()
        Dim Target As Range
     
        For Each Target In Range("M2:M200")
            Target.Offset(0, 1).Value = ConvCo(Target.Value)
            couleur() = Split(Target.Offset(0, 1).Value, ",")
            Target.Offset(0, 2).Interior.Color = RGB(couleur(0), couleur(1), couleur(2))
        Next
     
        Application.EnableEvents = False
        For Each Target In Range("Q2:Q200")
            If Target.Value = "" Then
                Target.Value = " "
            End If
        Next
       Application.EnableEvents = True
    End Sub
     
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim couleur() As String
        If Not (Intersect(Range("M2:M200"), Target) Is Nothing) Then
                Target.Offset(0, 1).Value = ConvCo(Target.Value)
                couleur() = Split(Target.Offset(0, 1).Value, ",")
                Target.Offset(0, 2).Interior.Color = RGB(couleur(0), couleur(1), couleur(2))
        End If
     
        If Not (Intersect(Range("Q2:Q200"), Target) Is Nothing) Then
            If Target.Value = "" Then
                Target.Value = " "
            End If
        End If
    End Sub
     
    Function ConvCo(ByRef aci As Integer) As String()
        With Sheets("ConvertIndRGB")
            For i = 5 To 260
                If aci = .Cells(i, 1).Value Then
                    ConvCo = .Cells(i, 2).Value & "," & .Cells(i, 3).Value & "," & .Cells(i, 4).Value
                    Exit For
                End If
            Next i
        End With
    End Function

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

Discussions similaires

  1. Problème d'écriture trop lourd
    Par UDSP50 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/01/2012, 14h43
  2. base trop lourde
    Par marie49 dans le forum Access
    Réponses: 7
    Dernier message: 26/12/2005, 02h40
  3. variable de session trop lourde ???
    Par LE NEINDRE dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 11/10/2005, 14h34
  4. [CGI] variable de session trop lourde ????
    Par LE NEINDRE dans le forum Web
    Réponses: 2
    Dernier message: 07/10/2005, 09h12
  5. Réponses: 11
    Dernier message: 22/03/2005, 01h04

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