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 :

Petite question VBA : fonction worksheet_change


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Par défaut Petite question VBA : fonction worksheet_change
    Bonjour,

    Je ne maitrise pas beaucoup le VBA et j'ai ce fichier ci-joint,

    Dans la cellule B2, j'ai une liste qui s'affiche suivant les premières lettres que je tape (ex :al, liste albert). Si le prénom n'existe pas dans la liste, j'ai une fonction worksheet-change qui me propose de l'ajouter à ma liste de prénom sur la feuille2. Pas de pb.

    Par contre sur la cellule B3, la liste fonctionne aussi mais pas la fonction worksheet. Ainsi je ne peux ajouter le prénom tapé dans cette cellule s'il n'existe pas dans ma liste de référence.

    j'ai essayé de recopier le language dans l'éditeur en mettant ceci mais ca ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Worksheet_Change(ByVal Target As Range)
     If Target.Address = "$B$2" And Target <> "" Then
       If IsError(Application.Match(Target.Value, [noms], 0)) Then
         If MsgBox("On ajoute?", vbYesNo) = vbYes Then
           [noms].End(xlDown).Offset(1, 0) = Target.Value
           Sheets("Feuil2").[noms].Sort key1:=Sheets("Feuil2").Range("A2")
        Else
           Application.Undo
         End If
        End If
      End If
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Worksheet_Change(ByVal Target As Range)
     If Target.Address = "$B$3" And Target <> "" Then
       If IsError(Application.Match(Target.Value, [noms], 0)) Then
         If MsgBox("On ajoute?", vbYesNo) = vbYes Then
           [noms].End(xlDown).Offset(1, 0) = Target.Value
           Sheets("Feuil2").[noms].Sort key1:=Sheets("Feuil2").Range("A2")
        Else
           Application.Undo
         End If
        End If
      End If
    End Sub
    Si quelqu'un pouvait m'aider ce serait super.

    D'ailleurs si vous connaissez un bon site pour apprendre le VBA je suis preneur.

    Merci beaucoup d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 674
    Par défaut
    Bonjour Airone784,
    bienvenue sur DVP
    en plus du présent forum, de nombreuses ressources sont à ta disposition :
    - une http://excel.developpez.com/faq
    - des tutoriaux http://exceldeveloppez.com/cours
    - des critiques de livres http://excel.developpez.com/livres

    Ici, je te recommande un peu de lectures,
    toutes disponibles sur http://office.developpez.com/cours/

    Si certains éléments te paraissent encore complexes, n'hésite pas à nous poser des questions.

    Bon courage
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    791
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 791
    Par défaut
    Je ne suis pas une spécialiste, mais il me semblait avoir compris qu'on ne peut mettre qu'une fois chaque type de modification ( Worksheet_Change )

    On peut par exemple tester si le target fait partie de la plage B2:B9 (au lieu de tester si c'est la cellule B2) (et pour tester ca, on fait l'intercection entre la page sectionnée et la plage jaune, si elle dedans, il y a quelque chose dans l'intercection, sinon c'est vide)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Change(ByVal Target As Range)
    Set Intersection = Application.Intersect(Target, Range("$B$2:$B$9"))
    If Not (Intersection Is Nothing) And Target <> "" Then
       If IsError(Application.Match(Target.Value, [noms], 0)) Then
         If MsgBox("On ajoute?", vbYesNo) = vbYes Then
           [noms].End(xlDown).Offset(1, 0) = Target.Value
           Sheets("Feuil2").[noms].Sort key1:=Sheets("Feuil2").Range("A2")
        Else
           Application.Undo
         End If
        End If
      End If
    End Sub

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Emmanuelle, tu avais très bien compris...

    Il ne peut y avoir qu'une procédure événementielle par événement...

    C'est à l'intérieur de la procédure que l'on testera les différents cas, soit comme tu le proposes avec Intersect, mais aussi en utilisant toutes les finesses de VB (If...End If, Select Case...End Select, Do...Loop, ...)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Par défaut
    Merci Emmanuelle,

    seul petit hic me concernant c'est que dans l'exemple la plage target est bien B2:B9 mais dans une autre feuille ou j'ai besoin d'utiliser le meme principe mais cellule sont séparées. A savoir ma liste de donnée est en B4, B6 et B8. Et là ton code ne fonctionne pas. J'ai essayé ainsi mais ca marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Change(ByVal Target As Range)
    Set Intersection = Application.Intersect(Target, Range("$B$2;$B$9"))
    If Not (Intersection Is Nothing) And Target <> "" Then
       If IsError(Application.Match(Target.Value, [noms], 0)) Then
         If MsgBox("On ajoute?", vbYesNo) = vbYes Then
           [noms].End(xlDown).Offset(1, 0) = Target.Value
           Sheets("Feuil2").[noms].Sort key1:=Sheets("Feuil2").Range("A2")
        Else
           Application.Undo
         End If
        End If
      End If
    End Sub
    Que faire stp???

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Par défaut
    Ahhh j'ai ajouté une virgule ca doit marcher je crois...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Change(ByVal Target As Range)
    Set Intersection = Application.Intersect(Target, Range("$B$2,$B$9"))
    If Not (Intersection Is Nothing) And Target <> "" Then
       If IsError(Application.Match(Target.Value, [noms], 0)) Then
         If MsgBox("On ajoute?", vbYesNo) = vbYes Then
           [noms].End(xlDown).Offset(1, 0) = Target.Value
           Sheets("Feuil2").[noms].Sort key1:=Sheets("Feuil2").Range("A2")
        Else
           Application.Undo
         End If
        End If
      End If
    End Sub

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut Airone784 et le forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Intersection  As Range
    Set Intersection = Intersect(Target, Union([B4], [B6], [B8]))
    If Not (Intersection Is Nothing) Then MsgBox Intersection.Address(0, 0)
    End Sub
    on n'aura un boite donnant l'adresse des cellules sélectionnées que si c'est une des trois (même en cas de multisélection=
    A+

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Par défaut
    Bonjour à tous et merci à Gorfael pour tout coup de main,

    J'ai un petit souci avec 2 code.
    J'ai d'abord ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Change(ByVal Target As Range)
    Set Intersection = Application.Intersect(Target, Range("$G$3,$G$4,$G$5"))
    If Not (Intersection Is Nothing) And Target <> "" Then
       If IsError(Application.Match(Target.Value, [Produits], 0)) Then
         If MsgBox("On ajoute?", vbYesNo, "Essai") = vbYes Then
           [Produits].End(xlDown).Offset(1, 0) = Target.Value
           Sheets("Base_de_données").[Produits].Sort key1:=Sheets("Base_de_données").Range("C1")
        Else
           Application.Undo
         End If
        End If
      End If
    End Sub
    Une fois que j'ai rempli mais cellule g3, g4, g5 je clique sur un bouton lançant cette macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Effacer_saisie()
    '
    ' Effacer_saisie Macro
    ' Macro enregistrée le 18/05/2007 par Airone
    '
     
    '
     
        Range("E3:H3,J3:K3,E4:H5,J4:J5,A3:B3,A4:D5").Select
        Range("A4").Activate
        Selection.ClearContents
        Range("A3").Select
    End Sub
    Seul pb, j'ai un message m'indiquant : erreur d'éxecution 13 : incompatibilité de type.

    Et lorsque je lance le debogage, est souligné en jaune la ligne : If Not (Intersection Is Nothing) And Target <> "" Then

    Que se passe-t-il???

    Merci de votre aide

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut Airone784 et le forum
    M'obligeant à déclarer mes variables, je me suis cantonné à la question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_Change(ByVal Target As Range)
    Set Intersection = Intersect(Target, Range("G3,G4,G5"))
    If Not (Intersection Is Nothing) And Target <> "" Then
    '.....
    End If
    End Sub
    erreur d'éxecution 13 : incompatibilité de type
    n'apparaît que lorsque je fais du copier/coller (ou effacement) sur plus d'une cellule, ce qui est normal avec la partie du test target="" alors que target est un range d'au moins 2 cellules, donc dans ce cas, Excel ne considère plus le contenu (.value par défaut) mais les cellules.
    Il faut mettre un discriminateur de cellule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_Change(ByVal Target As Range)
    dim Cel as range, Intersection as range 
    Set Intersection = Intersect(Target, Range("G3,G4,G5"))
    If Intersection Is Nothing then exit sub
    for each Cel in Intersection
         if cel <> "" Then
              '.....
         End If
    next cel
    End Sub
    par exemple. Le code n'a pas été testé : il est simple et ne devrait pas poser problème si on remplace target par Cel (dans la partie non mentionnée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Effacer_saisie()
    Range("E3:H3,J3:K3,E4:H5,J4:J5,A3:B3,A4:D5").ClearContents
    Range("A3").Select
    End Sub
    Il faut être le plus concis possible : ne pas utiliser de Select et Activate sauf si c'est nécessaire.
    Bien que ce ne soit aucunement nécessaire, je mets toujours la variable de boucle derrière le Next, pour m'y retrouver en cas d'imbrication.
    A+

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 20
    Par défaut
    Merci Gorfael, je vais essayer tout ça!!! Super sympa en tout cas et bien calé, j'aimerai en savoir autant!!!

Discussions similaires

  1. Petite question sur les return de fonction
    Par gueulederack dans le forum VB.NET
    Réponses: 5
    Dernier message: 04/11/2011, 18h56
  2. Petite question sur le typage des fonctions
    Par Dim Me As New Idiot dans le forum F#
    Réponses: 4
    Dernier message: 13/07/2010, 11h41
  3. Petite question fonction Format
    Par Geoffroy123 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 12/02/2009, 12h44
  4. Petite question sur les fonctions
    Par acacia dans le forum Mathématiques
    Réponses: 6
    Dernier message: 06/02/2009, 18h52
  5. [VBA][Excel]Petite question bête !
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/09/2005, 16h36

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