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 :

[Excel-2013] Souci avec la fonction "Decaler" dans une macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 66
    Par défaut [Excel-2013] Souci avec la fonction "Decaler" dans une macro
    Bonjour,

    Je vous écris concernant une erreur VBA que je rencontre, lors de la création par une macro d'une liste de choix déroulante.

    Explication :
    Je commence l'enregistrement de ma macro, je vais successivement dans :
    Données / validation des données /
    Dans l'onglet Options, j'autorise Liste, et dans la textbox Source, je met le code suivant :
    CODE: TOUT SÉLECTIONNER=DECALER(Analysis;EQUIV(D2&"";Analysis;0)-1;;NB.SI(Analysis;D2&""))

    La liste est bien créée, et est fonctionnelle.

    J'arrête l'enregistrement de ma macro, le code source suivant à été généré :

    CODE: TOUT SÉLECTIONNER
    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
    Sub Macro5()
    '
    ' Macro5 Macro
    '
     
    '
        With Selection.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=DECALER(Analysis;EQUIV(D2&"";Analysis;0)-1;;NB.SI(Analysis;D2&""))"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = False
        End With
    End Sub
    Sans rien changer au code généré par Excel, je sélectionne une autre cellule, et je lance ma macro.
    J'obtiens alors une belle erreur :
    Erreur d'exécution '1004':
    Erreur définie par l'application ou par l'objet


    Je clique sur "débogage", et la ligne en cause est la suivante :
    CODE: TOUT SÉLECTIONNER.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="=DECALER(Analysis;EQUIV(D2&"";Analysis;0)-1;;NB.SI(Analysis;D2&""))"

    Alors que ce code a lui même été généré par Excel !

    D'avance grand merci de votre aide

  2. #2
    Membre expérimenté
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 146
    Par défaut
    Salut,

    J'avoue que je ne comprends pas non plus... J'ai tordu ta macro dans tous les sens, y'a pas, le .Add ne passe pas...
    Ca ne parait pas être un souci de guillemets, ni de plage nommée (Analysis)

    En attendant, si tu as la possibilité d'avoir quelque part dans ta feuille ne serait-ce qu'une seule cellule dans laquelle tu peux mettre ta validation, tu peux toujours faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Selection.Validation.Delete
    MaCelluleModele.Copy
    Selection.PasteSpecial (xlPasteValidation)
    (en attendant mieux...)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 66
    Par défaut
    Super , grand merci

    Ca fonctionne

    cela étant, je suis toujours tout ouie si quelqu'un à la réponse

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 174
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Moi lorsque je fais référence à une plage de données dans l'outil Validation de données, j'utilise une plage nommée.
    A l'aide du Gestionnaire de noms, tu donnes un nom et dans la zone Fait référence à, tu places ta formule.
    La macro fonctionne alors sans problème
    Le nom que j'ai donné est TestDecaler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Selection.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:="=TestDecaler"
    End With
    Bonsoir,
    Citation Envoyé par rvaysse Voir le message
    cela étant, je suis toujours tout ouie si quelqu'un à la réponse
    J'ai enfin eu le temps de faire les tests et ce que je pressentais s'est vérifié. VBA est un programme qui utilise l'anglais et donc il y a lieu de traduire la formule que l'enregistreur a restitué tel quelle a été encodée.
    La procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim fx As String
    fx = "=OFFSET(Analysis,MATCH(D2 & <generic>,Analysis,0)-1,0,COUNTIF(Analysis,D2 & <generic>))"
    fx = Replace(fx, "<generic>", Chr(34) & "*" & Chr(34))
    With Selection.Validation
     .Delete
     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=fx ' "=TestDecaler"
    End With
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre expérimenté
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 146
    Par défaut
    Bien joué, Philippe
    (ça doit venir du prénom... )

    Juste une question : l'utilisation de <generic>, c'est pour rendre le code plus lisible ou c'est parce que le double cot pose problème ?

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 174
    Billets dans le blog
    53
    Par défaut
    Bonjour Phil'oche,
    Juste une question : l'utilisation de <generic>, c'est pour rendre le code plus lisible ou c'est parce que le double cot pose problème ?
    C'est à la fois par esthétisme, j'ai horreur de voir le double-quote, et je trouve que cela rend la phrase plus lisible donc je place des balises dans la chaîne de caractères. J'utilise la même technique quand dans une boucle la référence dans une formule prend une autre valeur.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Membre expérimenté
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 146
    Par défaut
    Bonjour et merci pour la réponse. C'est vrai que c'est une très bonne habitude, ça ne mange par de ressource et ça aère le code de façon prodigieuse !

    Pour en revenir à .Validation.Add, le souci est que le Formula1 doit en effet être passé en Formula (donc en version anglo-saxonne) et non en FormulaLocal (lié au paramètre local de langue...), or l'enregistreur de macro l'enregistre en paramètres locaux... donc en français !

    D'où une question subsidiaire : à partir d'une formule en FR, existe-t-il une fonction permettant de la convertir en formule US ?

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

Discussions similaires

  1. Appeler une fonction et fermer requete dans une macro
    Par camole88 dans le forum VBA Access
    Réponses: 1
    Dernier message: 19/11/2014, 15h54
  2. [Système] P'tit soucis avec la fonction EXEC
    Par nais_ dans le forum Langage
    Réponses: 9
    Dernier message: 23/08/2006, 11h36

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