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 :

VBA Gestion d'une sélection multiple [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    BI
    Inscrit en
    Mars 2019
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : BI

    Informations forums :
    Inscription : Mars 2019
    Messages : 30
    Points : 28
    Points
    28
    Par défaut VBA Gestion d'une sélection multiple
    Bonjour le forum,

    Je fais suite à la conversation "VBA problème avec le Worksheet change" sur un projet d'outil pour faire des devis et gérer des prix.

    Donc sur la base du prix existant en colonne F je veux :

    -Soit calculer mon taux de discount en L si un nouveau prix est saisi en K
    -Soit calculer mon nouveau prix en K si un discount est saisi en L

    Exemple de mon tableau avec des data bidonnées :

    Nom : Capture.PNG
Affichages : 499
Taille : 19,5 Ko

    Avec ce code (ne riez pas je suis débutant en VBA) j'y arrive :

    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
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim AD As String
    AD = Target.Address
    TG = Target.Column
     
     
                Select Case TG
                    'L'utilsateur saisi un discount
                    Case Is = 12
                    Application.EnableEvents = False
                        If IsEmpty(Range(AD).Value) = True Then 'Si il efface la valeur
                        Range(AD).Offset(0, -1).FormulaR1C1 = ""
                        Else
                        Range(AD).Offset(0, -1).FormulaR1C1 = "=RC[-5]*(1-RC[1])"
                        End If
                    Application.EnableEvents = True
     
                    'L'utilsateur saisi un nouveau prix
                    Case Is = 11
                    Application.EnableEvents = False
     
                        If IsEmpty(Range(AD).Value) = True Then 'Si il efface la valeur
                        Range(AD).Offset(0, 1).FormulaR1C1 = ""
                        Else
                        Range(AD).Offset(0, 1).FormulaR1C1 = "=(RC[-6]-RC[-1])/RC[-6]"
                        End If
                    Application.EnableEvents = True
     
                End Select
     
    End Sub
    Mais le problème c'est que si l'utilisateur sélectionne plusieurs cellules, par exemple pour effacer des saisies précédente, ça ne marche plus. Pareil si l'utilisateur copie/colle une liste de prix existant en ligne K.

    J'ai compris que ça ne marche pas à cause du fait que ce soit des plages de cellules qui sont modifiées au lieu de cellule. j'ai bricolé des trucs pour test mais rien ne marche.

    Auriez vous une piste ou une idée ?

    Merci d'avance

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    ben en fait tes pas loin
    au lieu de vouloir formuler ton target

    fait une boucle sur target.count

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    set case target.column
    case 11
    for each cel in target.count 
    'calcul 
    next 
    case 12
    for each cel in target.count 
    'calcul 
    next 
     
    end select
    si il y en a qu'une ben y en a qu'une
    ajoute quand meme un control sur le target.columns.count avant le select case tu peux avoir plussieur lignes mais qu'une colonne !!!!!!!!!!!!!!!!!!!
    voir même interdire la modification K:L en même temps au cas ou il y aurais une sub ou fonction qui viendrait foutre le boxon
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    BI
    Inscrit en
    Mars 2019
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : BI

    Informations forums :
    Inscription : Mars 2019
    Messages : 30
    Points : 28
    Points
    28
    Par défaut
    Merci beaucoup Patrick,

    J'ai rajouté la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each cel In Target.Count
    mais ça me génère une erreur de compilation "For Each ne peut itérer que sur un objet Collection ou un tableau"

    En fait Target.count ne donne que le nombre de cellules qui sont modifiées (1,2,4,65) donc il n'arrive pas à faire for each.

    J'ai modifié la solution avec Target à la place de Target.count et c'est mieux.

    Par contre j'ai l'impression que ce que le code ne comprends pas c'est quand l'utilisateur efface plusieurs new price par exemple. Donc si je selctionne des new prices et que je "suppr", la valeur de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IsEmpty(Range(AD).Value)
    est "faux" alors que si je sélectionne une seule valeur et que je "suppr" c'est = Vrai.

    Comment je pourrais faire pour que le code comprenne que je sélectionne plusieurs cellules et que je les "suppr" ?

    Code complet :

    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
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim AD As String
    AD = Target.Address
    TG = Target.Column
     
     
     
                Select Case TG
                    Case Is = 12
     
                    Application.EnableEvents = False
                    For Each cel In Target
     
                        If IsEmpty(Range(AD).Value) = True Then
                        Range(AD).Offset(0, -1).FormulaR1C1 = ""
                        Else
                        Range(AD).Offset(0, -1).FormulaR1C1 = "=RC[-5]*(1-RC[1])"
                        End If
     
                    Next
                    Application.EnableEvents = True
     
                    Case Is = 11
     
                    Application.EnableEvents = False
                    For Each cel In Target
     
                        If IsEmpty(Range(AD).Value) = True Then
                        Range(AD).Offset(0, 1).FormulaR1C1 = ""
                        Else
                        Range(AD).Offset(0, 1).FormulaR1C1 = "=(RC[-6]-RC[-1])/RC[-6]"
                        End If
     
                    Next
                    Application.EnableEvents = True
     
                End Select
     
    End Sub

    Merci

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    salut

    normalement celle ci met les formules ou pas sur toute les ligne de la target

    1 ligne si target est une seule cellules ou toutes les lignes si target est une plage de cellule
    c'est tout totomatic'
    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
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim cel As Range, TG As Long
        TG = Target.Column
     
        Application.EnableEvents = False
        Select Case TG
        Case Is = 12
            For Each cel In Target.Cells
                If IsEmpty(cel.Value) = True Then
                    cel.Offset(0, -1).FormulaR1C1 = ""
                Else
                    cel.Offset(0, -1).FormulaR1C1 = "=RC[-5]*(1-RC[1])"
                End If
            Next
        Case Is = 11
            For Each cel In Target.Cells
                If IsEmpty(cel.Value) = True Then
                    cel.Offset(0, 1).FormulaR1C1 = ""
                Else
                    cel.Offset(0, 1).FormulaR1C1 = "=(RC[-6]-RC[-1])/RC[-6]"
                End If
            Next
        End Select
        Application.EnableEvents = True
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    BI
    Inscrit en
    Mars 2019
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : BI

    Informations forums :
    Inscription : Mars 2019
    Messages : 30
    Points : 28
    Points
    28
    Par défaut
    Merci Patrick c'est génial,

    Je vais me servir de cette méthode pour d'autres problèmes que je rencontre dans ce projet.

    Bonne journée

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

Discussions similaires

  1. [XL-2007] Boucle pour une sélection multiple par nom sur un tableau croisé dynamique VBA
    Par kuro200 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/06/2015, 20h31
  2. [XL-2010] Connaitre les numéros des colonnes d'une sélection multiple en vba
    Par rob1son76 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/07/2014, 11h21
  3. Glisser/Déposer une sélection multiple
    Par mxh77 dans le forum 4D
    Réponses: 1
    Dernier message: 28/09/2006, 11h41
  4. Réponses: 2
    Dernier message: 24/08/2006, 11h33
  5. Réponses: 5
    Dernier message: 04/07/2006, 11h19

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