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 :

Fonction Worksheet_Change: Erreur de Syntaxe [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Points : 8
    Points
    8
    Par défaut Fonction Worksheet_Change: Erreur de Syntaxe
    Bonjour,
    Par une macro je souhaite remplir des cellules automatiquement dés que d'autres sont saisient, ex: Si une cellule de la colonne "Listes" est remplie, je veux que dans la même ligne toutes les colonnes terminant par "..Type de champs" soient remplient automatiquement par "combobox".

    J'ai une fonction que je veux améliorer svp, Précisemment (.InsertLines 4):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub GenerateCode(SheetName As Variant)
    With ThisWorkbook.VBProject.VBComponents(SheetName).CodeModule
    .InsertLines 1, "Private Sub Worksheet_Change(ByVal Target As Range)"
    .InsertLines 2, "If Cells(1, Target.Column).Value Like ""Listes"" Then"
    .InsertLines 3, "Application.EnableEvents = False"
    .InsertLines 4, "Target.Offset(0, 3) = ""combobox"""
    .InsertLines 5, "Application.EnableEvents = True"
    .InsertLines 6, "End If"
    .InsertLines 7, "End Sub"
    End With
    End Sub
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .InsertLines 4, ".Cells(1,Target.Column).Value Like "*" & "Type de Champs" = ""combobox"""
    Mais j'ai erreur de Syntax! Help !

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Bonsoir,

    je suis étonné par ton code donc la fonctionnalité n'est pas celle que tu décris ...

    est-tu sur de vouloir "écrire un code qui écrit du code " ?

  3. #3
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir.

    Tu veux obtenir quoi sur cette ligne ?

    Cordialement

    PGZ

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Désolée, je n'ai pas bien détaillé ma question,

    Parmis les colonnes de mes feuilles: j'ai MINIMUM, MAXIMUM, Multiple, Format de Date, champs1 Type de champ, champs2 Type de champ, champs1 Optionel ou Requis, champs2 Optionel ou Requis ...
    Quand je tape 0 dans MINIMUM, "champs1 Optionel ou Requis", "champs2 Optionel ou Requis" doit avoir Optionel,
    Quand je tape 1 dans MINIMUM, "champs1 Optionel ou Requis", "champs2 Optionel ou Requis" doit avoir Requis,

    J'ai crée la fonction mais ça ne marche pas comme je veux, par exemple quand je tape 0 dans la ligne 1 et je mets le curseur dans la ligne 2, j'ai Optionel qui s'affiche mais dans la ligne 2 et non pas 1.
    Des fois même ça n'affiche pas la bonne valeur, soit Optionel soit Requis !
    Quand je vide la cellule, les valeurs générées ne se suppriment pas.

    Voici ma fonction:

    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
    Private Sub CreerCode(ShName As Variant)
        With ThisWorkbook.VBProject.VBComponents(ShName).CodeModule  
            .InsertLines 1, "Private Sub Worksheet_Change(ByVal Target As Range)"
            .InsertLines 2, "Dim ws As Worksheet"
            .InsertLines 3, "Dim Col As Integer"
            .InsertLines 4, "Dim cel As String"
            .InsertLines 5, "Set ws = Worksheets(ActiveSheet.Name)"
            .InsertLines 26, "If Cells(1, Target.Column).Value Like ""MINIMUM"" Then"
              .InsertLines 27, "If ActiveCell.value=0 Then"
                .InsertLines 28, "Application.EnableEvents = False"
                    .InsertLines 29, "For Col = 1 To Columns(Split(ws.UsedRange.Address, ""$"")(3)).Column"
                        .InsertLines 30, "cel = ws.Cells(1, Col)"
                        .InsertLines 31, "If cel Like ""*Optionel ou Requis"" Then"
                            .InsertLines 32, "ws.Cells(ActiveCell.row, Col).value = ""Optionel"""
                        .InsertLines 33, "End If"
                    .InsertLines 34, "Next"
                .InsertLines 35, "Application.EnableEvents = True"
    			.InsertLines 36, "ElseIf ActiveCell.value=1 Then"
    				.InsertLines 37, "Application.EnableEvents = False"
    					.InsertLines 38, "For Col = 1 To Columns(Split(ws.UsedRange.Address, ""$"")(3)).Column"
    						.InsertLines 39, "cel = ws.Cells(1, Col)"
    						.InsertLines 40, "If cel Like ""*Optionel ou Requis"" Then"
    							.InsertLines 41, "ws.Cells(ActiveCell.row, Col).value = ""Requis"""
    						.InsertLines 42, "End If"
    					.InsertLines 43, "Next"
    				.InsertLines 44, "Application.EnableEvents = True"
    			.InsertLines 45, "End If"
            .InsertLines 46, "End If" 
            .InsertLines 47, "End Sub"
        End With
    End Sub
    Pourriez vous me dire où ça pose problème?

  5. #5
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    bonsoir,

    pourquoi tu t’obstine à nous monter un code qui ne correspond pas à ta description de problème le code que tu nous montre ne modifie rien dans tes feuilles de calculs, il génère du code !!!

    s'il s'agit d'un problème dans tes feuilles de calculs montre nous le code généré (Worksheet_Change) et pas ce code intermédiaire, dont l’utilité reste à prouver ...

  6. #6
    Membre actif
    Formateur en informatique
    Inscrit en
    Janvier 2011
    Messages
    134
    Détails du profil
    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 134
    Points : 205
    Points
    205
    Par défaut
    Bonjour,

    Worksheet_Change(ByVal Target As Range) utilise Target pour indiquer la plage qui a été modifiée.

    C'est donc Target qu'il faut "étudier" (ligne 27 et autres) et non pas ActiveCell (car quand on saisie dans une cellule et qu'on fait Entrée, généralement la cellule d'en dessous devient la cellule active)

    Cordialement,

    Stéphane

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Bbil,
    Oui le code doit générer des valeurs, ça marche pour des listes déroulantes, mais pas quand on saisie nous même les valeurs (comme dans la fonction). Je connais pas grand chose en vba, c'est pour ça que ça bloque à ce niveau


    Stéphane,
    C'est bien la condition d'ActiveCell dont je me doutais, comment stp puis je utiliser Target à sa place?

    Merci

  8. #8
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par redhotchilipeppers Voir le message
    Bonjour,

    Bbil,
    Oui le code doit générer des valeurs, ça marche pour des listes déroulantes, mais pas quand on saisie nous même les valeurs (comme dans la fonction). Je connais pas grand chose en vba, c'est pour ça que ça bloque à ce niveau
    ..
    bonjour ,

    encore une fois ton code n'agit pas sur des listes déroulantes , ton code génère la sub Worksheet_Change !!

    pourquoi as tu besoin de générer du code ?

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    C'est pour remplir, autant que possible, et automatiquement des cellules.
    si on renseigne manuellement '0' dans une cellule "MINIMUM" par exemple, on veut qu'automatiquement 'Optionel' soit renseigné dans la case correspondante de "*Optionel ou Requis" ..ainsi de suite
    C'est une action Change, c'est pour ça normalement que j'ai pensé à l'integrer dans Worksheet_Change !

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    oui mais relis ton premier message pourquoi si tu as un problème dans workSheet_Change tu nous poste un code qui s'appelle creer_code ?

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    En fait, Worksheet_Change est integré dans la fonction creer_code que je lui fais appel dans une autre fonction qui lance la macro.
    Le truc est que je ne peux pas mettre Worksheet_Change directement dans les feuilles car les feuilles se génèrent aussi automatiquement par cette même Macro. De plus il y'a plusieurs fonctions et macros, et pour ne pas compliquer les choses je n'ai envoyé que la fonction en question.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Salut,

    Tu as l'événement Workbook_SheetChange qui est fait pour ça. Et si cela ne suffit pas parce que tu génère un classeur (Workbook), tu as l'événement Application_SheetChange qui est utilisable en créant une variable WithEvents.
    Private WithEvents ThisApplication As Excel.Application
    Dernière modification par AlainTech ; 23/11/2014 à 17h40. Motif: Suppression de la citation inutile

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Bonjour Nouveau2,
    J'ai testé en remplaçant Worksheet_Change par Workbook_SheetChange et par Application_SheetChange, mais je n'ai plus rien qui se génère, à mon avis, c'est le corps de la fonction qui pose problème, ça se génère chez moi, mais pas toujours avec la bonne valeur ou le bon emplacement.
    Je doute de l'expression : ActiveCell.Value=1 , y'a t-il peut être un alternatif?

    Est ce que quelqu'un peut m'aider SVP à trouver une solution?

  14. #14
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par redhotchilipeppers Voir le message
    ..

    Est ce que quelqu'un peut m'aider SVP à trouver une solution?
    bonjour, je t'aurais bien aidé mais tu n'as toujours pas posté (entre balise de [Code]) le code Worksheet_Change qui te pose problème ..! !! le seul code que tu as posté et qui permet d'écrire du code à l'air fonctionnel .!

    ensuite tu as Stef999 qui à fait l'effort de comprendre à quoi devrai ressembler ton code WorkSheet_Change et qui t'as donné une piste pour tes ActiveCell que tu n'as pas encore exploité !

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    se trouve dans ThisWorkbook.

    Tu peux donc vérifier la feuille (Sh) où le changement a été effecté.
    Et la cellule (Target) qui a été modifiée.

    Inscris ceci dans Thisworkbook et supprime ton appel à CreerCode

    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
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        Dim NoCol As Integer
        Dim cellHeader As String
     
        If Cells(1, Target.Column).Value Like "Listes" Then
            Application.EnableEvents = False
                For NoCol = 1 To Columns(Split(Sh.UsedRange.Address, "$")(3)).Column
                    cellHeader = Sh.Cells(1, NoCol)
                    If cellHeader Like "*Type de Champs" Then
                        Sh.Cells(Target.Row, NoCol).Value = "liste"
                    End If
                Next
            Application.EnableEvents = True
        End If
     
        If Cells(1, Target.Column).Value Like "*Date*" Then
            Application.EnableEvents = False
                For NoCol = 1 To Columns(Split(Sh.UsedRange.Address, "$")(3)).Column
                    cellHeader = Sh.Cells(1, NoCol)
                    If cellHeader Like "*Field Type" Then
                        Sh.Cells(Target.Row, NoCol).Value = "Date"
                    End If
                Next
            Application.EnableEvents = True
        End If
     
        If Cells(1, Target.Column).Value Like "Minimum" Then
            If Target.Value = 0 Then
                Application.EnableEvents = False
                For NoCol = 1 To Columns(Split(Sh.UsedRange.Address, "$")(3)).Column
                    cellHeader = Sh.Cells(1, NoCol)
                    If cellHeader Like "*Optionel ou Requis" Then
                        Sh.Cells(Target.Row, NoCol).Value = "Optionel"
                    End If
                Next
                Application.EnableEvents = True
            ElseIf Target.Value = 1 Then
                Application.EnableEvents = False
                For NoCol = 1 To Columns(Split(Sh.UsedRange.Address, "$")(3)).Column
                    cellHeader = Sh.Cells(1, NoCol)
                    If cellHeader Like "*Optionel ou Requis" Then
                        Sh.Cells(Target.Row, NoCol).Value = "Requis"
                    End If
                Next
                Application.EnableEvents = True
            End If
        End If
    End Sub

  16. #16
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Youpiii ça marche finalement, je ne savais pas à quoi servait ThisWorkbook, ni où poser le code de la fonction Workbook_SheetChange, je dormirai moins bete aujourd'hui grace à toi.

    Merci beaucoup Parmi

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

Discussions similaires

  1. [Vxi3] Fonction @prompt erreur de syntaxe
    Par DamienBC dans le forum Designer
    Réponses: 1
    Dernier message: 16/02/2014, 19h37
  2. [AC-2010] Créer une fonction VBA, erreur de syntaxe
    Par aurelien76 dans le forum VBA Access
    Réponses: 6
    Dernier message: 08/06/2013, 12h03
  3. Fonction DSum Erreur de Syntaxe
    Par othke dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 06/03/2010, 08h38
  4. Erreur de syntaxe sur fonction
    Par diableblanc dans le forum Informix
    Réponses: 2
    Dernier message: 06/05/2008, 17h04
  5. fonction checkTest : erreur de syntaxe
    Par MmoulinexX dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 14/06/2006, 10h29

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